Skip to content

Commit d02f6ea

Browse files
committed
py: Fix int-longlong binary operations.
1 parent 7f8be59 commit d02f6ea

1 file changed

Lines changed: 35 additions & 44 deletions

File tree

py/objint_longlong.c

Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,80 +41,71 @@ mp_obj_t int_unary_op(int op, mp_obj_t o_in) {
4141
}
4242

4343
mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
44-
mp_obj_int_t *lhs = lhs_in;
45-
mp_obj_int_t *rhs = rhs_in;
44+
long long lhs_val;
4645
long long rhs_val;
4746

48-
// TODO it can be that lhs is a small int (eg 1 + longlong)
49-
// TODO inplace operations should not modify the int!
47+
if (MP_OBJ_IS_SMALL_INT(lhs_in)) {
48+
lhs_val = MP_OBJ_SMALL_INT_VALUE(lhs_in);
49+
} else if (MP_OBJ_IS_TYPE(lhs_in, &int_type)) {
50+
lhs_val = ((mp_obj_int_t*)lhs_in)->val;
51+
} else {
52+
return MP_OBJ_NULL;
53+
}
5054

51-
if (MP_OBJ_IS_SMALL_INT(rhs)) {
52-
rhs_val = MP_OBJ_SMALL_INT_VALUE(rhs);
53-
} else if (MP_OBJ_IS_TYPE(rhs, &int_type)) {
54-
rhs_val = rhs->val;
55+
if (MP_OBJ_IS_SMALL_INT(rhs_in)) {
56+
rhs_val = MP_OBJ_SMALL_INT_VALUE(rhs_in);
57+
} else if (MP_OBJ_IS_TYPE(rhs_in, &int_type)) {
58+
rhs_val = ((mp_obj_int_t*)rhs_in)->val;
5559
} else {
5660
return MP_OBJ_NULL;
5761
}
5862

5963
switch (op) {
6064
case RT_BINARY_OP_ADD:
61-
return mp_obj_new_int_from_ll(lhs->val + rhs_val);
62-
case RT_BINARY_OP_SUBTRACT:
63-
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);
70-
7165
case RT_BINARY_OP_INPLACE_ADD:
72-
lhs->val += rhs_val; return lhs;
66+
return mp_obj_new_int_from_ll(lhs_val + rhs_val);
67+
case RT_BINARY_OP_SUBTRACT:
7368
case RT_BINARY_OP_INPLACE_SUBTRACT:
74-
lhs->val -= rhs_val; return lhs;
69+
return mp_obj_new_int_from_ll(lhs_val - rhs_val);
70+
case RT_BINARY_OP_MULTIPLY:
7571
case RT_BINARY_OP_INPLACE_MULTIPLY:
76-
lhs->val *= rhs_val; return lhs;
72+
return mp_obj_new_int_from_ll(lhs_val * rhs_val);
73+
case RT_BINARY_OP_FLOOR_DIVIDE:
7774
case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE:
78-
lhs->val /= rhs_val; return lhs;
75+
return mp_obj_new_int_from_ll(lhs_val / rhs_val);
76+
case RT_BINARY_OP_MODULO:
7977
case RT_BINARY_OP_INPLACE_MODULO:
80-
lhs->val %= rhs_val; return lhs;
78+
return mp_obj_new_int_from_ll(lhs_val % rhs_val);
8179

8280
case RT_BINARY_OP_AND:
83-
return mp_obj_new_int_from_ll(lhs->val & rhs_val);
84-
case RT_BINARY_OP_OR:
85-
return mp_obj_new_int_from_ll(lhs->val | rhs_val);
86-
case RT_BINARY_OP_XOR:
87-
return mp_obj_new_int_from_ll(lhs->val ^ rhs_val);
88-
8981
case RT_BINARY_OP_INPLACE_AND:
90-
lhs->val &= rhs_val; return lhs;
82+
return mp_obj_new_int_from_ll(lhs_val & rhs_val);
83+
case RT_BINARY_OP_OR:
9184
case RT_BINARY_OP_INPLACE_OR:
92-
lhs->val |= rhs_val; return lhs;
85+
return mp_obj_new_int_from_ll(lhs_val | rhs_val);
86+
case RT_BINARY_OP_XOR:
9387
case RT_BINARY_OP_INPLACE_XOR:
94-
lhs->val ^= rhs_val; return lhs;
88+
return mp_obj_new_int_from_ll(lhs_val ^ rhs_val);
9589

9690
case RT_BINARY_OP_LSHIFT:
97-
return mp_obj_new_int_from_ll(lhs->val << (int)rhs_val);
98-
case RT_BINARY_OP_RSHIFT:
99-
return mp_obj_new_int_from_ll(lhs->val >> (int)rhs_val);
100-
10191
case RT_BINARY_OP_INPLACE_LSHIFT:
102-
lhs->val <<= (int)rhs_val; return lhs;
92+
return mp_obj_new_int_from_ll(lhs_val << (int)rhs_val);
93+
case RT_BINARY_OP_RSHIFT:
10394
case RT_BINARY_OP_INPLACE_RSHIFT:
104-
lhs->val >>= (int)rhs_val; return lhs;
95+
return mp_obj_new_int_from_ll(lhs_val >> (int)rhs_val);
10596

10697
case RT_BINARY_OP_LESS:
107-
return MP_BOOL(lhs->val < rhs_val);
98+
return MP_BOOL(lhs_val < rhs_val);
10899
case RT_BINARY_OP_MORE:
109-
return MP_BOOL(lhs->val > rhs_val);
100+
return MP_BOOL(lhs_val > rhs_val);
110101
case RT_BINARY_OP_LESS_EQUAL:
111-
return MP_BOOL(lhs->val <= rhs_val);
102+
return MP_BOOL(lhs_val <= rhs_val);
112103
case RT_BINARY_OP_MORE_EQUAL:
113-
return MP_BOOL(lhs->val >= rhs_val);
104+
return MP_BOOL(lhs_val >= rhs_val);
114105
case RT_BINARY_OP_EQUAL:
115-
return MP_BOOL(lhs->val == rhs_val);
106+
return MP_BOOL(lhs_val == rhs_val);
116107
case RT_BINARY_OP_NOT_EQUAL:
117-
return MP_BOOL(lhs->val != rhs_val);
108+
return MP_BOOL(lhs_val != rhs_val);
118109

119110
default:
120111
// op not supported

0 commit comments

Comments
 (0)