From 06e281f7ce356dfcd225d4b4c4e9f6d06a880ef2 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 7 Apr 2020 07:01:16 -0700 Subject: exceptions: improve non-error @(throw) and @(assert). When @(throw) generates a non-error exception that is unhandled, we just want it to continue. In the same situation, an @(assert) should behave as a failed match; that is, the failure of the query material that follows the assert, which activated it, should propagate through the assert. * match.c (v_throw): Return next_spec_k if uw_rthrow returns. (v_assert, h_assert): Return nil if uw_rthrow returns. * txr.1: Expanded @(throw) and @(assert) documentation with discussion of unhandled exceptions. --- match.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'match.c') diff --git a/match.c b/match.c index 39e0dfa2..394843c3 100644 --- a/match.c +++ b/match.c @@ -4092,7 +4092,8 @@ static val v_throw(match_files_ctx *c) { val values = mapcar(pa_123_2(func_n3(txeval_allow_ub), specline, c->bindings), args); - return uw_rthrow(type, values); + uw_rthrow(type, values); + return next_spec_k; } } @@ -4311,7 +4312,7 @@ static val v_assert(match_files_ctx *c) } else if (type) { val values = mapcar(pa_123_2(func_n3(txeval_allow_ub), specline, c->bindings), args); - uw_rthrow(type, values); + return uw_rthrow(type, values); } else { if (c->curfile) typed_error(assert_s, first_spec, lit("assertion (at ~a:~d)"), c->curfile, c->data_lineno, nao); @@ -4548,7 +4549,7 @@ static val h_assert(match_line_ctx *c) } else if (type) { val values = mapcar(pa_123_2(func_n3(txeval_allow_ub), c->specline, c->bindings), elem); - uw_rthrow(type, values); + return uw_rthrow(type, values); } else { if (c->file) typed_error(assert_s, elem, lit("assertion (at ~a:~d)"), c->file, c->data_lineno, nao); -- cgit v1.2.3