summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/objint.c7
-rw-r--r--py/objint.h1
-rw-r--r--py/objint_longlong.c41
-rw-r--r--tests/basics/int-long.py39
4 files changed, 84 insertions, 4 deletions
diff --git a/py/objint.c b/py/objint.c
index 1305f1900e..1a04408afd 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -52,6 +52,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);
return mp_const_none;
@@ -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)