summaryrefslogtreecommitdiffstats
path: root/unwind.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-11-25 21:56:55 -0800
committerKaz Kylheku <kaz@kylheku.com>2015-11-25 21:56:55 -0800
commit45b10ef2b031102899ca189badeb7ec9355f1d2c (patch)
tree1460832d0c315bd6a9f4869dc336cec92282e37f /unwind.c
parentfc68528cf5a7714848d1f4c6ba855b763c49a85e (diff)
downloadtxr-45b10ef2b031102899ca189badeb7ec9355f1d2c.tar.gz
txr-45b10ef2b031102899ca189badeb7ec9355f1d2c.tar.bz2
txr-45b10ef2b031102899ca189badeb7ec9355f1d2c.zip
Report chain of macro-expansions in errors.
* eval.c (origin_hash): New global variable. (lookup_origin): New function. (expand_macro): Enter original form into origin hash, keyed by new form. (eval_init): gc-protect and initialize origin_hash. * eval.h (lookup_origin): Declared. * parser.c (repl): Report chain of expansions from last_form_evaled. * unwind.c (uw_throw): Likewise.
Diffstat (limited to 'unwind.c')
-rw-r--r--unwind.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/unwind.c b/unwind.c
index 3846fa5c..866a6c4b 100644
--- a/unwind.c
+++ b/unwind.c
@@ -535,13 +535,21 @@ val uw_throw(val sym, val args)
val msg_or_args = if3(is_msg, car(args), args);
val info = source_loc_str(last_form_evaled, nil);
val ex_info = source_loc_str(last_form_expanded, nil);
+ val origin = last_form_evaled;
format(std_error, lit("~a: unhandled exception of type ~a:\n"),
prog_string, sym, nao);
- if (info && sym != eval_error_s)
+ if (info && sym != eval_error_s) {
format(std_error, lit("~a: possibly triggered at ~a by form ~!~s\n"),
prog_string, info, last_form_evaled, nao);
+ while ((origin = lookup_origin(origin))) {
+ val oinfo = source_loc_str(origin, lit("(n/a)"));
+ format(std_error, lit("~a: which is an expansion at ~a of ~!~s\n"),
+ prog_string, oinfo, origin, nao);
+ }
+ }
+
if (ex_info)
format(std_error, lit("~a: during expansion at ~a of form ~!~s\n"),
prog_string, ex_info, last_form_expanded, nao);