py: Add support to call __init__ from a builtin module on first import.
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 500af5e..ad2fe3e 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -406,6 +406,11 @@
 #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 940a8da..63cccde 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -215,6 +215,17 @@
         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