Implement "from module import *" construct.
diff --git a/py/runtime.c b/py/runtime.c
index f12b3e6..d15a38e 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -1016,6 +1016,17 @@
return x;
}
+void rt_import_all(mp_obj_t module) {
+ DEBUG_printf("import all %p\n", module);
+
+ mp_map_t *map = mp_obj_module_get_globals(module);
+ for (uint i = 0; i < map->alloc; i++) {
+ if (map->table[i].key != MP_OBJ_NULL) {
+ rt_store_name(MP_OBJ_QSTR_VALUE(map->table[i].key), map->table[i].value);
+ }
+ }
+}
+
mp_map_t *rt_locals_get(void) {
return map_locals;
}
diff --git a/py/runtime.h b/py/runtime.h
index 20595c6..f5a9f2a 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -39,6 +39,7 @@
mp_obj_t rt_iternext(mp_obj_t o);
mp_obj_t rt_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level);
mp_obj_t rt_import_from(mp_obj_t module, qstr name);
+void rt_import_all(mp_obj_t module);
struct _mp_map_t;
struct _mp_map_t *rt_locals_get(void);
diff --git a/py/showbc.c b/py/showbc.c
index 9dfbc88..e3387db 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -390,6 +390,10 @@
printf("IMPORT_FROM %s", qstr_str(qstr));
break;
+ case MP_BC_IMPORT_STAR:
+ printf("IMPORT_STAR");
+ break;
+
default:
printf("code %p, byte code 0x%02x not implemented\n", ip, op);
assert(0);
diff --git a/py/vm.c b/py/vm.c
index 1d47076..10db35e 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -595,6 +595,10 @@
PUSH(obj1);
break;
+ case MP_BC_IMPORT_STAR:
+ rt_import_all(TOP());
+ break;
+
default:
printf("code %p, byte code 0x%02x not implemented\n", ip, op);
assert(0);