diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-04-14 06:57:00 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-04-14 06:57:00 -0700 |
commit | 70347eef430a0dc932e4f62f3ac180138a6876e9 (patch) | |
tree | 1af5fff8b00079555b5be10f6eaec914a8304ee1 /parser.c | |
parent | db4cab95813e28e95d76a55b1f2c032521d92c86 (diff) | |
download | txr-70347eef430a0dc932e4f62f3ac180138a6876e9.tar.gz txr-70347eef430a0dc932e4f62f3ac180138a6876e9.tar.bz2 txr-70347eef430a0dc932e4f62f3ac180138a6876e9.zip |
txr-parse: release deferred warnings.
* parser.c (txr_parse): The function must ensure that deferred
warnings are released, if it is not wrapped in a larger
translation unit. If *load-recursive* is false, we release the
warnings after the parser.
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 13 |
1 files changed, 11 insertions, 2 deletions
@@ -798,6 +798,9 @@ val txr_parse(val source_in, val error_stream, val saved_dyn = dyn_env; val parser_obj = ensure_parser(input_stream, name); parser_t *pi = parser_get_impl(self, parser_obj); + val loading = cdr(lookup_var(dyn_env, load_recursive_s)); + + uw_simple_catch_begin; dyn_env = make_env(nil, nil, dyn_env); error_stream = default_null_arg(error_stream); @@ -806,8 +809,14 @@ val txr_parse(val source_in, val error_stream, parse_once(self, input_stream, name); - dyn_env = saved_dyn; - gc_state(gc); + uw_unwind { + dyn_env = saved_dyn; + gc_state(gc); + if (!loading) + uw_release_deferred_warnings(); + } + + uw_catch_end; if (pi->errors || pi->syntax_tree == nao) { if (missingp(error_return_val)) |