summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/builtin.h1
-rw-r--r--py/builtinimport.c6
-rw-r--r--py/builtintables.c1
-rw-r--r--py/modsys.c48
-rw-r--r--py/mpconfig.h5
-rw-r--r--py/py.mk1
-rw-r--r--py/runtime.c11
-rw-r--r--py/runtime.h6
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
diff --git a/py/py.mk b/py/py.mk
index 23ba9ebe74..09b40566d5 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -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)