@@ -661,8 +661,8 @@ static void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
661
661
// try __getattr__
662
662
if (attr != MP_QSTR___getattr__ ) {
663
663
#if MICROPY_PY_DESCRIPTORS
664
- // With descriptors enabled, don't delegate lookups of __get__/__set__/__delete__.
665
- if (attr == MP_QSTR___get__ || attr == MP_QSTR___set__ || attr == MP_QSTR___delete__ ) {
664
+ // With descriptors enabled, don't delegate lookups of __get__/__set__/__delete__/__set_name__ .
665
+ if (attr == MP_QSTR___get__ || attr == MP_QSTR___set__ || attr == MP_QSTR___delete__ || attr == MP_QSTR___set_name__ ) {
666
666
return ;
667
667
}
668
668
#endif
@@ -960,7 +960,7 @@ static bool check_for_special_accessors(mp_obj_t key, mp_obj_t value) {
960
960
#endif
961
961
#if MICROPY_PY_DESCRIPTORS
962
962
static const uint8_t to_check [] = {
963
- MP_QSTR___get__ , MP_QSTR___set__ , MP_QSTR___delete__ ,
963
+ MP_QSTR___get__ , MP_QSTR___set__ , MP_QSTR___delete__ , // not needed for MP_QSTR___set_name__ tho
964
964
};
965
965
for (size_t i = 0 ; i < MP_ARRAY_SIZE (to_check ); ++ i ) {
966
966
mp_obj_t dest_temp [2 ];
@@ -1241,6 +1241,23 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
1241
1241
}
1242
1242
}
1243
1243
1244
+ #if MICROPY_PY_DESCRIPTORS
1245
+ // call __set_name__ on all entries (especially descriptors)
1246
+ for (size_t i = 0 ; i < locals_map -> alloc ; i ++ ) {
1247
+ if (mp_map_slot_is_filled (locals_map , i )) {
1248
+ elem = & (locals_map -> table [i ]);
1249
+
1250
+ mp_obj_t set_name_method [4 ];
1251
+ mp_load_method_maybe (elem -> value , MP_QSTR___set_name__ , set_name_method );
1252
+ if (set_name_method [1 ] != MP_OBJ_NULL ) {
1253
+ set_name_method [2 ] = MP_OBJ_FROM_PTR (o );
1254
+ set_name_method [3 ] = elem -> key ;
1255
+ mp_call_method_n_kw (2 , 0 , set_name_method );
1256
+ }
1257
+ }
1258
+ }
1259
+ #endif
1260
+
1244
1261
return MP_OBJ_FROM_PTR (o );
1245
1262
}
1246
1263
0 commit comments