Skip to content

Commit bc310ef

Browse files
committed
py/objtype: Use mp_obj_dict_copy() for creating obj.__dict__ attribute.
1 parent a8718b1 commit bc310ef

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

py/objtype.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -587,17 +587,16 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
587587
}
588588
#if MICROPY_CPYTHON_COMPAT
589589
if (attr == MP_QSTR___dict__) {
590-
// Create a new dict with a copy of the instance's map items.
590+
// Returns a read-only dict of the instance members.
591+
// If the internal locals is not fixed, a copy will be created.
591592
// This creates, unlike CPython, a 'read-only' __dict__: modifying
592593
// it will not result in modifications to the actual instance members.
593-
mp_map_t *map = &self->members;
594-
mp_obj_t attr_dict = mp_obj_new_dict(map->used);
595-
for (size_t i = 0; i < map->alloc; ++i) {
596-
if (mp_map_slot_is_filled(map, i)) {
597-
mp_obj_dict_store(attr_dict, map->table[i].key, map->table[i].value);
598-
}
599-
}
600-
dest[0] = attr_dict;
594+
mp_obj_dict_t dict;
595+
dict.map = self->members;
596+
dict.base.type = &mp_type_dict;
597+
dest[0] = mp_obj_dict_copy(MP_OBJ_FROM_PTR(&dict));
598+
mp_obj_dict_t *dest_dict = MP_OBJ_TO_PTR(dest[0]);
599+
dest_dict->map.is_fixed = 1;
601600
return;
602601
}
603602
#endif

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy