summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-02-26 07:17:07 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-02-26 07:17:07 -0800
commit2a632dc3768f6c65abc8f33192cdcaef4c9a9571 (patch)
tree934bf55bc2702afe186ccd43d8093a3e9869e576
parent0294e98b13a70e91391952e7e24a47407e6d0508 (diff)
downloadtxr-2a632dc3768f6c65abc8f33192cdcaef4c9a9571.tar.gz
txr-2a632dc3768f6c65abc8f33192cdcaef4c9a9571.tar.bz2
txr-2a632dc3768f6c65abc8f33192cdcaef4c9a9571.zip
* eval.c (expand_op): Use rlcp_tree when constructing the
dwim_body, since the append2 copies list structure. * parser.y (n_exprs): propagate source loc info from both constituents, giving precedence to the left one, rather than just taking it from the left one and ignoring the second constituent. This fixes cases of missing location info. The left constituent n_expr is often a symbol, and those do not have location info. We want a case like like ((x) y) to take from (x), and (x (y)) to take it from (y), and so on.
-rw-r--r--ChangeLog13
-rw-r--r--eval.c12
-rw-r--r--parser.y13
3 files changed, 27 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 99baf5ee..0ff96251 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+ * eval.c (expand_op): Use rlcp_tree when constructing the
+ dwim_body, since the append2 copies list structure.
+
+ * parser.y (n_exprs): propagate source loc info from both
+ constituents, giving precedence to the left one, rather than just taking
+ it from the left one and ignoring the second constituent. This fixes
+ cases of missing location info. The left constituent n_expr is often
+ a symbol, and those do not have location info. We want a case like
+ like ((x) y) to take from (x), and (x (y)) to take it from (y),
+ and so on.
+
+2014-02-26 Kaz Kylheku <kaz@kylheku.com>
+
* parser.y (list): For @n_expr, get the source location info
from the @ token.
(n_expr): Bugfix: do not attribute a symbol with location info.
diff --git a/eval.c b/eval.c
index efe4f1d1..a054e867 100644
--- a/eval.c
+++ b/eval.c
@@ -2227,12 +2227,12 @@ static val expand_op(val sym, val body, val menv)
{
uses_or2;
- val dwim_body = rlcp(cons(dwim_s,
- if3(or4(is_op, has_rest, ssyms,
- null(proper_listp(body_trans))),
- body_trans,
- append2(body_trans, rest_gensym))),
- body_trans);
+ val dwim_body = rlcp_tree(cons(dwim_s,
+ if3(or4(is_op, has_rest, ssyms,
+ null(proper_listp(body_trans))),
+ body_trans,
+ append2(body_trans, rest_gensym))),
+ body_trans);
if (sym == do_s)
dwim_body = rlcp(cdr(dwim_body), dwim_body);
diff --git a/parser.y b/parser.y
index 396d097f..b1540c90 100644
--- a/parser.y
+++ b/parser.y
@@ -730,12 +730,15 @@ exprs_opt : exprs { $$ = $1; }
;
n_exprs : n_expr { $$ = rlcp(cons($1, nil), $1); }
- | n_expr n_exprs { $$ = rlcp(cons($1, $2), $1); }
- | n_expr '.' n_expr { $$ = rlcp(cons($1, $3), $1); }
- | n_expr DOTDOT n_exprs { $$ = rlcp(cons(list(cons_s, $1,
+ | n_expr n_exprs { uses_or2;
+ $$ = rlcp(cons($1, $2), or2($1, $2)); }
+ | n_expr '.' n_expr { uses_or2;
+ $$ = rlcp(cons($1, $3), or2($1, $3)); }
+ | n_expr DOTDOT n_exprs { uses_or2;
+ $$ = rlcp(cons(list(cons_s, $1,
car($3), nao),
- cdr($3)), $1); }
- ;
+ cdr($3)), or2($1, $3)); }
+ ;
n_expr : SYMTOK { $$ = sym_helper($1, t); }
| METANUM { $$ = cons(var_s, cons($1, nil));