py: Fix up object equality test.

It regressed a bit after implementing float/complex equality.  Now it
should be improved, and support more equality tests.
This commit is contained in:
Damien George 2014-04-11 10:52:06 +00:00
parent a9ddd6d9df
commit e22d76e73b
2 changed files with 27 additions and 10 deletions

View File

@ -143,20 +143,35 @@ machine_int_t mp_obj_hash(mp_obj_t o_in) {
bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) {
if (o1 == o2) { if (o1 == o2) {
return true; return true;
} else if (o1 == mp_const_none || o2 == mp_const_none) { }
if (o1 == mp_const_none || o2 == mp_const_none) {
return false; return false;
} else if (MP_OBJ_IS_SMALL_INT(o1) || MP_OBJ_IS_SMALL_INT(o2)) { }
if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) {
// fast path for small ints
if (MP_OBJ_IS_SMALL_INT(o1)) {
if (MP_OBJ_IS_SMALL_INT(o2)) {
// both SMALL_INT, and not equal if we get here
return false; return false;
} else { } else {
if (MP_OBJ_IS_SMALL_INT(o1)) { mp_obj_t temp = o2; o2 = o1; o1 = temp;
mp_obj_t temp = o2; o2 = o1; o1 = temp; // o2 is now the SMALL_INT, o1 is not
}
// o2 is the SMALL_INT, o1 is not
// fall through to generic op // fall through to generic op
} }
} else if (MP_OBJ_IS_STR(o1) && MP_OBJ_IS_STR(o2)) { }
return mp_obj_str_equal(o1, o2);
// fast path for strings
if (MP_OBJ_IS_STR(o1)) {
if (MP_OBJ_IS_STR(o2)) {
// both strings, use special function
return mp_obj_str_equal(o1, o2);
} else {
// a string is never equal to anything else
return false;
}
} else if (MP_OBJ_IS_STR(o2)) {
// o1 is not a string (else caught above), so the objects are not equal
return false;
} }
// generic type, call binary_op(MP_BINARY_OP_EQUAL) // generic type, call binary_op(MP_BINARY_OP_EQUAL)

View File

@ -99,7 +99,6 @@ STATIC mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
return MP_BOOL(elem != NULL); return MP_BOOL(elem != NULL);
} }
case MP_BINARY_OP_EQUAL: { case MP_BINARY_OP_EQUAL: {
// TODO: Support equality to other object types
if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_dict)) { if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_dict)) {
mp_obj_dict_t *rhs = rhs_in; mp_obj_dict_t *rhs = rhs_in;
if (o->map.used != rhs->map.used) { if (o->map.used != rhs->map.used) {
@ -118,6 +117,9 @@ STATIC mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
} }
} }
return mp_const_true; return mp_const_true;
} else {
// dict is not equal to instance of any other type
return mp_const_false;
} }
} }
default: default: