diff options
| author | Jim Mussared | 2020-08-04 14:28:06 +1000 |
|---|---|---|
| committer | Damien George | 2020-10-10 00:16:32 +1100 |
| commit | b137d064e9e0bfebd2a59a9b312935031252e742 (patch) | |
| tree | db213232f48e771c19270bc387919668d120f60c | |
| parent | 880875bea1d825b8fa0d1c4a779ff767377f7655 (diff) | |
py/objtype: Handle __dict__ attribute when type has no locals.
| -rw-r--r-- | py/objtype.c | 9 | ||||
| -rw-r--r-- | tests/basics/class_dict.py | 5 |
2 files changed, 11 insertions, 3 deletions
diff --git a/py/objtype.c b/py/objtype.c index 40900dc05..7f7523294 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -1014,13 +1014,16 @@ STATIC void type_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { if (attr == MP_QSTR___dict__) { // Returns a read-only dict of the class attributes. // If the internal locals is not fixed, a copy will be created. - mp_obj_dict_t *dict = self->locals_dict; + const mp_obj_dict_t *dict = self->locals_dict; + if (!dict) { + dict = &mp_const_empty_dict_obj; + } if (dict->map.is_fixed) { dest[0] = MP_OBJ_FROM_PTR(dict); } else { dest[0] = mp_obj_dict_copy(MP_OBJ_FROM_PTR(dict)); - dict = MP_OBJ_TO_PTR(dest[0]); - dict->map.is_fixed = 1; + mp_obj_dict_t *dict_copy = MP_OBJ_TO_PTR(dest[0]); + dict_copy->map.is_fixed = 1; } return; } diff --git a/tests/basics/class_dict.py b/tests/basics/class_dict.py index f80ded678..508ae5e2e 100644 --- a/tests/basics/class_dict.py +++ b/tests/basics/class_dict.py @@ -17,3 +17,8 @@ class Foo: d = Foo.__dict__ print(d["a"], d["b"]) + + +# dict of a class that has no locals_dict (return empty dict). +d = type(type('')).__dict__ +print(d is not None) |
