summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-04-14 06:57:00 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-04-14 06:57:00 -0700
commit70347eef430a0dc932e4f62f3ac180138a6876e9 (patch)
tree1af5fff8b00079555b5be10f6eaec914a8304ee1 /parser.c
parentdb4cab95813e28e95d76a55b1f2c032521d92c86 (diff)
downloadtxr-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.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/parser.c b/parser.c
index bbc1a427..ad892e91 100644
--- a/parser.c
+++ b/parser.c
@@ -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))