diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-11-25 21:56:55 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-11-25 21:56:55 -0800 |
commit | 45b10ef2b031102899ca189badeb7ec9355f1d2c (patch) | |
tree | 1460832d0c315bd6a9f4869dc336cec92282e37f /unwind.c | |
parent | fc68528cf5a7714848d1f4c6ba855b763c49a85e (diff) | |
download | txr-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.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -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); |