diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | eval.c | 3 | ||||
-rw-r--r-- | parser.h | 1 | ||||
-rw-r--r-- | parser.y | 13 |
4 files changed, 32 insertions, 2 deletions
@@ -1,5 +1,22 @@ 2014-02-16 Kaz Kylheku <kaz@kylheku.com> + 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 <kaz@kylheku.com> + Bugfixes: not propagating source loc info in quasiliterals. * eval.c (expand_quasi): Add some rlcp's here. @@ -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 { @@ -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); @@ -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 { |