diff options
Diffstat (limited to 'py')
-rw-r--r-- | py/builtin.h | 1 | ||||
-rw-r--r-- | py/builtinimport.c | 6 | ||||
-rw-r--r-- | py/builtintables.c | 1 | ||||
-rw-r--r-- | py/modsys.c | 48 | ||||
-rw-r--r-- | py/mpconfig.h | 5 | ||||
-rw-r--r-- | py/py.mk | 1 | ||||
-rw-r--r-- | py/runtime.c | 11 | ||||
-rw-r--r-- | py/runtime.h | 6 |
8 files changed, 62 insertions, 17 deletions
diff --git a/py/builtin.h b/py/builtin.h index a29844498f..bf65b48329 100644 --- a/py/builtin.h +++ b/py/builtin.h @@ -42,3 +42,4 @@ extern const mp_obj_module_t mp_module_io; extern const mp_obj_module_t mp_module_math; extern const mp_obj_module_t mp_module_micropython; extern const mp_obj_module_t mp_module_struct; +extern const mp_obj_module_t mp_module_sys; diff --git a/py/builtinimport.c b/py/builtinimport.c index 697244878f..578e73feb6 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -28,8 +28,6 @@ #define PATH_SEP_CHAR '/' -mp_obj_t mp_sys_path; - mp_import_stat_t stat_dir_or_file(vstr_t *path) { //printf("stat %s\n", vstr_str(path)); mp_import_stat_t stat = mp_import_stat(vstr_str(path)); @@ -48,9 +46,7 @@ mp_import_stat_t find_file(const char *file_str, uint file_len, vstr_t *dest) { // extract the list of paths uint path_num = 0; mp_obj_t *path_items; - if (mp_sys_path != MP_OBJ_NULL) { - mp_obj_list_get(mp_sys_path, &path_num, &path_items); - } + mp_obj_list_get(mp_sys_path, &path_num, &path_items); if (path_num == 0) { // mp_sys_path is empty, so just use the given file name diff --git a/py/builtintables.c b/py/builtintables.c index e2007f3b41..23c34eda11 100644 --- a/py/builtintables.c +++ b/py/builtintables.c @@ -134,6 +134,7 @@ STATIC const mp_map_elem_t mp_builtin_module_table[] = { #if MICROPY_ENABLE_FLOAT { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&mp_module_math }, #endif + { MP_OBJ_NEW_QSTR(MP_QSTR_sys), (mp_obj_t)&mp_module_sys }, // extra builtin modules as defined by a port MICROPY_EXTRA_BUILTIN_MODULES diff --git a/py/modsys.c b/py/modsys.c new file mode 100644 index 0000000000..7f8cd68a8d --- /dev/null +++ b/py/modsys.c @@ -0,0 +1,48 @@ +#include "misc.h" +#include "mpconfig.h" +#include "qstr.h" +#include "obj.h" +#include "builtin.h" +#include "runtime.h" +#include "objlist.h" + +#if MICROPY_ENABLE_MOD_SYS + +// These should be implemented by ports, specific types don't matter, +// only addresses. +struct _dummy_t; +extern struct _dummy_t mp_sys_stdin_obj; +extern struct _dummy_t mp_sys_stdout_obj; +extern struct _dummy_t mp_sys_stderr_obj; + +mp_obj_list_t mp_sys_path_obj; +mp_obj_list_t mp_sys_argv_obj; + +STATIC const mp_map_elem_t mp_module_sys_globals_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_sys) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_path), (mp_obj_t)&mp_sys_path_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_argv), (mp_obj_t)&mp_sys_argv_obj }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_stdin), (mp_obj_t)&mp_sys_stdin_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_stdout), (mp_obj_t)&mp_sys_stdout_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_stderr), (mp_obj_t)&mp_sys_stderr_obj }, +}; + +STATIC const mp_obj_dict_t mp_module_sys_globals = { + .base = {&mp_type_dict}, + .map = { + .all_keys_are_qstrs = 1, + .table_is_fixed_array = 1, + .used = sizeof(mp_module_sys_globals_table) / sizeof(mp_map_elem_t), + .alloc = sizeof(mp_module_sys_globals_table) / sizeof(mp_map_elem_t), + .table = (mp_map_elem_t*)mp_module_sys_globals_table, + }, +}; + +const mp_obj_module_t mp_module_sys = { + .base = { &mp_type_module }, + .name = MP_QSTR_sys, + .globals = (mp_obj_dict_t*)&mp_module_sys_globals, +}; + +#endif diff --git a/py/mpconfig.h b/py/mpconfig.h index 2c118b4bba..119d0177dd 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -120,6 +120,11 @@ typedef double mp_float_t; #define MICROPY_ENABLE_MOD_STRUCT (1) #endif +// Whether to provide "sys" module +#ifndef MICROPY_ENABLE_MOD_SYS +#define MICROPY_ENABLE_MOD_SYS (1) +#endif + // Whether to support slice object and correspondingly // slice subscript operators #ifndef MICROPY_ENABLE_SLICE @@ -82,6 +82,7 @@ PY_O_BASENAME = \ modmath.o \ modmicropython.o \ modstruct.o \ + modsys.o \ vm.o \ showbc.o \ repl.o \ diff --git a/py/runtime.c b/py/runtime.c index 053367e3f7..ed01193628 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -53,17 +53,6 @@ void mp_init(void) { // locals = globals for outer module (see Objects/frameobject.c/PyFrame_New()) dict_locals = dict_globals = &dict_main; - -#if MICROPY_CPYTHON_COMPAT - // Precreate sys module, so "import sys" didn't throw exceptions. - mp_obj_t m_sys = mp_obj_new_module(MP_QSTR_sys); - // Avoid warning of unused var - (void)m_sys; -#endif - // init sys.path - // for efficiency, left to platform-specific startup code - //mp_sys_path = mp_obj_new_list(0, NULL); - //mp_store_attr(m_sys, MP_QSTR_path, mp_sys_path); } void mp_deinit(void) { diff --git a/py/runtime.h b/py/runtime.h index 867d633520..bf3d3da3ca 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -60,8 +60,12 @@ mp_vm_return_kind_t mp_resume(mp_obj_t self_in, mp_obj_t send_value, mp_obj_t th mp_obj_t mp_make_raise_obj(mp_obj_t o); -extern mp_obj_t mp_sys_path; mp_map_t *mp_loaded_modules_get(void); mp_obj_t mp_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level); mp_obj_t mp_import_from(mp_obj_t module, qstr name); void mp_import_all(mp_obj_t module); + +extern struct _mp_obj_list_t mp_sys_path_obj; +extern struct _mp_obj_list_t mp_sys_argv_obj; +#define mp_sys_path ((mp_obj_t)&mp_sys_path_obj) +#define mp_sys_argv ((mp_obj_t)&mp_sys_argv_obj) |