out-of-memory support for iterative LL(k)
This commit is contained in:
parent
d5f3e13309
commit
2309bd6da9
1 changed files with 9 additions and 13 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue