From fbc48a469c80201f0d159a9b9f48a22ce5f36984 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 16 Feb 2004 09:18:35 +0000 Subject: [PATCH] * Inherited attributes in recursive attribute sets are in scope of the non-inherited attributes. --- src/libexpr/eval.cc | 13 +++++++------ src/libexpr/nixexpr.cc | 15 +++++++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index eaa4b4ea4..335f44baa 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -100,22 +100,25 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg) ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) { ATMatcher m; + ATerm name; + Expr e2; /* Create the substitution list. */ ATermMap subs; for (ATermIterator i(rbnds); i; ++i) { - ATerm name; - Expr e2; if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) abort(); /* can't happen */ subs.set(name, ATmake("Select(, )", e, name)); } + for (ATermIterator i(nrbnds); i; ++i) { + if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) + abort(); /* can't happen */ + subs.set(name, e2); + } /* Create the non-recursive set. */ ATermMap as; for (ATermIterator i(rbnds); i; ++i) { - ATerm name; - Expr e2; if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) abort(); /* can't happen */ as.set(name, substitute(subs, e2)); @@ -123,8 +126,6 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) /* Copy the non-recursive bindings. !!! inefficient */ for (ATermIterator i(nrbnds); i; ++i) { - ATerm name; - Expr e2; if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) abort(); /* can't happen */ as.set(name, e2); diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 7739e99a9..8fe5d379a 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -205,8 +205,11 @@ Expr substitute(const ATermMap & subs, Expr e) for (ATermIterator i(rbnds); i; ++i) if (atMatch(m, *i) >> "Bind" >> name) subs2.remove(name); - else - abort(); /* can't happen */ + else abort(); /* can't happen */ + for (ATermIterator i(nrbnds); i; ++i) + if (atMatch(m, *i) >> "Bind" >> name) + subs2.remove(name); + else abort(); /* can't happen */ return ATmake("Rec(, )", substitute(subs2, (ATerm) rbnds), substitute(subs, (ATerm) nrbnds)); @@ -264,14 +267,18 @@ void checkVarDefs(const ATermMap & defs, Expr e) } else if (atMatch(m, e) >> "Rec" >> rbnds >> nrbnds) { - checkVarDefs(defs - , (ATerm) nrbnds); + checkVarDefs(defs, (ATerm) nrbnds); ATermMap defs2(defs); for (ATermIterator i(rbnds); i; ++i) { if (!(atMatch(m, *i) >> "Bind" >> name)) abort(); /* can't happen */ defs2.set(name, (ATerm) ATempty); } + for (ATermIterator i(nrbnds); i; ++i) { + if (!(atMatch(m, *i) >> "Bind" >> name)) + abort(); /* can't happen */ + defs2.set(name, (ATerm) ATempty); + } checkVarDefs(defs2, (ATerm) rbnds); }