py/objtype: Handle __dict__ attribute when type has no locals.

This commit is contained in:
Jim Mussared 2020-08-04 14:28:06 +10:00 committed by Damien George
parent 880875bea1
commit b137d064e9
2 changed files with 11 additions and 3 deletions

View File

@ -1014,13 +1014,16 @@ STATIC void type_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (attr == MP_QSTR___dict__) { if (attr == MP_QSTR___dict__) {
// Returns a read-only dict of the class attributes. // Returns a read-only dict of the class attributes.
// If the internal locals is not fixed, a copy will be created. // 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) { if (dict->map.is_fixed) {
dest[0] = MP_OBJ_FROM_PTR(dict); dest[0] = MP_OBJ_FROM_PTR(dict);
} else { } else {
dest[0] = mp_obj_dict_copy(MP_OBJ_FROM_PTR(dict)); dest[0] = mp_obj_dict_copy(MP_OBJ_FROM_PTR(dict));
dict = MP_OBJ_TO_PTR(dest[0]); mp_obj_dict_t *dict_copy = MP_OBJ_TO_PTR(dest[0]);
dict->map.is_fixed = 1; dict_copy->map.is_fixed = 1;
} }
return; return;
} }

View File

@ -17,3 +17,8 @@ class Foo:
d = Foo.__dict__ d = Foo.__dict__
print(d["a"], d["b"]) 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)