aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/eval.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-02-04 00:33:13 +0100
committerEelco Dolstra <edolstra@gmail.com>2022-02-04 00:33:13 +0100
commit4c755c3b3fc427afe192d223b37c288c88cc57d5 (patch)
tree2cf2973f2a6d1b1a204efc4adafee82bff95f7d7 /src/libexpr/eval.cc
parent1aa5994e6d7bfb32895264c3a2f1d94cc7272a72 (diff)
parent50efc5499a7d924828bed654be207a846c040fa0 (diff)
Merge branch 'issue-3505' of https://github.com/kamadorueda/nix
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r--src/libexpr/eval.cc19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 3ebbdca63..afde29d11 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1138,7 +1138,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
Hence we need __overrides.) */
if (hasOverrides) {
Value * vOverrides = (*v.attrs)[overrides->second.displ].value;
- state.forceAttrs(*vOverrides);
+ state.forceAttrs(*vOverrides, vOverrides->determinePos(noPos));
Bindings * newBnds = state.allocBindings(v.attrs->capacity() + vOverrides->attrs->size());
for (auto & i : *v.attrs)
newBnds->push_back(i);
@@ -1286,7 +1286,7 @@ void ExprOpHasAttr::eval(EvalState & state, Env & env, Value & v)
e->eval(state, env, vTmp);
for (auto & i : attrPath) {
- state.forceValue(*vAttrs);
+ state.forceValue(*vAttrs, noPos);
Bindings::iterator j;
Symbol name = getName(i, state, env);
if (vAttrs->type() != nAttrs ||
@@ -1500,14 +1500,15 @@ void EvalState::incrFunctionCall(ExprLambda * fun)
void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res)
{
- forceValue(fun);
+ Pos pos = fun.determinePos(noPos);
+ forceValue(fun, pos);
if (fun.type() == nAttrs) {
auto found = fun.attrs->find(sFunctor);
if (found != fun.attrs->end()) {
Value * v = allocValue();
- callFunction(*found->value, fun, *v, noPos);
- forceValue(*v);
+ callFunction(*found->value, fun, *v, pos);
+ forceValue(*v, pos);
return autoCallFunction(args, *v, res);
}
}
@@ -1796,7 +1797,7 @@ void EvalState::forceValueDeep(Value & v)
recurse = [&](Value & v) {
if (!seen.insert(&v).second) return;
- forceValue(v);
+ forceValue(v, v.determinePos(noPos));
if (v.type() == nAttrs) {
for (auto & i : *v.attrs)
@@ -1933,7 +1934,7 @@ bool EvalState::isDerivation(Value & v)
if (v.type() != nAttrs) return false;
Bindings::iterator i = v.attrs->find(sType);
if (i == v.attrs->end()) return false;
- forceValue(*i->value);
+ forceValue(*i->value, *i->pos);
if (i->value->type() != nString) return false;
return strcmp(i->value->string.s, "derivation") == 0;
}
@@ -2045,8 +2046,8 @@ Path EvalState::coerceToPath(const Pos & pos, Value & v, PathSet & context)
bool EvalState::eqValues(Value & v1, Value & v2)
{
- forceValue(v1);
- forceValue(v2);
+ forceValue(v1, noPos);
+ forceValue(v2, noPos);
/* !!! Hack to support some old broken code that relies on pointer
equality tests between sets. (Specifically, builderDefs calls