diff options
Diffstat (limited to 'py/objmodule.c')
-rw-r--r-- | py/objmodule.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/py/objmodule.c b/py/objmodule.c index ab460fbd39..791932dc7f 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -10,12 +10,7 @@ #include "obj.h" #include "runtime.h" #include "map.h" - -typedef struct _mp_obj_module_t { - mp_obj_base_t base; - qstr name; - mp_map_t *globals; -} mp_obj_module_t; +#include "builtin.h" STATIC void module_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { mp_obj_module_t *self = self_in; @@ -37,7 +32,7 @@ STATIC bool module_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) { return true; } -const mp_obj_type_t module_type = { +const mp_obj_type_t mp_type_module = { { &mp_type_type }, .name = MP_QSTR_module, .print = module_print, @@ -46,32 +41,51 @@ const mp_obj_type_t module_type = { }; mp_obj_t mp_obj_new_module(qstr module_name) { - mp_map_elem_t *el = mp_map_lookup(rt_loaded_modules_get(), MP_OBJ_NEW_QSTR(module_name), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND); + mp_map_elem_t *el = mp_map_lookup(rt_loaded_modules_get(), MP_OBJ_NEW_QSTR(module_name), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND); // We could error out if module already exists, but let C extensions // add new members to existing modules. if (el->value != MP_OBJ_NULL) { return el->value; } + // create new module object mp_obj_module_t *o = m_new_obj(mp_obj_module_t); - o->base.type = &module_type; + o->base.type = &mp_type_module; o->name = module_name; o->globals = mp_map_new(1); - el->value = o; + + // store __name__ entry in the module mp_map_lookup(o->globals, MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = MP_OBJ_NEW_QSTR(module_name); + + // store the new module into the slot in the global dict holding all modules + el->value = o; + + // return the new module return o; } mp_obj_t mp_obj_module_get(qstr module_name) { + // lookup module mp_map_elem_t *el = mp_map_lookup(rt_loaded_modules_get(), MP_OBJ_NEW_QSTR(module_name), MP_MAP_LOOKUP); - if (el == NULL) { - return MP_OBJ_NULL; + + // module found, return it + if (el != NULL) { + return el->value; } - return el->value; + + // module not found, look for builtin module names +#if MICROPY_ENABLE_FLOAT + if (module_name == MP_QSTR_math) { + return (mp_obj_t)&mp_module_math; + } +#endif + + // no module found, return NULL object + return MP_OBJ_NULL; } mp_map_t *mp_obj_module_get_globals(mp_obj_t self_in) { - assert(MP_OBJ_IS_TYPE(self_in, &module_type)); + assert(MP_OBJ_IS_TYPE(self_in, &mp_type_module)); mp_obj_module_t *self = self_in; return self->globals; } |