blob: 170141757957285b213c7184795511803cce7bd0 [file] [log] [blame]
Damien George04b91472014-05-03 23:27:38 +01001/*
2 * This file is part of the Micro Python project, http://micropython.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2013, 2014 Damien P. George
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
26
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020027#include <stdint.h>
28#include <stdio.h>
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020029#include "mpconfig.h"
Paul Sokolovsky59c675a2014-06-21 22:43:22 +030030#include "misc.h"
Damien George55baff42014-01-21 21:40:13 +000031#include "qstr.h"
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020032#include "obj.h"
33#include "builtin.h"
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020034#include "stackctrl.h"
35#include "gc.h"
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020036
37// Various builtins specific to MicroPython runtime,
38// living in micropython module
39
40#if MICROPY_MEM_STATS
Damien George0c36da02014-03-08 15:24:39 +000041STATIC mp_obj_t mp_micropython_mem_total() {
Damien Georgebb4c6f32014-07-31 10:49:14 +010042 return MP_OBJ_NEW_SMALL_INT(m_get_total_bytes_allocated());
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020043}
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020044STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_total_obj, mp_micropython_mem_total);
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020045
Damien George0c36da02014-03-08 15:24:39 +000046STATIC mp_obj_t mp_micropython_mem_current() {
Damien Georgebb4c6f32014-07-31 10:49:14 +010047 return MP_OBJ_NEW_SMALL_INT(m_get_current_bytes_allocated());
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020048}
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020049STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_current_obj, mp_micropython_mem_current);
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020050
Damien George0c36da02014-03-08 15:24:39 +000051STATIC mp_obj_t mp_micropython_mem_peak() {
Damien Georgebb4c6f32014-07-31 10:49:14 +010052 return MP_OBJ_NEW_SMALL_INT(m_get_peak_bytes_allocated());
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020053}
Damien George0c36da02014-03-08 15:24:39 +000054STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_peak_obj, mp_micropython_mem_peak);
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020055
56mp_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}
69STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_micropython_mem_info_obj, 0, 1, mp_micropython_mem_info);
70
71STATIC 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}
78STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_qstr_info_obj, qstr_info);
Paul Sokolovsky440cc3f2014-01-20 01:53:15 +020079#endif
Damien George91d457a2014-01-20 10:30:24 +000080
Dave Hylands5b7fd202014-07-01 23:46:53 -070081#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
82STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_alloc_emergency_exception_buf_obj, mp_alloc_emergency_exception_buf);
83#endif
84
Damien George0c36da02014-03-08 15:24:39 +000085STATIC const mp_map_elem_t mp_module_micropython_globals_table[] = {
86 { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_micropython) },
Damien George91d457a2014-01-20 10:30:24 +000087#if MICROPY_MEM_STATS
Damien George0c36da02014-03-08 15:24:39 +000088 { MP_OBJ_NEW_QSTR(MP_QSTR_mem_total), (mp_obj_t)&mp_micropython_mem_total_obj },
89 { MP_OBJ_NEW_QSTR(MP_QSTR_mem_current), (mp_obj_t)&mp_micropython_mem_current_obj },
90 { MP_OBJ_NEW_QSTR(MP_QSTR_mem_peak), (mp_obj_t)&mp_micropython_mem_peak_obj },
Paul Sokolovsky6e8ff9c2014-12-01 20:41:56 +020091 { 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 },
Damien George91d457a2014-01-20 10:30:24 +000093#endif
Dave Hylands5b7fd202014-07-01 23:46:53 -070094#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
95 { MP_OBJ_NEW_QSTR(MP_QSTR_alloc_emergency_exception_buf), (mp_obj_t)&mp_alloc_emergency_exception_buf_obj },
96#endif
Damien George0c36da02014-03-08 15:24:39 +000097};
98
Damien George3b603f22014-11-29 14:39:27 +000099STATIC MP_DEFINE_CONST_DICT(mp_module_micropython_globals, mp_module_micropython_globals_table);
Damien George0c36da02014-03-08 15:24:39 +0000100
101const mp_obj_module_t mp_module_micropython = {
102 .base = { &mp_type_module },
103 .name = MP_QSTR_micropython,
Damien George8b0535e2014-04-05 21:53:54 +0100104 .globals = (mp_obj_dict_t*)&mp_module_micropython_globals,
Damien George0c36da02014-03-08 15:24:39 +0000105};