aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/eval.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r--src/libexpr/eval.cc21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 11195af77..f94c23ea7 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -43,13 +43,14 @@ static char * dupString(const char * s)
}
+/* Note: Various places expect the allocated memory to be zeroed. */
static void * allocBytes(size_t n)
{
void * p;
#if HAVE_BOEHMGC
p = GC_malloc(n);
#else
- p = malloc(n);
+ p = calloc(n, 1);
#endif
if (!p) throw std::bad_alloc();
return p;
@@ -293,6 +294,10 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
, sWrong(symbols.create("wrong"))
, sStructuredAttrs(symbols.create("__structuredAttrs"))
, sBuilder(symbols.create("builder"))
+ , sArgs(symbols.create("args"))
+ , sOutputHash(symbols.create("outputHash"))
+ , sOutputHashAlgo(symbols.create("outputHashAlgo"))
+ , sOutputHashMode(symbols.create("outputHashMode"))
, repair(NoRepair)
, store(store)
, baseEnv(allocEnv(128))
@@ -308,7 +313,7 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
for (auto & i : _searchPath) addToSearchPath(i);
for (auto & i : paths) addToSearchPath(i);
}
- addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs");
+ addToSearchPath("nix=" + canonPath(settings.nixDataDir + "/nix/corepkgs", true));
if (settings.restrictEval || settings.pureEval) {
allowedPaths = PathSet();
@@ -404,7 +409,7 @@ Path EvalState::toRealPath(const Path & path, const PathSet & context)
};
-void EvalState::addConstant(const string & name, Value & v)
+Value * EvalState::addConstant(const string & name, Value & v)
{
Value * v2 = allocValue();
*v2 = v;
@@ -412,12 +417,18 @@ void EvalState::addConstant(const string & name, Value & v)
baseEnv.values[baseEnvDispl++] = v2;
string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name;
baseEnv.values[0]->attrs->push_back(Attr(symbols.create(name2), v2));
+ return v2;
}
Value * EvalState::addPrimOp(const string & name,
unsigned int arity, PrimOpFun primOp)
{
+ if (arity == 0) {
+ Value v;
+ primOp(*this, noPos, nullptr, v);
+ return addConstant(name, v);
+ }
Value * v = allocValue();
string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name;
Symbol sym = symbols.create(name2);
@@ -576,9 +587,7 @@ Env & EvalState::allocEnv(unsigned int size)
Env * env = (Env *) allocBytes(sizeof(Env) + size * sizeof(Value *));
env->size = size;
- /* Clear the values because maybeThunk() and lookupVar fromWith expect this. */
- for (unsigned i = 0; i < size; ++i)
- env->values[i] = 0;
+ /* We assume that env->values has been cleared by the allocator; maybeThunk() and lookupVar fromWith expect this. */
return *env;
}