summaryrefslogtreecommitdiff
path: root/py/parse.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-09-05 18:17:27 +1000
committerDamien George <damien@micropython.org>2023-09-14 13:03:31 +1000
commit5e122b11eaee64bbece2ace08fc3f994d5f83f2e (patch)
treec9cc411960d8524002c1817945168f8b1ee6d006 /py/parse.c
parentc9089e71a1b9202aa5abefbb3c9c29659ec838ab (diff)
py/parse: Always free lexer even if an exception is raised.
Fixes issue #3843. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/parse.c')
-rw-r--r--py/parse.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/py/parse.c b/py/parse.c
index 0dd56e455..e86103ed8 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -1023,6 +1023,9 @@ STATIC void push_result_rule(parser_t *parser, size_t src_line, uint8_t rule_id,
}
mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
+ // Set exception handler to free the lexer if an exception is raised.
+ MP_DEFINE_NLR_JUMP_CALLBACK_FUNCTION_1(ctx, mp_lexer_free, lex);
+ nlr_push_jump_callback(&ctx.callback, mp_call_function_1_from_nlr_jump_callback);
// initialise parser and allocate memory for its stacks
@@ -1370,8 +1373,8 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
m_del(rule_stack_t, parser.rule_stack, parser.rule_stack_alloc);
m_del(mp_parse_node_t, parser.result_stack, parser.result_stack_alloc);
- // we also free the lexer on behalf of the caller
- mp_lexer_free(lex);
+ // Deregister exception handler and free the lexer.
+ nlr_pop_jump_callback(true);
return parser.tree;
}