diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-02-21 06:07:57 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-02-21 06:07:57 -0800 |
commit | 563b6367a572bc50f8fbec2aeff255c258407862 (patch) | |
tree | dc907e344c6e3526f1215a1cd5ab2b018b32d74d /unwind.c | |
parent | 3f93ddf1acc8b6d3647dec31e7329987d452daa5 (diff) | |
download | txr-563b6367a572bc50f8fbec2aeff255c258407862.tar.gz txr-563b6367a572bc50f8fbec2aeff255c258407862.tar.bz2 txr-563b6367a572bc50f8fbec2aeff255c258407862.zip |
Improved error reporting, particularly for macro expansion.
* eval.c (last_form_expanded): New variable.
(do_expand): New static function; contains previous expand
function.
(expand): Becomes a wrapper for do_expand, with re-entry
counting.
(eval_init): GC-protect last_form_expanded.
* eval.h (last_form_expanded): Declared.
* parser.l (regex_parse, lisp_parse): Just use a simple word for
the name of the regex or string parse location, not the entire
expression itself.
* unwind.c (uw_throw): Check whether expansion was going on
when the unhandled exception was thrown and print additional
information.
Diffstat (limited to 'unwind.c')
-rw-r--r-- | unwind.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -315,12 +315,18 @@ val uw_throw(val sym, val args) val msg_or_args = if3(is_msg, car(args), args); val info = if2(source_loc(last_form_evaled), source_loc_str(last_form_evaled)); + val ex_info = if2(source_loc(last_form_expanded), + source_loc_str(last_form_expanded)); format(std_error, lit("~a: unhandled exception of type ~a:\n"), prog_string, sym, nao); if (info && sym != eval_error_s) - format(std_error, lit("~a: possibly triggered by ~a\n"), - prog_string, info, nao); + format(std_error, lit("~a: possibly triggered at ~a by form ~s\n"), + prog_string, info, last_form_evaled, 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); format(std_error, if3(is_msg, |