From b68fb2aad15663edfe7c3671c97bd85bc531c565 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 16 Feb 2014 00:59:47 -0800 Subject: Nice idea: how about a function which walks the tree structure and back-fills some missing source code location info. We apply this to macro expansions. If some error occurs in expanded code, this way it is referenced to the line where the macro *call* occurs. Not only is this better than nothing, it may be better than tracing it to the macro definition. Ideally, we would have both places: ("the error is in the code expanded from this macro, at this site"). * eval.c (expand): Use rlcp_tree to back-fill source info in macro expansion by taking it from the unexpanded form. * parser.h (rlcp_tree): Declared. * parser.y (rlcp_tree): New function. --- ChangeLog | 17 +++++++++++++++++ eval.c | 3 +-- parser.h | 1 + parser.y | 13 +++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f0220877..791936d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2014-02-16 Kaz Kylheku + + Nice idea: how about a function which walks the tree structure and + back-fills some missing source code location info. We apply this to + macro expansions. If some error occurs in expanded code, this way it + is referenced to the line where the macro *call* occurs. + Not only is this better than nothing, it may be better than tracing + it to the macro definition. Ideally, we would have both places: + ("the error is in the code expanded from this macro, at this site"). + + * eval.c (expand): Use rlcp_tree to back-fill source info in + macro expansion by taking it from the unexpanded form. + + * parser.h (rlcp_tree): Declared. + + * parser.y (rlcp_tree): New function. + 2014-02-16 Kaz Kylheku Bugfixes: not propagating source loc info in quasiliterals. diff --git a/eval.c b/eval.c index f272db01..0be885d3 100644 --- a/eval.c +++ b/eval.c @@ -2086,8 +2086,7 @@ tail: val mac_expand = expand_macro(form_ex, macro, make_env(nil, nil, nil)); if (mac_expand == form) return form; - if (!source_loc(mac_expand)) - rlcp(mac_expand, form); + rlcp_tree(mac_expand, form); form = mac_expand; goto tail; } else { diff --git a/parser.h b/parser.h index bf582fcb..aa190805 100644 --- a/parser.h +++ b/parser.h @@ -49,5 +49,6 @@ INLINE val rlcp(val to, val from) { return rlset(to, source_loc(from)); } +val rlcp_tree(val to, val from); val regex_parse(val string, val error_stream); val lisp_parse(val source, val error_stream); diff --git a/parser.y b/parser.y index 797d3711..a4a7aa61 100644 --- a/parser.y +++ b/parser.y @@ -1149,6 +1149,19 @@ val rlset(val form, val info) return form; } +val rlcp_tree(val to, val from) +{ + if (atom(to)) { + return nil; + } else { + if (!source_loc(to)) + rlcp(to, from); + for (; consp(to); to = cdr(to)) + rlcp_tree(car(to), from); + return t; + } +} + static wchar_t char_from_name(const wchar_t *name) { static struct { -- cgit v1.2.3