diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2018-03-26 21:59:05 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-03-26 21:59:05 -0700 |
| commit | 4517ab8ba4721aa6594599a2f9790f94afbce29b (patch) | |
| tree | 99f40a3eeb8267466bd45b95bbbd9d22dc8c4340 /py | |
| parent | 77938db8c8d7806517d3b25d84693f9b20c89082 (diff) | |
| parent | 047a4f59c5acc6ab70bab177b33f0cef2972e8a1 (diff) | |
Merge pull request #709 from jepler/core-class-superproperty
Make test core_class_superproperty.py succeed
Diffstat (limited to 'py')
| -rw-r--r-- | py/gc_long_lived.c | 6 | ||||
| -rw-r--r-- | py/objtype.c | 30 |
2 files changed, 30 insertions, 6 deletions
diff --git a/py/gc_long_lived.c b/py/gc_long_lived.c index c50bbcd83..d34fde5d9 100644 --- a/py/gc_long_lived.c +++ b/py/gc_long_lived.c @@ -78,9 +78,9 @@ mp_obj_property_t *make_property_long_lived(mp_obj_property_t *prop, uint8_t max if (max_depth == 0) { return prop; } - prop->proxy[0] = make_fun_bc_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[2] = make_fun_bc_long_lived((mp_obj_fun_bc_t*) prop->proxy[2], 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_obj_long_lived((mp_obj_fun_bc_t*) prop->proxy[1], 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); } diff --git a/py/objtype.c b/py/objtype.c index 1d6dc0b6c..7262892bd 100644 --- a/py/objtype.c +++ b/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_t member = dest[0]; if (member != MP_OBJ_NULL) { + // changes here may may require changes to super_attr, below #if MICROPY_PY_BUILTINS_PROPERTY if (MP_OBJ_IS_TYPE(member, &mp_type_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)); mp_obj_class_lookup(&lookup, (mp_obj_type_t*)MP_OBJ_TO_PTR(items[i])); if (dest[0] != MP_OBJ_NULL) { - return; + break; } } } else { 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); |
