diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-05-31 20:44:51 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-05-31 20:44:51 -0700 |
commit | 5d02e6e736d419c0abc271b6049814598cdc3cb9 (patch) | |
tree | b0bf31dbe17478c9457539ca163838ce9412e474 /parser.c | |
parent | 63dabb4ea67cde0971474c4278d605394af0d1b3 (diff) | |
download | txr-5d02e6e736d419c0abc271b6049814598cdc3cb9.tar.gz txr-5d02e6e736d419c0abc271b6049814598cdc3cb9.tar.bz2 txr-5d02e6e736d419c0abc271b6049814598cdc3cb9.zip |
parser: gc bug in token.
The parser maintains some token objects for one parse job to
the next in the tok_pushback and recent_tok arrays. When the
recent_tok is assigned into the parser, it could be a
wrong-way assignment: the parser is a gen 1 object,
yet the token's semantic value of type val is a gen 0.
* parser.c (lisp_parse_impl, txr_parse): Before re-enabling
gc, indicate that the parser object may have been mutated by a
wrong-way assignment using the mut macro.
* txr.c (txr_main): Likewise.
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 2 |
1 files changed, 2 insertions, 0 deletions
@@ -665,6 +665,7 @@ static val lisp_parse_impl(val self, enum prime_parser prime, for (;;) { int gc = gc_state(0); parse(pi, if3(std_error != std_null, name, lit("")), prime); + mut(parser); gc_state(gc); if (pi->syntax_tree == nao && pi->errors == 0 && !pi->eof) @@ -823,6 +824,7 @@ val txr_parse(val source_in, val error_stream, uw_unwind { dyn_env = saved_dyn; + mut(parser_obj); gc_state(gc); if (!loading) uw_release_deferred_warnings(); |