summaryrefslogtreecommitdiff
path: root/py/parse.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-25 00:56:19 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-25 02:11:59 +0200
commitaee2ba70de774f954a793efb73e72faaf4e6524d (patch)
tree0fc96ca80a0605d7335bddb238fc95ff6568e667 /py/parse.c
parentc1d200ef74c9a76a661cfbb3f2f73db992f0e272 (diff)
Add parse_node_free_struct() and use it to free parse tree after compilation.
TODO: Check lexer/parse/compile error path for leaks too.
Diffstat (limited to 'py/parse.c')
-rw-r--r--py/parse.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/py/parse.c b/py/parse.c
index 3cf909d75..7a8fd3b1f 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -135,6 +135,20 @@ mp_parse_node_struct_t *parse_node_new_struct(int src_line, int rule_id, int num
return pn;
}
+int parse_node_free_struct(mp_parse_node_t pn_in) {
+ int cnt = 0;
+ if (MP_PARSE_NODE_IS_STRUCT(pn_in)) {
+ mp_parse_node_struct_t *pn = (mp_parse_node_struct_t *)pn_in;
+ int n = pn->kind_num_nodes >> 8;
+ for (int i = 0; i < n; i++) {
+ cnt += parse_node_free_struct(pn->nodes[i]);
+ }
+ m_del_var(mp_parse_node_struct_t, mp_parse_node_t, n, pn);
+ cnt++;
+ }
+ return cnt;
+}
+
#if MICROPY_DEBUG_PRINTERS
void mp_parse_node_print(mp_parse_node_t pn, int indent) {
if (MP_PARSE_NODE_IS_STRUCT(pn)) {