diff options
author | Damien George <damien.p.george@gmail.com> | 2014-03-08 15:24:39 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-03-08 15:24:39 +0000 |
commit | 0c36da0b59bd3d5aeb6f7bd7f75913695a1dd366 (patch) | |
tree | eb1d8e50037139646f935df99da56764fcafb4f1 /py/objmodule.c | |
parent | 8fd7d7e102372a3fe067030aa0f2049f744b1567 (diff) | |
download | micropython-0c36da0b59bd3d5aeb6f7bd7f75913695a1dd366.tar.gz micropython-0c36da0b59bd3d5aeb6f7bd7f75913695a1dd366.zip |
Implement ROMable modules. Add math module.
mp_module_obj_t can now be put in ROM.
Configuration of float type is now similar to longint: can now choose
none, float or double as the implementation.
math module has basic math functions. For STM port, these are not yet
implemented (they are just stub functions).
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; } |