@@ -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+
3546mp_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 :
0 commit comments