Merge pull request #214 from pfalcon/compile-mem-leaks
Memory leaks in lexer/compiler
This commit is contained in:
commit
d552db426b
10
py/compile.c
10
py/compile.c
|
@ -3156,6 +3156,12 @@ mp_obj_t mp_compile(mp_parse_node_t pn, qstr source_file, bool is_repl) {
|
|||
|
||||
bool had_error = comp->had_error;
|
||||
m_del_obj(compiler_t, comp);
|
||||
uint unique_code_id = module_scope->unique_code_id;
|
||||
for (scope_t *s = module_scope; s;) {
|
||||
scope_t *next = s->next;
|
||||
scope_free(s);
|
||||
s = next;
|
||||
}
|
||||
|
||||
if (had_error) {
|
||||
// TODO return a proper error message
|
||||
|
@ -3163,11 +3169,11 @@ mp_obj_t mp_compile(mp_parse_node_t pn, qstr source_file, bool is_repl) {
|
|||
} else {
|
||||
#if MICROPY_EMIT_CPYTHON
|
||||
// can't create code, so just return true
|
||||
(void)module_scope; // to suppress warning that module_scope is unused
|
||||
(void)unique_code_id; // to suppress warning that module_scope is unused
|
||||
return mp_const_true;
|
||||
#else
|
||||
// return function that executes the outer module
|
||||
return rt_make_function_from_id(module_scope->unique_code_id);
|
||||
return rt_make_function_from_id(unique_code_id);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -691,6 +691,7 @@ void mp_lexer_free(mp_lexer_t *lex) {
|
|||
lex->stream_close(lex->stream_data);
|
||||
}
|
||||
vstr_clear(&lex->vstr);
|
||||
m_del(uint16_t, lex->indent_level, lex->alloc_indent_level);
|
||||
m_del_obj(mp_lexer_t, lex);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,6 +60,11 @@ scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, qstr source_file, uint
|
|||
return scope;
|
||||
}
|
||||
|
||||
void scope_free(scope_t *scope) {
|
||||
m_del(id_info_t, scope->id_info, scope->id_info_alloc);
|
||||
m_del(scope_t, scope, 1);
|
||||
}
|
||||
|
||||
id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added) {
|
||||
for (int i = 0; i < scope->id_info_len; i++) {
|
||||
if (scope->id_info[i].qstr == qstr) {
|
||||
|
|
|
@ -56,6 +56,7 @@ typedef struct _scope_t {
|
|||
} scope_t;
|
||||
|
||||
scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, qstr source_file, uint unique_code_id, uint emit_options);
|
||||
void scope_free(scope_t *scope);
|
||||
id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added);
|
||||
id_info_t *scope_find(scope_t *scope, qstr qstr);
|
||||
id_info_t *scope_find_global(scope_t *scope, qstr qstr);
|
||||
|
|
Loading…
Reference in New Issue