out-of-memory handling in LL(k), LR, and GLR backends
This commit is contained in:
parent
5996477a5e
commit
d5f3e13309
3 changed files with 31 additions and 0 deletions
|
|
@ -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 *arena = h_new_arena(mm__, 0); // will hold the results
|
||||||
HArena *tarena = h_new_arena(mm__, 0); // tmp, deleted after parse
|
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)
|
// allocate engine lists (will hold one engine per state)
|
||||||
// these are swapped each iteration
|
// these are swapped each iteration
|
||||||
HSlist *engines = h_slist_new(tarena);
|
HSlist *engines = h_slist_new(tarena);
|
||||||
|
|
|
||||||
|
|
@ -561,6 +561,17 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream*
|
||||||
{
|
{
|
||||||
HLLkState *s = llk_parse_start_(mm__, parser);
|
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);
|
assert(stream->last_chunk);
|
||||||
s->seq = llk_parse_chunk_(s, parser, stream);
|
s->seq = llk_parse_chunk_(s, parser, stream);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
HArena *tarena = h_new_arena(mm__, 0); // tmp, deleted after parse
|
||||||
HLREngine *engine = h_lrengine_new(arena, tarena, table, stream);
|
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
|
// iterate engine to completion
|
||||||
while(h_lrengine_step(engine, h_lrengine_action(engine)));
|
while(h_lrengine_step(engine, h_lrengine_action(engine)));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue