diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-02-16 01:51:46 +0200 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-02-16 02:55:46 +0200 |
commit | d3783570a4a8fb5c287ece1951215aa32c32204e (patch) | |
tree | 5dae414c91d6a8c13087de600f9fc02fc9b299fd /py/builtinimport.c | |
parent | e5d371b5456020240d4c54dd8f7d8e938074ebd7 (diff) | |
download | micropython-d3783570a4a8fb5c287ece1951215aa32c32204e.tar.gz micropython-d3783570a4a8fb5c287ece1951215aa32c32204e.zip |
builtinimport.c: Recognize "namespace package" and error out as unsupported.
See http://www.python.org/dev/peps/pep-0420/#specification for spec. See
https://github.com/micropython/micropython/issues/298 for the discussion
of the implemented behavior.
Diffstat (limited to 'py/builtinimport.c')
-rw-r--r-- | py/builtinimport.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/py/builtinimport.c b/py/builtinimport.c index c90625e9e0..ae03f8c523 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -184,10 +184,14 @@ mp_obj_t mp_builtin___import__(int n_args, mp_obj_t *args) { if (stat == MP_IMPORT_STAT_DIR) { vstr_add_char(&path, PATH_SEP_CHAR); vstr_add_str(&path, "__init__.py"); - if (mp_import_stat(vstr_str(&path)) == MP_IMPORT_STAT_FILE) { - do_load(module_obj, &path); + if (mp_import_stat(vstr_str(&path)) != MP_IMPORT_STAT_FILE) { + vstr_cut_tail(&path, sizeof("/__init__.py") - 1); // cut off /__init__.py + nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_ImportError, + "Per PEP-420 a dir without __init__.py (%s) is a namespace package; " + "namespace packages are not supported", vstr_str(&path))); } - vstr_cut_tail(&path, 12); // cut off /__init__.py + do_load(module_obj, &path); + vstr_cut_tail(&path, sizeof("/__init__.py") - 1); // cut off /__init__.py } else { // MP_IMPORT_STAT_FILE do_load(module_obj, &path); break; |