diff options
Diffstat (limited to 'py/objmodule.c')
-rw-r--r-- | py/objmodule.c | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/py/objmodule.c b/py/objmodule.c index 02292ff785..971c7f38c5 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -51,48 +51,48 @@ STATIC void module_print(void (*print)(void *env, const char *fmt, ...), void *e print(env, "<module '%s'>", name); } -STATIC void module_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { +STATIC void module_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { mp_obj_module_t *self = self_in; - mp_map_elem_t *elem = mp_map_lookup(&self->globals->map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP); - if (elem != NULL) { - dest[0] = elem->value; - } -} - -STATIC bool module_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) { - mp_obj_module_t *self = self_in; - mp_obj_dict_t *dict = self->globals; - if (dict->map.is_fixed) { - #if MICROPY_CAN_OVERRIDE_BUILTINS - if (dict == &mp_module_builtins_globals) { - if (MP_STATE_VM(mp_module_builtins_override_dict) == NULL) { - MP_STATE_VM(mp_module_builtins_override_dict) = mp_obj_new_dict(1); - } - dict = MP_STATE_VM(mp_module_builtins_override_dict); - } else - #endif - { - // can't delete or store to fixed map - return false; + if (dest[0] == MP_OBJ_NULL) { + // load attribute + mp_map_elem_t *elem = mp_map_lookup(&self->globals->map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP); + if (elem != NULL) { + dest[0] = elem->value; } - } - if (value == MP_OBJ_NULL) { - // delete attribute - mp_obj_dict_delete(dict, MP_OBJ_NEW_QSTR(attr)); } else { - // store attribute - // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation? - mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(attr), value); + // delete/store attribute + mp_obj_dict_t *dict = self->globals; + if (dict->map.is_fixed) { + #if MICROPY_CAN_OVERRIDE_BUILTINS + if (dict == &mp_module_builtins_globals) { + if (MP_STATE_VM(mp_module_builtins_override_dict) == NULL) { + MP_STATE_VM(mp_module_builtins_override_dict) = mp_obj_new_dict(1); + } + dict = MP_STATE_VM(mp_module_builtins_override_dict); + } else + #endif + { + // can't delete or store to fixed map + return; + } + } + if (dest[1] == MP_OBJ_NULL) { + // delete attribute + mp_obj_dict_delete(dict, MP_OBJ_NEW_QSTR(attr)); + } else { + // store attribute + // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation? + mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(attr), dest[1]); + } + dest[0] = MP_OBJ_NULL; // indicate success } - return true; } const mp_obj_type_t mp_type_module = { { &mp_type_type }, .name = MP_QSTR_module, .print = module_print, - .load_attr = module_load_attr, - .store_attr = module_store_attr, + .attr = module_attr, }; mp_obj_t mp_obj_new_module(qstr module_name) { |