about summary refs log tree commit diff
path: root/src/libexpr/get-drvs.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-04-16T13·44+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-04-16T13·44+0000
commit02c1dac90934e1b833c4d6bd9280bda27c146d80 (patch)
treee84f70d93fd75d162099275d3facd6ec9037844c /src/libexpr/get-drvs.cc
parent04c4bd3624b094043ff0f2410c1e376a51f457f7 (diff)
* In an nested `with' where the inner with is a variable (`with ...;
  with someVar; ...'), the contents of the variable would be
  clobbered.  (The attributes in the outer `with' were added to the
  variable.)

Diffstat (limited to 'src/libexpr/get-drvs.cc')
-rw-r--r--src/libexpr/get-drvs.cc13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index 6964e3e3b71f..8af011d54987 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -177,14 +177,15 @@ static void getDerivations(EvalState & state, Value & vIn,
            there are names clashes between derivations, the derivation
            bound to the attribute with the "lower" name should take
            precedence). */
-        StringSet attrs;
+        typedef std::map<string, Symbol> SortedSymbols;
+        SortedSymbols attrs;
         foreach (Bindings::iterator, i, *v.attrs)
-            attrs.insert(i->first);
+            attrs.insert(std::pair<string, Symbol>(i->first, i->first));
 
-        foreach (StringSet::iterator, i, attrs) {
-            startNest(nest, lvlDebug, format("evaluating attribute `%1%'") % *i);
-            string pathPrefix2 = addToPath(pathPrefix, *i);
-            Value & v2((*v.attrs)[state.symbols.create(*i)]);
+        foreach (SortedSymbols::iterator, i, attrs) {
+            startNest(nest, lvlDebug, format("evaluating attribute `%1%'") % i->first);
+            string pathPrefix2 = addToPath(pathPrefix, i->first);
+            Value & v2((*v.attrs)[i->second]);
             if (combineChannels)
                 getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done);
             else if (getDerivation(state, v2, pathPrefix2, drvs, done)) {