Skip to content

Commit aee2ba7

Browse files
committed
Add parse_node_free_struct() and use it to free parse tree after compilation.
TODO: Check lexer/parse/compile error path for leaks too.
1 parent c1d200e commit aee2ba7

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

py/parse.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,20 @@ mp_parse_node_struct_t *parse_node_new_struct(int src_line, int rule_id, int num
135135
return pn;
136136
}
137137

138+
int parse_node_free_struct(mp_parse_node_t pn_in) {
139+
int cnt = 0;
140+
if (MP_PARSE_NODE_IS_STRUCT(pn_in)) {
141+
mp_parse_node_struct_t *pn = (mp_parse_node_struct_t *)pn_in;
142+
int n = pn->kind_num_nodes >> 8;
143+
for (int i = 0; i < n; i++) {
144+
cnt += parse_node_free_struct(pn->nodes[i]);
145+
}
146+
m_del_var(mp_parse_node_struct_t, mp_parse_node_t, n, pn);
147+
cnt++;
148+
}
149+
return cnt;
150+
}
151+
138152
#if MICROPY_DEBUG_PRINTERS
139153
void mp_parse_node_print(mp_parse_node_t pn, int indent) {
140154
if (MP_PARSE_NODE_IS_STRUCT(pn)) {

py/parse.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ typedef struct _mp_parse_node_struct_t {
5353
#define MP_PARSE_NODE_STRUCT_NUM_NODES(pns) ((pns)->kind_num_nodes >> 8)
5454

5555
mp_parse_node_t mp_parse_node_new_leaf(machine_int_t kind, machine_int_t arg);
56+
int parse_node_free_struct(mp_parse_node_t pn_in);
5657

5758
void mp_parse_node_print(mp_parse_node_t pn, int indent);
5859

unix/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static void execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind
6262
*/
6363

6464
mp_obj_t module_fun = mp_compile(pn, source_name, is_repl);
65+
parse_node_free_struct(pn);
6566

6667
if (module_fun == mp_const_none) {
6768
// compile error

0 commit comments

Comments
 (0)