@@ -51,48 +51,48 @@ STATIC void module_print(void (*print)(void *env, const char *fmt, ...), void *e
5151 print (env , "<module '%s'>" , name );
5252}
5353
54- STATIC void module_load_attr (mp_obj_t self_in , qstr attr , mp_obj_t * dest ) {
54+ STATIC void module_attr (mp_obj_t self_in , qstr attr , mp_obj_t * dest ) {
5555 mp_obj_module_t * self = self_in ;
56- mp_map_elem_t * elem = mp_map_lookup (& self -> globals -> map , MP_OBJ_NEW_QSTR (attr ), MP_MAP_LOOKUP );
57- if (elem != NULL ) {
58- dest [0 ] = elem -> value ;
59- }
60- }
61-
62- STATIC bool module_store_attr (mp_obj_t self_in , qstr attr , mp_obj_t value ) {
63- mp_obj_module_t * self = self_in ;
64- mp_obj_dict_t * dict = self -> globals ;
65- if (dict -> map .is_fixed ) {
66- #if MICROPY_CAN_OVERRIDE_BUILTINS
67- if (dict == & mp_module_builtins_globals ) {
68- if (MP_STATE_VM (mp_module_builtins_override_dict ) == NULL ) {
69- MP_STATE_VM (mp_module_builtins_override_dict ) = mp_obj_new_dict (1 );
70- }
71- dict = MP_STATE_VM (mp_module_builtins_override_dict );
72- } else
73- #endif
74- {
75- // can't delete or store to fixed map
76- return false;
56+ if (dest [0 ] == MP_OBJ_NULL ) {
57+ // load attribute
58+ mp_map_elem_t * elem = mp_map_lookup (& self -> globals -> map , MP_OBJ_NEW_QSTR (attr ), MP_MAP_LOOKUP );
59+ if (elem != NULL ) {
60+ dest [0 ] = elem -> value ;
7761 }
78- }
79- if (value == MP_OBJ_NULL ) {
80- // delete attribute
81- mp_obj_dict_delete (dict , MP_OBJ_NEW_QSTR (attr ));
8262 } else {
83- // store attribute
84- // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation?
85- mp_obj_dict_store (dict , MP_OBJ_NEW_QSTR (attr ), value );
63+ // delete/store attribute
64+ mp_obj_dict_t * dict = self -> globals ;
65+ if (dict -> map .is_fixed ) {
66+ #if MICROPY_CAN_OVERRIDE_BUILTINS
67+ if (dict == & mp_module_builtins_globals ) {
68+ if (MP_STATE_VM (mp_module_builtins_override_dict ) == NULL ) {
69+ MP_STATE_VM (mp_module_builtins_override_dict ) = mp_obj_new_dict (1 );
70+ }
71+ dict = MP_STATE_VM (mp_module_builtins_override_dict );
72+ } else
73+ #endif
74+ {
75+ // can't delete or store to fixed map
76+ return ;
77+ }
78+ }
79+ if (dest [1 ] == MP_OBJ_NULL ) {
80+ // delete attribute
81+ mp_obj_dict_delete (dict , MP_OBJ_NEW_QSTR (attr ));
82+ } else {
83+ // store attribute
84+ // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation?
85+ mp_obj_dict_store (dict , MP_OBJ_NEW_QSTR (attr ), dest [1 ]);
86+ }
87+ dest [0 ] = MP_OBJ_NULL ; // indicate success
8688 }
87- return true;
8889}
8990
9091const mp_obj_type_t mp_type_module = {
9192 { & mp_type_type },
9293 .name = MP_QSTR_module ,
9394 .print = module_print ,
94- .load_attr = module_load_attr ,
95- .store_attr = module_store_attr ,
95+ .attr = module_attr ,
9696};
9797
9898mp_obj_t mp_obj_new_module (qstr module_name ) {
0 commit comments