@@ -143,20 +143,35 @@ machine_int_t mp_obj_hash(mp_obj_t o_in) {
143143bool mp_obj_equal (mp_obj_t o1 , mp_obj_t o2 ) {
144144 if (o1 == o2 ) {
145145 return true;
146- } else if (o1 == mp_const_none || o2 == mp_const_none ) {
146+ }
147+ if (o1 == mp_const_none || o2 == mp_const_none ) {
147148 return false;
148- } else if (MP_OBJ_IS_SMALL_INT (o1 ) || MP_OBJ_IS_SMALL_INT (o2 )) {
149- if (MP_OBJ_IS_SMALL_INT (o1 ) && MP_OBJ_IS_SMALL_INT (o2 )) {
149+ }
150+
151+ // fast path for small ints
152+ if (MP_OBJ_IS_SMALL_INT (o1 )) {
153+ if (MP_OBJ_IS_SMALL_INT (o2 )) {
154+ // both SMALL_INT, and not equal if we get here
150155 return false;
151156 } else {
152- if (MP_OBJ_IS_SMALL_INT (o1 )) {
153- mp_obj_t temp = o2 ; o2 = o1 ; o1 = temp ;
154- }
155- // o2 is the SMALL_INT, o1 is not
157+ mp_obj_t temp = o2 ; o2 = o1 ; o1 = temp ;
158+ // o2 is now the SMALL_INT, o1 is not
156159 // fall through to generic op
157160 }
158- } else if (MP_OBJ_IS_STR (o1 ) && MP_OBJ_IS_STR (o2 )) {
159- return mp_obj_str_equal (o1 , o2 );
161+ }
162+
163+ // fast path for strings
164+ if (MP_OBJ_IS_STR (o1 )) {
165+ if (MP_OBJ_IS_STR (o2 )) {
166+ // both strings, use special function
167+ return mp_obj_str_equal (o1 , o2 );
168+ } else {
169+ // a string is never equal to anything else
170+ return false;
171+ }
172+ } else if (MP_OBJ_IS_STR (o2 )) {
173+ // o1 is not a string (else caught above), so the objects are not equal
174+ return false;
160175 }
161176
162177 // generic type, call binary_op(MP_BINARY_OP_EQUAL)
0 commit comments