58e0f4ac50
With this patch parse nodes are allocated sequentially in chunks. This reduces fragmentation of the heap and prevents waste at the end of individually allocated parse nodes. Saves roughly 20% of RAM during parse stage.
62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
|
|
#include "py/nlr.h"
|
|
#include "py/obj.h"
|
|
#include "py/compile.h"
|
|
#include "py/runtime0.h"
|
|
#include "py/runtime.h"
|
|
#include "py/stackctrl.h"
|
|
#include "py/gc.h"
|
|
#include "py/repl.h"
|
|
|
|
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
|
|
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
|
|
if (lex == NULL) {
|
|
return;
|
|
}
|
|
|
|
nlr_buf_t nlr;
|
|
if (nlr_push(&nlr) == 0) {
|
|
qstr source_name = lex->source_name;
|
|
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
|
|
mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
|
|
mp_call_function_0(module_fun);
|
|
nlr_pop();
|
|
} else {
|
|
// uncaught exception
|
|
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
mp_stack_set_limit(10240);
|
|
void *heap = malloc(16 * 1024);
|
|
gc_init(heap, (char*)heap + 16 * 1024);
|
|
mp_init();
|
|
do_str("print('hello world!')", MP_PARSE_SINGLE_INPUT);
|
|
mp_deinit();
|
|
return 0;
|
|
}
|
|
|
|
void gc_collect(void) {
|
|
}
|
|
|
|
mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
|
|
return NULL;
|
|
}
|
|
|
|
mp_import_stat_t mp_import_stat(const char *path) {
|
|
return MP_IMPORT_STAT_NO_EXIST;
|
|
}
|
|
|
|
mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) {
|
|
return mp_const_none;
|
|
}
|
|
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
|
|
|
|
void nlr_jump_fail(void *val) {
|
|
}
|