aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-03-02 18:15:06 +0100
committerEelco Dolstra <edolstra@gmail.com>2021-11-04 15:04:00 +0100
commitacd6bddec706e2f180279ca79a0c1a4abac416d6 (patch)
tree8c44c3a63f0698405258f96cfa7c2da51431e803
parentcbfbf71e0821fd79ae4837e7fe03c051437f43dd (diff)
Fix derivation primop
-rw-r--r--src/libexpr/eval.cc12
-rw-r--r--src/libexpr/eval.hh2
-rw-r--r--src/libexpr/primops.cc13
3 files changed, 19 insertions, 8 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 641687f2a..d371a3fb8 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -583,11 +583,17 @@ Value * EvalState::addConstant(const string & name, Value & v)
{
Value * v2 = allocValue();
*v2 = v;
+ addConstant(name, v2);
+ return v2;
+}
+
+
+void EvalState::addConstant(const string & name, Value * v)
+{
staticBaseEnv.vars.emplace_back(symbols.create(name), baseEnvDispl);
- baseEnv.values[baseEnvDispl++] = v2;
+ baseEnv.values[baseEnvDispl++] = v;
string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name;
- baseEnv.values[0]->attrs->push_back(Attr(symbols.create(name2), v2));
- return v2;
+ baseEnv.values[0]->attrs->push_back(Attr(symbols.create(name2), v));
}
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index f87dcdd8e..65cf04b57 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -277,6 +277,8 @@ private:
Value * addConstant(const string & name, Value & v);
+ void addConstant(const string & name, Value * v);
+
constexpr static size_t maxPrimOpArity = 3;
Value * addPrimOp(const string & name,
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 9b166d63c..e4107dbe1 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -3725,18 +3725,21 @@ void EvalState::createBaseEnv()
/* Add a wrapper around the derivation primop that computes the
`drvPath' and `outPath' attributes lazily. */
- staticBaseEnv.sort();
sDerivationNix = symbols.create("//builtin/derivation.nix");
- eval(parse(
- #include "primops/derivation.nix.gen.hh"
- , foFile, sDerivationNix, "/", staticBaseEnv), v);
- addConstant("derivation", v);
+ auto vDerivation = allocValue();
+ addConstant("derivation", vDerivation);
/* Now that we've added all primops, sort the `builtins' set,
because attribute lookups expect it to be sorted. */
baseEnv.values[0]->attrs->sort();
staticBaseEnv.sort();
+
+ /* Note: we have to initialize the 'derivation' constant *after*
+ building baseEnv/staticBaseEnv because it uses 'builtins'. */
+ eval(parse(
+ #include "primops/derivation.nix.gen.hh"
+ , foFile, sDerivationNix, "/", staticBaseEnv), *vDerivation);
}