From d5f3e133095bb93e5557c95976f9e48476dfcc88 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Mon, 30 Nov 2015 18:07:33 +0100 Subject: [PATCH] out-of-memory handling in LL(k), LR, and GLR backends --- src/backends/glr.c | 10 ++++++++++ src/backends/llk.c | 11 +++++++++++ src/backends/lr.c | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/backends/glr.c b/src/backends/glr.c index e753ea55..535dc286 100644 --- a/src/backends/glr.c +++ b/src/backends/glr.c @@ -198,6 +198,16 @@ HParseResult *h_glr_parse(HAllocator* mm__, const HParser* parser, HInputStream* HArena *arena = h_new_arena(mm__, 0); // will hold the results HArena *tarena = h_new_arena(mm__, 0); // tmp, deleted after parse + // out-of-memory handling + jmp_buf except; + h_arena_set_except(arena, &except); + h_arena_set_except(tarena, &except); + if(setjmp(except)) { + h_delete_arena(arena); + h_delete_arena(tarena); + return NULL; + } + // allocate engine lists (will hold one engine per state) // these are swapped each iteration HSlist *engines = h_slist_new(tarena); diff --git a/src/backends/llk.c b/src/backends/llk.c index 0ab4610a..2f41f912 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -561,6 +561,17 @@ 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); diff --git a/src/backends/lr.c b/src/backends/lr.c index fb256c0b..8f2a0ea4 100644 --- a/src/backends/lr.c +++ b/src/backends/lr.c @@ -388,6 +388,16 @@ HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream* HArena *tarena = h_new_arena(mm__, 0); // tmp, deleted after parse HLREngine *engine = h_lrengine_new(arena, tarena, table, stream); + // out-of-memory handling + jmp_buf except; + h_arena_set_except(arena, &except); + h_arena_set_except(tarena, &except); + if(setjmp(except)) { + h_delete_arena(arena); + h_delete_arena(tarena); + return NULL; + } + // iterate engine to completion while(h_lrengine_step(engine, h_lrengine_action(engine))); -- GitLab