Fix #861 - parser/produce caused state to be invalid for parser/state.

parser/produce was leaving a counter in the root state undecremented.
This commit is contained in:
Calvin Rose 2021-11-04 19:38:37 -05:00
parent 9cc4e48124
commit 39c6be7cb7
2 changed files with 19 additions and 1 deletions

View File

@ -746,6 +746,7 @@ Janet janet_parser_produce(JanetParser *parser) {
}
parser->pending--;
parser->argcount--;
parser->states[0].argn--;
return ret;
}
@ -759,6 +760,7 @@ Janet janet_parser_produce_wrapped(JanetParser *parser) {
}
parser->pending--;
parser->argcount--;
parser->states[0].argn--;
return ret;
}
@ -1194,7 +1196,9 @@ static Janet parser_state_frames(const JanetParser *p) {
Janet *args = p->args + p->argcount;
for (int32_t i = count - 1; i >= 0; --i) {
JanetParseState *s = p->states + i;
args -= s->argn;
if (s->flags & PFLAG_CONTAINER) {
args -= s->argn;
}
states->data[i] = janet_wrap_parse_state(s, args, buf, (uint32_t) p->bufcount);
}
return janet_wrap_array(states);

View File

@ -199,4 +199,18 @@
(def stream-env (dofile r))
(assert (= (stream-env :x) 10) "dofile stream 1")
# Issue #861 - should be valgrind clean
(def step1 "(a b c d)\n")
(def step2 "(a b)\n")
(def p1 (parser/new))
(pp (parser/state p1))
(parser/consume p1 step1)
(loop [v :iterate (parser/produce p1)])
(parser/state p1)
(def p2 (parser/clone p1))
(parser/state p2)
(parser/consume p2 step2)
(loop [v :iterate (parser/produce p2)])
(parser/state p2)
(end-suite)