summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-09-15 14:56:13 +0100
committerDamien George <damien.p.george@gmail.com>2015-10-12 13:46:01 +0100
commit3c9c3687d6c1001b88ef6dde200566456a1f2641 (patch)
tree23674a035d588eb89c8f8d2d0fb50ed58194bd8a
parent408b74d74ce8de806f8718a02d350b8326d89361 (diff)
downloadmicropython-3c9c3687d6c1001b88ef6dde200566456a1f2641.tar.gz
micropython-3c9c3687d6c1001b88ef6dde200566456a1f2641.zip
py: Add support to call __init__ from a builtin module on first import.
-rw-r--r--py/mpconfig.h5
-rw-r--r--py/objmodule.c11
2 files changed, 16 insertions, 0 deletions
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 500af5e764..ad2fe3ee56 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -406,6 +406,11 @@ typedef double mp_float_t;
#define MICROPY_STREAMS_NON_BLOCK (0)
#endif
+// Whether to call __init__ when importing builtin modules for the first time
+#ifndef MICROPY_MODULE_BUILTIN_INIT
+#define MICROPY_MODULE_BUILTIN_INIT (0)
+#endif
+
// Whether module weak links are supported
#ifndef MICROPY_MODULE_WEAK_LINKS
#define MICROPY_MODULE_WEAK_LINKS (0)
diff --git a/py/objmodule.c b/py/objmodule.c
index 940a8daf25..63cccde2b2 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -215,6 +215,17 @@ mp_obj_t mp_module_get(qstr module_name) {
if (el == NULL) {
return MP_OBJ_NULL;
}
+
+ if (MICROPY_MODULE_BUILTIN_INIT) {
+ // look for __init__ and call it if it exists
+ mp_obj_t dest[2];
+ mp_load_method_maybe(el->value, MP_QSTR___init__, dest);
+ if (dest[0] != MP_OBJ_NULL) {
+ mp_call_method_n_kw(0, 0, dest);
+ // register module so __init__ is not called again
+ mp_module_register(module_name, el->value);
+ }
+ }
}
// module found, return it