diff --git a/py/modmicropython.c b/py/modmicropython.c index b23758291d..1701417579 100644 --- a/py/modmicropython.c +++ b/py/modmicropython.c @@ -24,11 +24,15 @@ * THE SOFTWARE. */ +#include +#include #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 177d56e54c..449f44d3bc 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 3e8de7902b..2ade40b180 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();