@@ -247,17 +247,7 @@ mp_obj_t mp_module_get(qstr module_name) {
247247 if (el == NULL ) {
248248 return MP_OBJ_NULL ;
249249 }
250-
251- if (MICROPY_MODULE_BUILTIN_INIT ) {
252- // look for __init__ and call it if it exists
253- mp_obj_t dest [2 ];
254- mp_load_method_maybe (el -> value , MP_QSTR___init__ , dest );
255- if (dest [0 ] != MP_OBJ_NULL ) {
256- mp_call_method_n_kw (0 , 0 , dest );
257- // register module so __init__ is not called again
258- mp_module_register (module_name , el -> value );
259- }
260- }
250+ mp_module_call_init (module_name , el -> value );
261251 }
262252
263253 // module found, return it
@@ -268,3 +258,19 @@ void mp_module_register(qstr qst, mp_obj_t module) {
268258 mp_map_t * mp_loaded_modules_map = & MP_STATE_VM (mp_loaded_modules_dict ).map ;
269259 mp_map_lookup (mp_loaded_modules_map , MP_OBJ_NEW_QSTR (qst ), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND )-> value = module ;
270260}
261+
262+ #if MICROPY_MODULE_BUILTIN_INIT
263+ void mp_module_call_init (qstr module_name , mp_obj_t module_obj ) {
264+ // Look for __init__ and call it if it exists
265+ mp_obj_t dest [2 ];
266+ mp_load_method_maybe (module_obj , MP_QSTR___init__ , dest );
267+ if (dest [0 ] != MP_OBJ_NULL ) {
268+ mp_call_method_n_kw (0 , 0 , dest );
269+ // Register module so __init__ is not called again.
270+ // If a module can be referenced by more than one name (eg due to weak links)
271+ // then __init__ will still be called for each distinct import, and it's then
272+ // up to the particular module to make sure it's __init__ code only runs once.
273+ mp_module_register (module_name , module_obj );
274+ }
275+ }
276+ #endif
0 commit comments