1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-28 11:09:54 +00:00

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

View File

@ -199,4 +199,18 @@
(def stream-env (dofile r)) (def stream-env (dofile r))
(assert (= (stream-env :x) 10) "dofile stream 1") (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) (end-suite)