summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc22
-rw-r--r--src/libexpr/nixexpr.cc24
-rw-r--r--src/libexpr/nixexpr.hh3
-rw-r--r--src/libexpr/parser.y5
4 files changed, 29 insertions, 25 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index b8ec410f39..69632eb37e 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -430,11 +430,12 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
 
         /* The inherited attributes, on the other hand, are
            evaluated in the original environment. */
-        foreach (list<VarRef>::iterator, i, inherited) {
-            Value & v2 = (*v.attrs)[i->name].value;
-            Value * v3 = state.lookupVar(&env, *i);
-            mkCopy(v2, *v3);
-            mkCopy(env2.values[displ++], *v3);
+        foreach (list<Inherited>::iterator, i, inherited) {
+            nix::Attr & a = (*v.attrs)[i->first.name];
+            Value * v2 = state.lookupVar(&env, i->first);
+            mkCopy(a.value, *v2);
+            mkCopy(env2.values[displ++], *v2);
+            a.pos = &i->second;
         }
 
     }
@@ -446,9 +447,10 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
             a.pos = &i->second.second;
         }
 
-        foreach (list<VarRef>::iterator, i, inherited) {
-            Value & v2 = (*v.attrs)[i->name].value;
-            mkCopy(v2, *state.lookupVar(&env, *i));
+        foreach (list<Inherited>::iterator, i, inherited) {
+            nix::Attr & a = (*v.attrs)[i->first.name];
+            mkCopy(a.value, *state.lookupVar(&env, i->first));
+            a.pos = &i->second;
         }
     }
 }
@@ -470,8 +472,8 @@ void ExprLet::eval(EvalState & state, Env & env, Value & v)
 
     /* The inherited attributes, on the other hand, are evaluated in
        the original environment. */
-    foreach (list<VarRef>::iterator, i, attrs->inherited)
-        mkCopy(env2.values[displ++], *state.lookupVar(&env, *i));
+    foreach (list<ExprAttrs::Inherited>::iterator, i, attrs->inherited)
+        mkCopy(env2.values[displ++], *state.lookupVar(&env, i->first));
 
     state.eval(env2, body, v);
 }
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index af0632a94d..898fdb6094 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -55,8 +55,8 @@ void ExprAttrs::show(std::ostream & str)
 {
     if (recursive) str << "rec ";
     str << "{ ";
-    foreach (list<VarRef>::iterator, i, inherited)
-        str << "inherit " << i->name << "; ";
+    foreach (list<Inherited>::iterator, i, inherited)
+        str << "inherit " << i->first.name << "; ";
     foreach (Attrs::iterator, i, attrs)
         str << i->first << " = " << *i->second.first << "; ";
     str << "}";
@@ -91,8 +91,8 @@ void ExprLambda::show(std::ostream & str)
 void ExprLet::show(std::ostream & str)
 {
     str << "let ";
-    foreach (list<VarRef>::iterator, i, attrs->inherited)
-        str << "inherit " << i->name << "; ";
+    foreach (list<ExprAttrs::Inherited>::iterator, i, attrs->inherited)
+        str << "inherit " << i->first.name << "; ";
     foreach (ExprAttrs::Attrs::iterator, i, attrs->attrs)
         str << i->first << " = " << *i->second.first << "; ";
     str << "in " << *body;
@@ -215,9 +215,9 @@ void ExprAttrs::bindVars(const StaticEnv & env)
         foreach (ExprAttrs::Attrs::iterator, i, attrs)
             newEnv.vars[i->first] = displ++;
 
-        foreach (list<VarRef>::iterator, i, inherited) {
-            newEnv.vars[i->name] = displ++;
-            i->bind(env);
+        foreach (list<Inherited>::iterator, i, inherited) {
+            newEnv.vars[i->first.name] = displ++;
+            i->first.bind(env);
         }
 
         foreach (ExprAttrs::Attrs::iterator, i, attrs)
@@ -228,8 +228,8 @@ void ExprAttrs::bindVars(const StaticEnv & env)
         foreach (ExprAttrs::Attrs::iterator, i, attrs)
             i->second.first->bindVars(env);
 
-        foreach (list<VarRef>::iterator, i, inherited)
-            i->bind(env);
+        foreach (list<Inherited>::iterator, i, inherited)
+            i->first.bind(env);
     }
 }
 
@@ -267,9 +267,9 @@ void ExprLet::bindVars(const StaticEnv & env)
     foreach (ExprAttrs::Attrs::iterator, i, attrs->attrs)
         newEnv.vars[i->first] = displ++;
 
-    foreach (list<VarRef>::iterator, i, attrs->inherited) {
-        newEnv.vars[i->name] = displ++;
-        i->bind(env);
+    foreach (list<ExprAttrs::Inherited>::iterator, i, attrs->inherited) {
+        newEnv.vars[i->first.name] = displ++;
+        i->first.bind(env);
     }
 
     foreach (ExprAttrs::Attrs::iterator, i, attrs->attrs)
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 36cb4e53cd..1c72441b27 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -131,9 +131,10 @@ struct ExprAttrs : Expr
 {
     bool recursive;
     typedef std::pair<Expr *, Pos> Attr;
+    typedef std::pair<VarRef, Pos> Inherited;
     typedef std::map<Symbol, Attr> Attrs;
     Attrs attrs;
-    list<VarRef> inherited;
+    list<Inherited> inherited;
     std::map<Symbol, Pos> attrNames; // used during parsing
     ExprAttrs() : recursive(false) { };
     COMMON_METHODS
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 99980240f8..7236bab19c 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -377,8 +377,9 @@ binds
       foreach (vector<Symbol>::iterator, i, *$3) {
           if ($$->attrNames.find(*i) != $$->attrNames.end())
               dupAttr(*i, makeCurPos(@3, data), $$->attrNames[*i]);
-          $$->inherited.push_back(*i);
-          $$->attrNames[*i] = makeCurPos(@3, data);
+          Pos pos = makeCurPos(@3, data);
+          $$->inherited.push_back(ExprAttrs::Inherited(*i, pos));
+          $$->attrNames[*i] = pos;
       }
     }
   | binds INHERIT '(' expr ')' ids ';'