Skip to content

Commit 9b00dad

Browse files
committed
long int: Implement more operations.
1 parent ddf1aa9 commit 9b00dad

4 files changed

Lines changed: 84 additions & 4 deletions

File tree

py/objint.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj
5151
}
5252
}
5353

54+
// This is called only for non-SMALL_INT
55+
mp_obj_t int_unary_op(int op, mp_obj_t o_in) {
56+
assert(0);
57+
return mp_const_none;
58+
}
59+
5460
// This is called only for non-SMALL_INT
5561
mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
5662
assert(0);
@@ -96,5 +102,6 @@ const mp_obj_type_t int_type = {
96102
"int",
97103
.print = int_print,
98104
.make_new = int_make_new,
105+
.unary_op = int_unary_op,
99106
.binary_op = int_binary_op,
100107
};

py/objint.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ typedef struct _mp_obj_int_t {
66
} mp_obj_int_t;
77

88
void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind);
9+
mp_obj_t int_unary_op(int op, mp_obj_t o_in);
910
mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in);

py/objint_longlong.c

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj
3232
}
3333
}
3434

35+
mp_obj_t int_unary_op(int op, mp_obj_t o_in) {
36+
mp_obj_int_t *o = o_in;
37+
switch (op) {
38+
case RT_UNARY_OP_NOT: return MP_BOOL(o->val != 0); // TODO: implements RT_UNARY_OP_BOOL
39+
case RT_UNARY_OP_POSITIVE: return o_in;
40+
case RT_UNARY_OP_NEGATIVE: return mp_obj_new_int_from_ll(-o->val);
41+
case RT_UNARY_OP_INVERT: return mp_obj_new_int_from_ll(~o->val);
42+
default: return NULL; // op not supported
43+
}
44+
}
45+
3546
mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
3647
mp_obj_int_t *lhs = lhs_in;
3748
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) {
5061
return mp_obj_new_int_from_ll(lhs->val + rhs_val);
5162
case RT_BINARY_OP_SUBTRACT:
5263
return mp_obj_new_int_from_ll(lhs->val - rhs_val);
64+
case RT_BINARY_OP_MULTIPLY:
65+
return mp_obj_new_int_from_ll(lhs->val * rhs_val);
66+
case RT_BINARY_OP_FLOOR_DIVIDE:
67+
return mp_obj_new_int_from_ll(lhs->val / rhs_val);
68+
case RT_BINARY_OP_MODULO:
69+
return mp_obj_new_int_from_ll(lhs->val % rhs_val);
5370

5471
case RT_BINARY_OP_INPLACE_ADD:
55-
lhs->val += rhs_val;
56-
return lhs;
72+
lhs->val += rhs_val; return lhs;
5773
case RT_BINARY_OP_INPLACE_SUBTRACT:
58-
lhs->val -= rhs_val;
59-
return lhs;
74+
lhs->val -= rhs_val; return lhs;
75+
case RT_BINARY_OP_INPLACE_MULTIPLY:
76+
lhs->val *= rhs_val; return lhs;
77+
case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE:
78+
lhs->val /= rhs_val; return lhs;
79+
case RT_BINARY_OP_INPLACE_MODULO:
80+
lhs->val %= rhs_val; return lhs;
6081

6182
case RT_BINARY_OP_AND:
6283
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) {
6586
case RT_BINARY_OP_XOR:
6687
return mp_obj_new_int_from_ll(lhs->val ^ rhs_val);
6788

89+
case RT_BINARY_OP_INPLACE_AND:
90+
lhs->val &= rhs_val; return lhs;
91+
case RT_BINARY_OP_INPLACE_OR:
92+
lhs->val |= rhs_val; return lhs;
93+
case RT_BINARY_OP_INPLACE_XOR:
94+
lhs->val ^= rhs_val; return lhs;
95+
6896
case RT_BINARY_OP_LSHIFT:
6997
return mp_obj_new_int_from_ll(lhs->val << (int)rhs_val);
7098
case RT_BINARY_OP_RSHIFT:
7199
return mp_obj_new_int_from_ll(lhs->val >> (int)rhs_val);
72100

101+
case RT_BINARY_OP_INPLACE_LSHIFT:
102+
lhs->val <<= (int)rhs_val; return lhs;
103+
case RT_BINARY_OP_INPLACE_RSHIFT:
104+
lhs->val >>= (int)rhs_val; return lhs;
105+
73106
case RT_COMPARE_OP_LESS:
74107
return MP_BOOL(lhs->val < rhs_val);
75108
case RT_COMPARE_OP_MORE:

tests/basics/int-long.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# This tests long ints for 32-bit machine
2+
3+
a = 0x1ffffffff
4+
b = 0x100000000
5+
print(a)
6+
print(b)
7+
print(a + b)
8+
print(a - b)
9+
print(b - a)
10+
# overflows long long implementation
11+
#print(a * b)
12+
print(a // b)
13+
print(a % b)
14+
print(a & b)
15+
print(a | b)
16+
print(a ^ b)
17+
print(a << 3)
18+
print(a >> 1)
19+
20+
a += b
21+
print(a)
22+
a -= 123456
23+
print(a)
24+
a *= 257
25+
print(a)
26+
a //= 257
27+
print(a)
28+
a %= b
29+
print(a)
30+
a ^= b
31+
print(a)
32+
a |= b
33+
print(a)
34+
a &= b
35+
print(a)
36+
a <<= 5
37+
print(a)
38+
a >>= 1
39+
print(a)

0 commit comments

Comments
 (0)