diff --git a/py/modmicropython.c b/py/modmicropython.c
index b23758291dd03af6c84f09df7ab76e61e40e1fa6..170141757957285b213c7184795511803cce7bd0 100644
--- a/py/modmicropython.c
+++ b/py/modmicropython.c
@@ -24,11 +24,15 @@
  * THE SOFTWARE.
  */
 
+#include <stdint.h>
+#include <stdio.h>
 #include "mpconfig.h"
 #include "misc.h"
 #include "qstr.h"
 #include "obj.h"
 #include "builtin.h"
+#include "stackctrl.h"
+#include "gc.h"
 
 // Various builtins specific to MicroPython runtime,
 // living in micropython module
@@ -37,18 +41,41 @@
 STATIC mp_obj_t mp_micropython_mem_total() {
     return MP_OBJ_NEW_SMALL_INT(m_get_total_bytes_allocated());
 }
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_total_obj, mp_micropython_mem_total);
 
 STATIC mp_obj_t mp_micropython_mem_current() {
     return MP_OBJ_NEW_SMALL_INT(m_get_current_bytes_allocated());
 }
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_current_obj, mp_micropython_mem_current);
 
 STATIC mp_obj_t mp_micropython_mem_peak() {
     return MP_OBJ_NEW_SMALL_INT(m_get_peak_bytes_allocated());
 }
-
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_total_obj, mp_micropython_mem_total);
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_current_obj, mp_micropython_mem_current);
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_peak_obj, mp_micropython_mem_peak);
+
+mp_obj_t mp_micropython_mem_info(mp_uint_t n_args, const mp_obj_t *args) {
+    printf("mem: total=" UINT_FMT ", current=" UINT_FMT ", peak=" UINT_FMT "\n",
+        m_get_total_bytes_allocated(), m_get_current_bytes_allocated(), m_get_peak_bytes_allocated());
+    printf("stack: " UINT_FMT "\n", mp_stack_usage());
+#if MICROPY_ENABLE_GC
+    gc_dump_info();
+    if (n_args == 1) {
+        // arg given means dump gc allocation table
+        gc_dump_alloc_table();
+    }
+#endif
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_micropython_mem_info_obj, 0, 1, mp_micropython_mem_info);
+
+STATIC mp_obj_t qstr_info(void) {
+    mp_uint_t n_pool, n_qstr, n_str_data_bytes, n_total_bytes;
+    qstr_pool_info(&n_pool, &n_qstr, &n_str_data_bytes, &n_total_bytes);
+    printf("qstr pool: n_pool=" UINT_FMT ", n_qstr=" UINT_FMT ", n_str_data_bytes=" UINT_FMT ", n_total_bytes=" UINT_FMT "\n",
+        n_pool, n_qstr, n_str_data_bytes, n_total_bytes);
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_qstr_info_obj, qstr_info);
 #endif
 
 #if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
@@ -61,6 +88,8 @@ STATIC const mp_map_elem_t mp_module_micropython_globals_table[] = {
     { MP_OBJ_NEW_QSTR(MP_QSTR_mem_total), (mp_obj_t)&mp_micropython_mem_total_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_mem_current), (mp_obj_t)&mp_micropython_mem_current_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_mem_peak), (mp_obj_t)&mp_micropython_mem_peak_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_mem_info), (mp_obj_t)&mp_micropython_mem_info_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_qstr_info), (mp_obj_t)&mp_micropython_qstr_info_obj },
 #endif
 #if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
     { MP_OBJ_NEW_QSTR(MP_QSTR_alloc_emergency_exception_buf), (mp_obj_t)&mp_alloc_emergency_exception_buf_obj },
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 177d56e54c8422641c542a372bb60f9fd6871107..449f44d3bc0f99db9a640e7b19e2e1313002ca8b 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -363,6 +363,8 @@ Q(rect)
 Q(mem_total)
 Q(mem_current)
 Q(mem_peak)
+Q(mem_info)
+Q(qstr_info)
 #endif
 
 #if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
diff --git a/unix/main.c b/unix/main.c
index 3e8de7902ba9fb5eac0c9c07db5d972d46dd200f..2ade40b1800875ecba82bf295ff90d1595425348 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -267,31 +267,6 @@ int usage(char **argv) {
     return 1;
 }
 
-#if MICROPY_MEM_STATS
-STATIC mp_obj_t mem_info(mp_uint_t n_args, const mp_obj_t *args) {
-    printf("mem: total=" UINT_FMT ", current=" UINT_FMT ", peak=" UINT_FMT "\n",
-        m_get_total_bytes_allocated(), m_get_current_bytes_allocated(), m_get_peak_bytes_allocated());
-    printf("stack: " UINT_FMT "\n", mp_stack_usage());
-#if MICROPY_ENABLE_GC
-    gc_dump_info();
-    if (n_args == 1) {
-        // arg given means dump gc allocation table
-        gc_dump_alloc_table();
-    }
-#endif
-    return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mem_info_obj, 0, 1, mem_info);
-#endif
-
-STATIC mp_obj_t qstr_info(void) {
-    mp_uint_t n_pool, n_qstr, n_str_data_bytes, n_total_bytes;
-    qstr_pool_info(&n_pool, &n_qstr, &n_str_data_bytes, &n_total_bytes);
-    printf("qstr pool: n_pool=" UINT_FMT ", n_qstr=" UINT_FMT ", n_str_data_bytes=" UINT_FMT ", n_total_bytes=" UINT_FMT "\n", n_pool, n_qstr, n_str_data_bytes, n_total_bytes);
-    return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qstr_info_obj, qstr_info);
-
 // Process options which set interpreter init options
 void pre_process_options(int argc, char **argv) {
     for (int a = 1; a < argc; a++) {
@@ -407,11 +382,6 @@ int main(int argc, char **argv) {
 
     mp_obj_list_init(mp_sys_argv, 0);
 
-    #if MICROPY_MEM_STATS
-    mp_store_name(qstr_from_str("mem_info"), (mp_obj_t*)&mem_info_obj);
-    #endif
-    mp_store_name(qstr_from_str("qstr_info"), (mp_obj_t*)&qstr_info_obj);
-
     // Here is some example code to create a class and instance of that class.
     // First is the Python, then the C code.
     //
@@ -520,7 +490,8 @@ int main(int argc, char **argv) {
     }
 
     if (mp_verbose_flag) {
-        mem_info(0, NULL);
+        extern mp_obj_t mp_micropython_mem_info(mp_uint_t n_args, const mp_obj_t *args);
+        mp_micropython_mem_info(0, NULL);
     }
 
     mp_deinit();