summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-12-20 17:42:56 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-12-20 17:42:56 -0800
commit1c9044fb047cadde7e4efa2b110f6a6a80962d1a (patch)
tree48376683f5d2d94dd259ec778e9e771ba020fc47 /eval.c
parentf16d4a0947c00f5256aad67ddca906948a25b4a4 (diff)
downloadtxr-1c9044fb047cadde7e4efa2b110f6a6a80962d1a.tar.gz
txr-1c9044fb047cadde7e4efa2b110f6a6a80962d1a.tar.bz2
txr-1c9044fb047cadde7e4efa2b110f6a6a80962d1a.zip
Streamlining exception handling macros a little bit.
* eval.c (op_unwind_protect): Use uw_simple_catch_begin, and remove the uw_catch (exsym, exvals) clause. Put explicit braces around the unwind code even though it is only one statement. * match.c (do_txeval): Got rid of empty uw_unwind clause. This is not needed any longer. (v_try): Got rid of explicit uw_do_unwind calls. * unwind.h (uw_simple_catch_begin): New macro. (uw_do_unwind): Macro removed. (uw_catch): Added goto uw_unwind_label at the front. This way if the previous clause falls through, control goes to the unwind logic. (uw_unwind): Got rid of initial break. Previous clause should fall through to unwind logic, whether it is the main clause, or one of the catches. (uw_catch_end): Default case aborts, because we don't expect this.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/eval.c b/eval.c
index f67b21af..e7475f9b 100644
--- a/eval.c
+++ b/eval.c
@@ -668,16 +668,13 @@ static val op_unwind_protect(val form, val env)
val cleanup_forms = rest(rest(form));
val result = nil;
- uw_catch_begin(nil, exsym, exvals);
+ uw_simple_catch_begin;
result = eval(prot_form, env, prot_form);
- uw_do_unwind;
-
- uw_catch (exsym, exvals);
-
- uw_unwind
+ uw_unwind {
eval_progn(cleanup_forms, env, cleanup_forms);
+ }
uw_catch_end;