mirror of
https://github.com/janet-lang/janet
synced 2024-11-24 17:27:18 +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:
parent
9cc4e48124
commit
39c6be7cb7
@ -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;
|
||||||
|
if (s->flags & PFLAG_CONTAINER) {
|
||||||
args -= s->argn;
|
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);
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user