diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-03 22:55:16 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-03 22:55:16 +0000 |
commit | 97334c85d0b53ef1648eb76ec6e9e2b1efab1f97 (patch) | |
tree | d10f6b6b7ca3394e6f7dc31ca55e0df2b39abe02 /py/builtinimport.c | |
parent | 25f417c08c2cdb5c4a7564d1e69766c0448d7984 (diff) | |
parent | b7aa72710ee6798c6d2bc2632be24206e526fc1e (diff) | |
download | micropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.tar.gz micropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'py/builtinimport.c')
-rw-r--r-- | py/builtinimport.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/py/builtinimport.c b/py/builtinimport.c new file mode 100644 index 0000000000..47dbf21216 --- /dev/null +++ b/py/builtinimport.c @@ -0,0 +1,84 @@ +#include <stdint.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <assert.h> + +#include "nlr.h" +#include "misc.h" +#include "mpconfig.h" +#include "lexer.h" +#include "lexerunix.h" +#include "parse.h" +#include "obj.h" +#include "compile.h" +#include "runtime0.h" +#include "runtime.h" +#include "map.h" +#include "builtin.h" + +mp_obj_t mp_builtin___import__(int n, mp_obj_t *args) { + /* + printf("import:\n"); + for (int i = 0; i < n; i++) { + printf(" "); + mp_obj_print(args[i]); + printf("\n"); + } + */ + + // find the file to import + qstr mod_name = mp_obj_get_qstr(args[0]); + mp_lexer_t *lex = mp_import_open_file(mod_name); + if (lex == NULL) { + // TODO handle lexer error correctly + return mp_const_none; + } + + // create a new module object + mp_obj_t module_obj = mp_obj_new_module(mp_obj_get_qstr(args[0])); + + // save the old context + mp_map_t *old_locals = rt_locals_get(); + mp_map_t *old_globals = rt_globals_get(); + + // set the new context + rt_locals_set(mp_obj_module_get_globals(module_obj)); + rt_globals_set(mp_obj_module_get_globals(module_obj)); + + // parse the imported script + mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT); + mp_lexer_free(lex); + + if (pn == MP_PARSE_NODE_NULL) { + // TODO handle parse error correctly + rt_locals_set(old_locals); + rt_globals_set(old_globals); + return mp_const_none; + } + + if (!mp_compile(pn, false)) { + // TODO handle compile error correctly + rt_locals_set(old_locals); + rt_globals_set(old_globals); + return mp_const_none; + } + + // complied successfully, execute it + mp_obj_t module_fun = rt_make_function_from_id(1); // TODO we should return from mp_compile the unique_code_id for the module + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + rt_call_function_0(module_fun); + nlr_pop(); + } else { + // exception; restore context and re-raise same exception + rt_locals_set(old_locals); + rt_globals_set(old_globals); + nlr_jump(nlr.ret_val); + } + rt_locals_set(old_locals); + rt_globals_set(old_globals); + + return module_obj; +} |