summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-04-13 20:53:43 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-04-13 20:53:43 -0700
commit6e6a0e0e8a2391725a916511864acd0e02556703 (patch)
treee632edd82994252149cc12e398aa6396760911b1 /eval.c
parentb6403cfaa935cd7b144cb6c1c15ba9cfacd73441 (diff)
downloadtxr-6e6a0e0e8a2391725a916511864acd0e02556703.tar.gz
txr-6e6a0e0e8a2391725a916511864acd0e02556703.tar.bz2
txr-6e6a0e0e8a2391725a916511864acd0e02556703.zip
Trace expansion more in expansion-time errors.
* eval.c (error_trace): If an error occurs during the expansion of a form, that form may be the result of expansions. Dump those expansions.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index a0926a1d..daa795ba 100644
--- a/eval.c
+++ b/eval.c
@@ -239,7 +239,6 @@ void error_trace(val exsym, val exvals, val out_stream, val prefix)
{
val last = last_form_evaled;
val info = source_loc_str(last, nil);
- val ex_info = source_loc_str(last_form_expanded, nil);
if (cdr(exvals) || !stringp(car(exvals)))
format(out_stream, lit("~a exception args: ~!~s\n"),
@@ -248,9 +247,10 @@ void error_trace(val exsym, val exvals, val out_stream, val prefix)
format(out_stream, lit("~a ~!~a\n"), prefix, car(exvals), nao);
if (info) {
- val first, origin, oinfo;
+ val first, origin, oinfo = nil;
- for (first = t; last; last = origin, info = oinfo, first = nil) {
+ for (first = t; last; last = origin, first = nil) {
+ info = oinfo ? oinfo : info;
origin = lookup_origin(last);
oinfo = source_loc_str(origin, nil);
@@ -280,9 +280,36 @@ void error_trace(val exsym, val exvals, val out_stream, val prefix)
}
}
- if (ex_info)
+ if (last_form_expanded) {
+ uses_or2;
+ val ex_info = source_loc_str(last_form_expanded, nil);
+ val form = last_form_expanded;
+
format(out_stream, lit("~a during expansion at ~a of form ~!~s\n"),
- prefix, ex_info, last_form_expanded, nao);
+ prefix, or2(info, ex_info), last_form_expanded, nao);
+
+ for (;;) {
+ val origin = lookup_origin(form);
+ val oinfo = source_loc_str(origin, nil);
+
+ if (origin) {
+ if (info)
+ format(out_stream, lit("~a ... an expansion at ~a of ~!~s\n"),
+ prefix, oinfo, origin, nao);
+ else
+ format(out_stream, lit("~a ... an expansion of ~!~s\n"),
+ prefix, origin, nao);
+
+ if (origin == form)
+ break;
+
+ form = origin;
+ continue;
+ }
+
+ break;
+ }
+ }
}
val lookup_global_var(val sym)