summaryrefslogtreecommitdiffstatshomepage
path: root/py/objmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objmodule.c')
-rw-r--r--py/objmodule.c64
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) {