2424 * THE SOFTWARE.
2525 */
2626
27+ #include <stdint.h>
28+ #include <stdio.h>
2729#include "mpconfig.h"
2830#include "misc.h"
2931#include "qstr.h"
3032#include "obj.h"
3133#include "builtin.h"
34+ #include "stackctrl.h"
35+ #include "gc.h"
3236
3337// Various builtins specific to MicroPython runtime,
3438// living in micropython module
3741STATIC mp_obj_t mp_micropython_mem_total () {
3842 return MP_OBJ_NEW_SMALL_INT (m_get_total_bytes_allocated ());
3943}
44+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_mem_total_obj , mp_micropython_mem_total );
4045
4146STATIC mp_obj_t mp_micropython_mem_current () {
4247 return MP_OBJ_NEW_SMALL_INT (m_get_current_bytes_allocated ());
4348}
49+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_mem_current_obj , mp_micropython_mem_current );
4450
4551STATIC mp_obj_t mp_micropython_mem_peak () {
4652 return MP_OBJ_NEW_SMALL_INT (m_get_peak_bytes_allocated ());
4753}
48-
49- STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_mem_total_obj , mp_micropython_mem_total );
50- STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_mem_current_obj , mp_micropython_mem_current );
5154STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_mem_peak_obj , mp_micropython_mem_peak );
55+
56+ mp_obj_t mp_micropython_mem_info (mp_uint_t n_args , const mp_obj_t * args ) {
57+ printf ("mem: total=" UINT_FMT ", current=" UINT_FMT ", peak=" UINT_FMT "\n" ,
58+ m_get_total_bytes_allocated (), m_get_current_bytes_allocated (), m_get_peak_bytes_allocated ());
59+ printf ("stack: " UINT_FMT "\n" , mp_stack_usage ());
60+ #if MICROPY_ENABLE_GC
61+ gc_dump_info ();
62+ if (n_args == 1 ) {
63+ // arg given means dump gc allocation table
64+ gc_dump_alloc_table ();
65+ }
66+ #endif
67+ return mp_const_none ;
68+ }
69+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_micropython_mem_info_obj , 0 , 1 , mp_micropython_mem_info );
70+
71+ STATIC mp_obj_t qstr_info (void ) {
72+ mp_uint_t n_pool , n_qstr , n_str_data_bytes , n_total_bytes ;
73+ qstr_pool_info (& n_pool , & n_qstr , & n_str_data_bytes , & n_total_bytes );
74+ printf ("qstr pool: n_pool=" UINT_FMT ", n_qstr=" UINT_FMT ", n_str_data_bytes=" UINT_FMT ", n_total_bytes=" UINT_FMT "\n" ,
75+ n_pool , n_qstr , n_str_data_bytes , n_total_bytes );
76+ return mp_const_none ;
77+ }
78+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (mp_micropython_qstr_info_obj , qstr_info );
5279#endif
5380
5481#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[] = {
6188 { MP_OBJ_NEW_QSTR (MP_QSTR_mem_total ), (mp_obj_t )& mp_micropython_mem_total_obj },
6289 { MP_OBJ_NEW_QSTR (MP_QSTR_mem_current ), (mp_obj_t )& mp_micropython_mem_current_obj },
6390 { MP_OBJ_NEW_QSTR (MP_QSTR_mem_peak ), (mp_obj_t )& mp_micropython_mem_peak_obj },
91+ { MP_OBJ_NEW_QSTR (MP_QSTR_mem_info ), (mp_obj_t )& mp_micropython_mem_info_obj },
92+ { MP_OBJ_NEW_QSTR (MP_QSTR_qstr_info ), (mp_obj_t )& mp_micropython_qstr_info_obj },
6493#endif
6594#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0 )
6695 { MP_OBJ_NEW_QSTR (MP_QSTR_alloc_emergency_exception_buf ), (mp_obj_t )& mp_alloc_emergency_exception_buf_obj },
0 commit comments