Skip to content

Commit b8a053a

Browse files
committed
py: Implement float and complex == and !=.
Addresses issue adafruit#462.
1 parent 686afc5 commit b8a053a

3 files changed

Lines changed: 19 additions & 28 deletions

File tree

py/obj.c

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -149,40 +149,28 @@ bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) {
149149
if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) {
150150
return false;
151151
} else {
152-
if (MP_OBJ_IS_SMALL_INT(o2)) {
153-
mp_obj_t temp = o1; o1 = o2; o2 = temp;
152+
if (MP_OBJ_IS_SMALL_INT(o1)) {
153+
mp_obj_t temp = o2; o2 = o1; o1 = temp;
154154
}
155-
// o1 is the SMALL_INT, o2 is not
156-
mp_small_int_t val = MP_OBJ_SMALL_INT_VALUE(o1);
157-
if (o2 == mp_const_false) {
158-
return val == 0;
159-
} else if (o2 == mp_const_true) {
160-
return val == 1;
161-
} else if (MP_OBJ_IS_TYPE(o2, &mp_type_int)) {
162-
// If o2 is long int, dispatch to its virtual methods
163-
mp_obj_base_t *o = o2;
164-
if (o->type->binary_op != NULL) {
165-
mp_obj_t r = o->type->binary_op(MP_BINARY_OP_EQUAL, o2, o1);
166-
return r == mp_const_true ? true : false;
167-
}
168-
}
169-
return false;
155+
// o2 is the SMALL_INT, o1 is not
156+
// fall through to generic op
170157
}
171158
} else if (MP_OBJ_IS_STR(o1) && MP_OBJ_IS_STR(o2)) {
172159
return mp_obj_str_equal(o1, o2);
173-
} else {
174-
mp_obj_base_t *o = o1;
175-
if (o->type->binary_op != NULL) {
176-
mp_obj_t r = o->type->binary_op(MP_BINARY_OP_EQUAL, o1, o2);
177-
if (r != MP_OBJ_NULL) {
178-
return r == mp_const_true ? true : false;
179-
}
180-
}
160+
}
181161

182-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
183-
"Equality for '%s' and '%s' types not yet implemented", mp_obj_get_type_str(o1), mp_obj_get_type_str(o2)));
184-
return false;
162+
// generic type, call binary_op(MP_BINARY_OP_EQUAL)
163+
mp_obj_type_t *type = mp_obj_get_type(o1);
164+
if (type->binary_op != NULL) {
165+
mp_obj_t r = type->binary_op(MP_BINARY_OP_EQUAL, o1, o2);
166+
if (r != MP_OBJ_NULL) {
167+
return r == mp_const_true ? true : false;
168+
}
185169
}
170+
171+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
172+
"Equality for '%s' and '%s' types not yet implemented", mp_obj_get_type_str(o1), mp_obj_get_type_str(o2)));
173+
return false;
186174
}
187175

188176
machine_int_t mp_obj_get_int(mp_obj_t arg) {

py/objcomplex.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ mp_obj_t mp_obj_complex_binary_op(int op, mp_float_t lhs_real, mp_float_t lhs_im
205205
break;
206206
}
207207

208+
case MP_BINARY_OP_EQUAL: return MP_BOOL(lhs_real == rhs_real && lhs_imag == rhs_imag);
209+
208210
default:
209211
return MP_OBJ_NULL; // op not supported
210212
}

py/objfloat.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) {
132132
case MP_BINARY_OP_INPLACE_POWER: lhs_val = MICROPY_FLOAT_C_FUN(pow)(lhs_val, rhs_val); break;
133133
case MP_BINARY_OP_LESS: return MP_BOOL(lhs_val < rhs_val);
134134
case MP_BINARY_OP_MORE: return MP_BOOL(lhs_val > rhs_val);
135+
case MP_BINARY_OP_EQUAL: return MP_BOOL(lhs_val == rhs_val);
135136
case MP_BINARY_OP_LESS_EQUAL: return MP_BOOL(lhs_val <= rhs_val);
136137
case MP_BINARY_OP_MORE_EQUAL: return MP_BOOL(lhs_val >= rhs_val);
137138

0 commit comments

Comments
 (0)