@@ -41,80 +41,71 @@ mp_obj_t int_unary_op(int op, mp_obj_t o_in) {
4141}
4242
4343mp_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