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)
|
if(!seq)
|
||||||
return NULL; // parse already failed
|
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) {
|
if(s->win.length > 0) {
|
||||||
append_win(kmax, s, chunk);
|
append_win(kmax, s, chunk);
|
||||||
stream = &s->win;
|
stream = &s->win;
|
||||||
|
|
@ -530,8 +537,6 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
|
||||||
return seq;
|
return seq;
|
||||||
|
|
||||||
no_parse:
|
no_parse:
|
||||||
h_delete_arena(arena);
|
|
||||||
s->arena = NULL;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
need_input:
|
need_input:
|
||||||
|
|
@ -550,6 +555,8 @@ static HParseResult *llk_parse_finish_(HAllocator *mm__, HLLkState *s)
|
||||||
if(s->seq) {
|
if(s->seq) {
|
||||||
assert(s->seq->used == 1);
|
assert(s->seq->used == 1);
|
||||||
res = make_result(s->arena, s->seq->elements[0]);
|
res = make_result(s->arena, s->seq->elements[0]);
|
||||||
|
} else {
|
||||||
|
h_delete_arena(s->arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
h_delete_arena(s->tarena);
|
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);
|
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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue