Merge pull request #709 from jepler/core-class-superproperty
Make test core_class_superproperty.py succeed
This commit is contained in:
commit
4517ab8ba4
@ -78,9 +78,9 @@ mp_obj_property_t *make_property_long_lived(mp_obj_property_t *prop, uint8_t max
|
|||||||
if (max_depth == 0) {
|
if (max_depth == 0) {
|
||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
prop->proxy[0] = make_fun_bc_long_lived((mp_obj_fun_bc_t*) prop->proxy[0], max_depth - 1);
|
prop->proxy[0] = make_obj_long_lived((mp_obj_fun_bc_t*) prop->proxy[0], max_depth - 1);
|
||||||
prop->proxy[1] = make_fun_bc_long_lived((mp_obj_fun_bc_t*) prop->proxy[1], max_depth - 1);
|
prop->proxy[1] = make_obj_long_lived((mp_obj_fun_bc_t*) prop->proxy[1], max_depth - 1);
|
||||||
prop->proxy[2] = make_fun_bc_long_lived((mp_obj_fun_bc_t*) prop->proxy[2], max_depth - 1);
|
prop->proxy[2] = make_obj_long_lived((mp_obj_fun_bc_t*) prop->proxy[2], max_depth - 1);
|
||||||
return gc_make_long_lived(prop);
|
return gc_make_long_lived(prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
30
py/objtype.c
30
py/objtype.c
@ -567,6 +567,7 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
|
|||||||
mp_obj_class_lookup(&lookup, self->base.type);
|
mp_obj_class_lookup(&lookup, self->base.type);
|
||||||
mp_obj_t member = dest[0];
|
mp_obj_t member = dest[0];
|
||||||
if (member != MP_OBJ_NULL) {
|
if (member != MP_OBJ_NULL) {
|
||||||
|
// changes here may may require changes to super_attr, below
|
||||||
#if MICROPY_PY_BUILTINS_PROPERTY
|
#if MICROPY_PY_BUILTINS_PROPERTY
|
||||||
if (MP_OBJ_IS_TYPE(member, &mp_type_property)) {
|
if (MP_OBJ_IS_TYPE(member, &mp_type_property)) {
|
||||||
// object member is a property; delegate the load to the property
|
// object member is a property; delegate the load to the property
|
||||||
@ -1112,14 +1113,37 @@ STATIC void super_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
|
|||||||
assert(MP_OBJ_IS_TYPE(items[i], &mp_type_type));
|
assert(MP_OBJ_IS_TYPE(items[i], &mp_type_type));
|
||||||
mp_obj_class_lookup(&lookup, (mp_obj_type_t*)MP_OBJ_TO_PTR(items[i]));
|
mp_obj_class_lookup(&lookup, (mp_obj_type_t*)MP_OBJ_TO_PTR(items[i]));
|
||||||
if (dest[0] != MP_OBJ_NULL) {
|
if (dest[0] != MP_OBJ_NULL) {
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mp_obj_class_lookup(&lookup, type->parent);
|
mp_obj_class_lookup(&lookup, type->parent);
|
||||||
if (dest[0] != MP_OBJ_NULL) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dest[0] != MP_OBJ_NULL) {
|
||||||
|
mp_obj_t member = dest[0];
|
||||||
|
// changes to mp_obj_instance_load_attr may require changes
|
||||||
|
// here...
|
||||||
|
#if MICROPY_PY_BUILTINS_PROPERTY
|
||||||
|
if (MP_OBJ_IS_TYPE(member, &mp_type_property)) {
|
||||||
|
const mp_obj_t *proxy = mp_obj_property_get(member);
|
||||||
|
if (proxy[0] == mp_const_none) {
|
||||||
|
mp_raise_AttributeError("unreadable attribute");
|
||||||
|
} else {
|
||||||
|
dest[0] = mp_call_function_n_kw(proxy[0], 1, 0, &self_in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if MICROPY_PY_DESCRIPTORS
|
||||||
|
mp_obj_t attr_get_method[4];
|
||||||
|
mp_load_method_maybe(member, MP_QSTR___get__, attr_get_method);
|
||||||
|
if (attr_get_method[0] != MP_OBJ_NULL) {
|
||||||
|
attr_get_method[2] = self_in;
|
||||||
|
attr_get_method[3] = MP_OBJ_FROM_PTR(mp_obj_get_type(self_in));
|
||||||
|
dest[0] = mp_call_method_n_kw(2, 0, attr_get_method);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_class_lookup(&lookup, &mp_type_object);
|
mp_obj_class_lookup(&lookup, &mp_type_object);
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
categories: Core,Classes
|
test that calling super() getter property in subclass will return the value
|
||||||
description: Calling super() getter property in subclass will return a property object, not the value
|
|
||||||
cause: Unknown
|
|
||||||
workaround: Unknown
|
|
||||||
"""
|
"""
|
||||||
class A:
|
class A:
|
||||||
@property
|
@property
|
Loading…
x
Reference in New Issue
Block a user