out-of-memory support for iterative LL(k)

This commit is contained in:
Sven M. Hallberg 2015-12-01 16:48:01 +01:00
parent d5f3e13309
commit 2309bd6da9

View file

@ -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);