aboutsummaryrefslogtreecommitdiff
path: root/py/objtype.c
diff options
context:
space:
mode:
authorDamien George2020-02-10 21:41:22 +1100
committerDamien George2020-02-11 11:06:00 +1100
commit9ec1caf42e7733b5141b7aecf1b6e58834a94bf7 (patch)
treecbbcc0a243186216ea675595eadeb5c6198e3436 /py/objtype.c
parent0852acfc744720cc75db9c592f947c28bd2d7e42 (diff)
py: Expand type equality flags to 3 separate ones, fix bool/namedtuple.
Both bool and namedtuple will check against other types for equality; int, float and complex for bool, and tuple for namedtuple. So to make them work after the recent commit 3aab54bf434e7f025a91ea05052f1bac439fad8c they would need MP_TYPE_FLAG_NEEDS_FULL_EQ_TEST set. But that makes all bool and namedtuple equality checks less efficient because mp_obj_equal_not_equal() could no longer short-cut x==x, and would need to try __ne__. To improve this, this commit splits the MP_TYPE_FLAG_NEEDS_FULL_EQ_TEST flags into 3 separate flags to give types more fine-grained control over how their equality behaves. These new flags are then used to fix bool and namedtuple equality. Fixes issue #5615 and #5620.
Diffstat (limited to 'py/objtype.c')
-rw-r--r--py/objtype.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/py/objtype.c b/py/objtype.c
index ae0fe6cae..57cfeeccb 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -1100,7 +1100,8 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
// TODO might need to make a copy of locals_dict; at least that's how CPython does it
// Basic validation of base classes
- uint16_t base_flags = MP_TYPE_FLAG_NEEDS_FULL_EQ_TEST;
+ uint16_t base_flags = MP_TYPE_FLAG_EQ_NOT_REFLEXIVE
+ | MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE | MP_TYPE_FLAG_EQ_HAS_NEQ_TEST;
size_t bases_len;
mp_obj_t *bases_items;
mp_obj_tuple_get(bases_tuple, &bases_len, &bases_items);