From 2309bd6da901c2a8287463e5d4e408aa6f456e77 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Tue, 1 Dec 2015 16:48:01 +0100 Subject: [PATCH] out-of-memory support for iterative LL(k) --- src/backends/llk.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/backends/llk.c b/src/backends/llk.c index 2f41f912..3780cf1b 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -389,6 +389,13 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser, if(!seq) return NULL; // parse already failed + // out-of-memory handling + jmp_buf except; + h_arena_set_except(arena, &except); + h_arena_set_except(tarena, &except); + if(setjmp(except)) + goto no_parse; + if(s->win.length > 0) { append_win(kmax, s, chunk); stream = &s->win; @@ -530,8 +537,6 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser, return seq; no_parse: - h_delete_arena(arena); - s->arena = NULL; return NULL; need_input: @@ -550,6 +555,8 @@ static HParseResult *llk_parse_finish_(HAllocator *mm__, HLLkState *s) if(s->seq) { assert(s->seq->used == 1); res = make_result(s->arena, s->seq->elements[0]); + } else { + h_delete_arena(s->arena); } h_delete_arena(s->tarena); @@ -561,17 +568,6 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream* { HLLkState *s = llk_parse_start_(mm__, parser); - // out-of-memory handling - jmp_buf except; - h_arena_set_except(s->arena, &except); - h_arena_set_except(s->tarena, &except); - if(setjmp(except)) { - h_delete_arena(s->arena); - h_delete_arena(s->tarena); - h_free(s); - return NULL; - } - assert(stream->last_chunk); s->seq = llk_parse_chunk_(s, parser, stream); -- GitLab