diff options
author | Damien George <damien.p.george@gmail.com> | 2015-04-01 14:10:50 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-04-11 16:54:37 +0100 |
commit | b1bbe966c408901ae64ea8c8b468694c47d05b1a (patch) | |
tree | 46025c34daf602aeb1e8def41d1e01f0750b6d13 /py/objmodule.c | |
parent | d07ccc5a394d0252ffbc227509ed2134465c215a (diff) | |
download | micropython-b1bbe966c408901ae64ea8c8b468694c47d05b1a.tar.gz micropython-b1bbe966c408901ae64ea8c8b468694c47d05b1a.zip |
py: Combine load_attr and store_attr type methods into one (attr).
This simplifies the API for objects and reduces code size (by around 400
bytes on Thumb2, and around 2k on x86). Performance impact was measured
with Pystone score, but change was barely noticeable.
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) { |