summaryrefslogtreecommitdiffstatshomepage
path: root/py/objtype.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objtype.c')
-rw-r--r--py/objtype.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/py/objtype.c b/py/objtype.c
index db99d407ac..ca52006f25 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -472,7 +472,22 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
dest[0] = elem->value;
return;
}
-
+#if MICROPY_CPYTHON_COMPAT
+ if (attr == MP_QSTR___dict__) {
+ // Create a new dict with a copy of the instance's map items.
+ // This creates, unlike CPython, a 'read-only' __dict__: modifying
+ // it will not result in modifications to the actual instance members.
+ mp_map_t *map = &self->members;
+ mp_obj_t attr_dict = mp_obj_new_dict(map->used);
+ for (mp_uint_t i = 0; i < map->alloc; ++i) {
+ if (MP_MAP_SLOT_IS_FILLED(map, i)) {
+ mp_obj_dict_store(attr_dict, map->table[i].key, map->table[i].value);
+ }
+ }
+ dest[0] = attr_dict;
+ return;
+ }
+#endif
struct class_lookup_data lookup = {
.obj = self,
.attr = attr,