diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-06-29 00:21:36 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2015-06-29 00:26:45 +0300 |
commit | 9780e552748842d6f76f7a1a7f390287552844f1 (patch) | |
tree | 92bfb7ab0d2e8cce9bb1c4878ed61b68fb96a70d /py | |
parent | 4f5b896a0b605b10fd644f36b458e7b936876102 (diff) | |
download | micropython-9780e552748842d6f76f7a1a7f390287552844f1.tar.gz micropython-9780e552748842d6f76f7a1a7f390287552844f1.zip |
builtinimport: Fix running package submodule with -m.
When "micropython -m pkg.mod" command was used, relative imports in pkg.mod
didn't work, because pkg.mod.__name__ was set to __main__, and the fact that
it's a package submodule was missed. This is an original workaround to this
issue. TODO: investigate and compare how CPython deals with this issue.
Diffstat (limited to 'py')
-rw-r--r-- | py/builtinimport.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/py/builtinimport.c b/py/builtinimport.c index 04b9d626d4..d5a7d56def 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -184,6 +184,12 @@ mp_obj_t mp_builtin___import__(mp_uint_t n_args, const mp_obj_t *args) { level--; mp_obj_t this_name_q = mp_obj_dict_get(mp_globals_get(), MP_OBJ_NEW_QSTR(MP_QSTR___name__)); assert(this_name_q != MP_OBJ_NULL); + #if MICROPY_CPYTHON_COMPAT + if (MP_OBJ_QSTR_VALUE(this_name_q) == MP_QSTR___main__) { + // This is a module run by -m command-line switch, get its real name from backup attribute + this_name_q = mp_obj_dict_get(mp_globals_get(), MP_OBJ_NEW_QSTR(MP_QSTR___main__)); + } + #endif mp_map_t *globals_map = mp_obj_dict_get_map(mp_globals_get()); mp_map_elem_t *elem = mp_map_lookup(globals_map, MP_OBJ_NEW_QSTR(MP_QSTR___path__), MP_MAP_LOOKUP); bool is_pkg = (elem != NULL); @@ -350,6 +356,10 @@ mp_obj_t mp_builtin___import__(mp_uint_t n_args, const mp_obj_t *args) { if (i == mod_len && fromtuple == mp_const_false) { mp_obj_module_t *o = module_obj; mp_obj_dict_store(o->globals, MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR___main__)); + #if MICROPY_CPYTHON_COMPAT + // Store real name in "__main__" attribute. Choosen semi-randonly, to reuse existing qstr's. + mp_obj_dict_store(o->globals, MP_OBJ_NEW_QSTR(MP_QSTR___main__), MP_OBJ_NEW_QSTR(mod_name)); + #endif } if (stat == MP_IMPORT_STAT_DIR) { |