aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Mussared2020-08-04 14:28:06 +1000
committerDamien George2020-10-10 00:16:32 +1100
commitb137d064e9e0bfebd2a59a9b312935031252e742 (patch)
treedb213232f48e771c19270bc387919668d120f60c
parent880875bea1d825b8fa0d1c4a779ff767377f7655 (diff)
py/objtype: Handle __dict__ attribute when type has no locals.
-rw-r--r--py/objtype.c9
-rw-r--r--tests/basics/class_dict.py5
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)