diff --git a/py/objint.c b/py/objint.c index 1305f1900e..1a04408afd 100644 --- a/py/objint.c +++ b/py/objint.c @@ -51,6 +51,12 @@ void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj } } +// This is called only for non-SMALL_INT +mp_obj_t int_unary_op(int op, mp_obj_t o_in) { + assert(0); + return mp_const_none; +} + // This is called only for non-SMALL_INT mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { assert(0); @@ -96,5 +102,6 @@ const mp_obj_type_t int_type = { "int", .print = int_print, .make_new = int_make_new, + .unary_op = int_unary_op, .binary_op = int_binary_op, }; diff --git a/py/objint.h b/py/objint.h index 7d43971ec3..6662be1ef3 100644 --- a/py/objint.h +++ b/py/objint.h @@ -6,4 +6,5 @@ typedef struct _mp_obj_int_t { } mp_obj_int_t; void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind); +mp_obj_t int_unary_op(int op, mp_obj_t o_in); mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in); diff --git a/py/objint_longlong.c b/py/objint_longlong.c index 7eaee3bc9d..38a01837e1 100644 --- a/py/objint_longlong.c +++ b/py/objint_longlong.c @@ -32,6 +32,17 @@ void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj } } +mp_obj_t int_unary_op(int op, mp_obj_t o_in) { + mp_obj_int_t *o = o_in; + switch (op) { + case RT_UNARY_OP_NOT: return MP_BOOL(o->val != 0); // TODO: implements RT_UNARY_OP_BOOL + case RT_UNARY_OP_POSITIVE: return o_in; + case RT_UNARY_OP_NEGATIVE: return mp_obj_new_int_from_ll(-o->val); + case RT_UNARY_OP_INVERT: return mp_obj_new_int_from_ll(~o->val); + default: return NULL; // op not supported + } +} + mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { mp_obj_int_t *lhs = lhs_in; mp_obj_int_t *rhs = rhs_in; @@ -50,13 +61,23 @@ mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { return mp_obj_new_int_from_ll(lhs->val + rhs_val); case RT_BINARY_OP_SUBTRACT: return mp_obj_new_int_from_ll(lhs->val - rhs_val); + case RT_BINARY_OP_MULTIPLY: + return mp_obj_new_int_from_ll(lhs->val * rhs_val); + case RT_BINARY_OP_FLOOR_DIVIDE: + return mp_obj_new_int_from_ll(lhs->val / rhs_val); + case RT_BINARY_OP_MODULO: + return mp_obj_new_int_from_ll(lhs->val % rhs_val); case RT_BINARY_OP_INPLACE_ADD: - lhs->val += rhs_val; - return lhs; + lhs->val += rhs_val; return lhs; case RT_BINARY_OP_INPLACE_SUBTRACT: - lhs->val -= rhs_val; - return lhs; + lhs->val -= rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_MULTIPLY: + lhs->val *= rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: + lhs->val /= rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_MODULO: + lhs->val %= rhs_val; return lhs; case RT_BINARY_OP_AND: return mp_obj_new_int_from_ll(lhs->val & rhs_val); @@ -65,11 +86,23 @@ mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { case RT_BINARY_OP_XOR: return mp_obj_new_int_from_ll(lhs->val ^ rhs_val); + case RT_BINARY_OP_INPLACE_AND: + lhs->val &= rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_OR: + lhs->val |= rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_XOR: + lhs->val ^= rhs_val; return lhs; + case RT_BINARY_OP_LSHIFT: return mp_obj_new_int_from_ll(lhs->val << (int)rhs_val); case RT_BINARY_OP_RSHIFT: return mp_obj_new_int_from_ll(lhs->val >> (int)rhs_val); + case RT_BINARY_OP_INPLACE_LSHIFT: + lhs->val <<= (int)rhs_val; return lhs; + case RT_BINARY_OP_INPLACE_RSHIFT: + lhs->val >>= (int)rhs_val; return lhs; + case RT_COMPARE_OP_LESS: return MP_BOOL(lhs->val < rhs_val); case RT_COMPARE_OP_MORE: diff --git a/tests/basics/int-long.py b/tests/basics/int-long.py new file mode 100644 index 0000000000..f867d8037d --- /dev/null +++ b/tests/basics/int-long.py @@ -0,0 +1,39 @@ +# This tests long ints for 32-bit machine + +a = 0x1ffffffff +b = 0x100000000 +print(a) +print(b) +print(a + b) +print(a - b) +print(b - a) +# overflows long long implementation +#print(a * b) +print(a // b) +print(a % b) +print(a & b) +print(a | b) +print(a ^ b) +print(a << 3) +print(a >> 1) + +a += b +print(a) +a -= 123456 +print(a) +a *= 257 +print(a) +a //= 257 +print(a) +a %= b +print(a) +a ^= b +print(a) +a |= b +print(a) +a &= b +print(a) +a <<= 5 +print(a) +a >>= 1 +print(a)