mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-14 02:06:16 +02:00
more fixes
This commit is contained in:
parent
1b5a8db148
commit
13c4dc6532
19 changed files with 239 additions and 231 deletions
|
@ -524,7 +524,7 @@ ref<eval_cache::EvalCache> openEvalCache(
|
||||||
auto vFlake = state.allocValue();
|
auto vFlake = state.allocValue();
|
||||||
flake::callFlake(state, *lockedFlake, *vFlake);
|
flake::callFlake(state, *lockedFlake, *vFlake);
|
||||||
|
|
||||||
state.forceAttrs(*vFlake, noPos, "While evaluating a cached flake");
|
state.forceAttrs(*vFlake, noPos, "While evaluating a cached flake: ");
|
||||||
|
|
||||||
auto aOutputs = vFlake->attrs->get(state.symbols.create("outputs"));
|
auto aOutputs = vFlake->attrs->get(state.symbols.create("outputs"));
|
||||||
assert(aOutputs);
|
assert(aOutputs);
|
||||||
|
|
|
@ -112,7 +112,7 @@ Pos findPackageFilename(EvalState & state, Value & v, std::string what)
|
||||||
|
|
||||||
// FIXME: is it possible to extract the Pos object instead of doing this
|
// FIXME: is it possible to extract the Pos object instead of doing this
|
||||||
// toString + parsing?
|
// toString + parsing?
|
||||||
auto pos = state.forceString(*v2, noPos, "While evaluating the meta.position attribute of a derivation");
|
auto pos = state.forceString(*v2, noPos, "While evaluating the meta.position attribute of a derivation: ");
|
||||||
|
|
||||||
auto colon = pos.rfind(':');
|
auto colon = pos.rfind(':');
|
||||||
if (colon == std::string::npos)
|
if (colon == std::string::npos)
|
||||||
|
|
|
@ -336,7 +336,7 @@ Value & AttrCursor::getValue()
|
||||||
if (!_value) {
|
if (!_value) {
|
||||||
if (parent) {
|
if (parent) {
|
||||||
auto & vParent = parent->first->getValue();
|
auto & vParent = parent->first->getValue();
|
||||||
root->state.forceAttrs(vParent, noPos, "While evaluating the parent attr set");
|
root->state.forceAttrs(vParent, noPos, "While evaluating the parent attr set: ");
|
||||||
auto attr = vParent.attrs->get(parent->second);
|
auto attr = vParent.attrs->get(parent->second);
|
||||||
if (!attr)
|
if (!attr)
|
||||||
throw Error("attribute '%s' is unexpectedly missing", getAttrPathStr());
|
throw Error("attribute '%s' is unexpectedly missing", getAttrPathStr());
|
||||||
|
|
|
@ -63,7 +63,7 @@ inline void EvalState::forceAttrs(Value & v, Callable getPos, const std::string
|
||||||
{
|
{
|
||||||
forceValue(v, getPos);
|
forceValue(v, getPos);
|
||||||
if (v.type() != nAttrs)
|
if (v.type() != nAttrs)
|
||||||
throwTypeError(getPos(), "%2%: value is %1% while a set was expected", v, errorCtx);
|
throwTypeError(getPos(), "%2%value is %1% while a set was expected", v, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ inline void EvalState::forceList(Value & v, const Pos & pos, const std::string &
|
||||||
{
|
{
|
||||||
forceValue(v, pos);
|
forceValue(v, pos);
|
||||||
if (!v.isList())
|
if (!v.isList())
|
||||||
throwTypeError(pos, "%2%: value is %1% while a list was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a list was expected", v, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note: Various places expect the allocated memory to be zeroed. */
|
/* Note: Various places expect the allocated memory to be zeroed. */
|
||||||
|
|
|
@ -297,7 +297,7 @@ static Symbol getName(const AttrName & name, EvalState & state, Env & env)
|
||||||
} else {
|
} else {
|
||||||
Value nameValue;
|
Value nameValue;
|
||||||
name.expr->eval(state, env, nameValue);
|
name.expr->eval(state, env, nameValue);
|
||||||
state.forceStringNoCtx(nameValue, noPos, "While evaluating an attribute name");
|
state.forceStringNoCtx(nameValue, noPos, "While evaluating an attribute name: ");
|
||||||
return state.symbols.create(nameValue.string.s);
|
return state.symbols.create(nameValue.string.s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -720,6 +720,14 @@ LocalNoInlineNoReturn(void throwEvalError(const Pos & pos, const char * s, const
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LocalNoInlineNoReturn(void throwEvalError(const Pos & pos, const char * s, const std::string & s2, const std::string & s3, const std::string & s4))
|
||||||
|
{
|
||||||
|
throw EvalError({
|
||||||
|
.msg = hintfmt(s, s2, s3, s4),
|
||||||
|
.errPos = pos
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
LocalNoInlineNoReturn(void throwEvalError(const Pos & p1, const char * s, const Symbol & sym, const Pos & p2))
|
LocalNoInlineNoReturn(void throwEvalError(const Pos & p1, const char * s, const Symbol & sym, const Pos & p2))
|
||||||
{
|
{
|
||||||
// p1 is where the error occurred; p2 is a position mentioned in the message.
|
// p1 is where the error occurred; p2 is a position mentioned in the message.
|
||||||
|
@ -1037,7 +1045,7 @@ inline bool EvalState::evalBool(Env & env, Expr * e, const Pos & pos, const std:
|
||||||
Value v;
|
Value v;
|
||||||
e->eval(*this, env, v);
|
e->eval(*this, env, v);
|
||||||
if (v.type() != nBool)
|
if (v.type() != nBool)
|
||||||
throwTypeError(pos, "%2%: value is %1% while a Boolean was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a Boolean was expected", v, errorCtx);
|
||||||
return v.boolean;
|
return v.boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,7 +1054,7 @@ inline void EvalState::evalAttrs(Env & env, Expr * e, Value & v, const Pos & pos
|
||||||
{
|
{
|
||||||
e->eval(*this, env, v);
|
e->eval(*this, env, v);
|
||||||
if (v.type() != nAttrs)
|
if (v.type() != nAttrs)
|
||||||
throwTypeError(pos, "%2%: value is %1% while a set was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a set was expected", v, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1119,7 +1127,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
|
||||||
Hence we need __overrides.) */
|
Hence we need __overrides.) */
|
||||||
if (hasOverrides) {
|
if (hasOverrides) {
|
||||||
Value * vOverrides = (*v.attrs)[overrides->second.displ].value;
|
Value * vOverrides = (*v.attrs)[overrides->second.displ].value;
|
||||||
state.forceAttrs(*vOverrides, [&]() { return vOverrides->determinePos(noPos); }, "While evaluating the `__overrides` attribute");
|
state.forceAttrs(*vOverrides, [&]() { return vOverrides->determinePos(noPos); }, "While evaluating the `__overrides` attribute: ");
|
||||||
Bindings * newBnds = state.allocBindings(v.attrs->capacity() + vOverrides->attrs->size());
|
Bindings * newBnds = state.allocBindings(v.attrs->capacity() + vOverrides->attrs->size());
|
||||||
for (auto & i : *v.attrs)
|
for (auto & i : *v.attrs)
|
||||||
newBnds->push_back(i);
|
newBnds->push_back(i);
|
||||||
|
@ -1147,7 +1155,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
|
||||||
state.forceValue(nameVal, i.pos);
|
state.forceValue(nameVal, i.pos);
|
||||||
if (nameVal.type() == nNull)
|
if (nameVal.type() == nNull)
|
||||||
continue;
|
continue;
|
||||||
state.forceStringNoCtx(nameVal, i.pos, "While evaluating the name of a dynamic attribute");
|
state.forceStringNoCtx(nameVal, i.pos, "While evaluating the name of a dynamic attribute: ");
|
||||||
Symbol nameSym = state.symbols.create(nameVal.string.s);
|
Symbol nameSym = state.symbols.create(nameVal.string.s);
|
||||||
Bindings::iterator j = v.attrs->find(nameSym);
|
Bindings::iterator j = v.attrs->find(nameSym);
|
||||||
if (j != v.attrs->end())
|
if (j != v.attrs->end())
|
||||||
|
@ -1237,7 +1245,7 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
state.forceAttrs(*vAttrs, pos, "While selecting an attribute");
|
state.forceAttrs(*vAttrs, pos, "While selecting an attribute: ");
|
||||||
if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end())
|
if ((j = vAttrs->attrs->find(name)) == vAttrs->attrs->end())
|
||||||
throwEvalError(pos, "attribute '%1%' missing", name);
|
throwEvalError(pos, "attribute '%1%' missing", name);
|
||||||
}
|
}
|
||||||
|
@ -1328,7 +1336,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
env2.values[displ++] = args[0];
|
env2.values[displ++] = args[0];
|
||||||
|
|
||||||
else {
|
else {
|
||||||
forceAttrs(*args[0], pos, "While evaluating the value passed as argument to a function expecting an attribute set");
|
forceAttrs(*args[0], pos, "While evaluating the value passed as argument to a function expecting an attribute set: ");
|
||||||
|
|
||||||
if (!lambda.arg.empty())
|
if (!lambda.arg.empty())
|
||||||
env2.values[displ++] = args[0];
|
env2.values[displ++] = args[0];
|
||||||
|
@ -1570,7 +1578,7 @@ void ExprOpEq::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
Value v1; e1->eval(state, env, v1);
|
Value v1; e1->eval(state, env, v1);
|
||||||
Value v2; e2->eval(state, env, v2);
|
Value v2; e2->eval(state, env, v2);
|
||||||
v.mkBool(state.eqValues(v1, v2));
|
v.mkBool(state.eqValues(v1, v2, pos, ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1578,7 +1586,7 @@ void ExprOpNEq::eval(EvalState & state, Env & env, Value & v)
|
||||||
{
|
{
|
||||||
Value v1; e1->eval(state, env, v1);
|
Value v1; e1->eval(state, env, v1);
|
||||||
Value v2; e2->eval(state, env, v2);
|
Value v2; e2->eval(state, env, v2);
|
||||||
v.mkBool(!state.eqValues(v1, v2));
|
v.mkBool(!state.eqValues(v1, v2, pos, ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1806,7 +1814,7 @@ NixInt EvalState::forceInt(Value & v, const Pos & pos, const std::string & error
|
||||||
{
|
{
|
||||||
forceValue(v, pos);
|
forceValue(v, pos);
|
||||||
if (v.type() != nInt)
|
if (v.type() != nInt)
|
||||||
throwTypeError(pos, "%2%: value is %1% while an integer was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while an integer was expected", v, errorCtx);
|
||||||
return v.integer;
|
return v.integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1817,7 +1825,7 @@ NixFloat EvalState::forceFloat(Value & v, const Pos & pos, const std::string & e
|
||||||
if (v.type() == nInt)
|
if (v.type() == nInt)
|
||||||
return v.integer;
|
return v.integer;
|
||||||
else if (v.type() != nFloat)
|
else if (v.type() != nFloat)
|
||||||
throwTypeError(pos, "%2%: value is %1% while a float was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a float was expected", v, errorCtx);
|
||||||
return v.fpoint;
|
return v.fpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1826,7 +1834,7 @@ bool EvalState::forceBool(Value & v, const Pos & pos, const std::string & errorC
|
||||||
{
|
{
|
||||||
forceValue(v, pos);
|
forceValue(v, pos);
|
||||||
if (v.type() != nBool)
|
if (v.type() != nBool)
|
||||||
throwTypeError(pos, "%2%: value is %1% while a Boolean was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a Boolean was expected", v, errorCtx);
|
||||||
return v.boolean;
|
return v.boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1841,7 +1849,7 @@ void EvalState::forceFunction(Value & v, const Pos & pos, const std::string & er
|
||||||
{
|
{
|
||||||
forceValue(v, pos);
|
forceValue(v, pos);
|
||||||
if (v.type() != nFunction && !isFunctor(v))
|
if (v.type() != nFunction && !isFunctor(v))
|
||||||
throwTypeError(pos, "%2%: value is %1% while a function was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a function was expected", v, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1849,7 +1857,7 @@ std::string_view EvalState::forceString(Value & v, const Pos & pos, const std::s
|
||||||
{
|
{
|
||||||
forceValue(v, pos);
|
forceValue(v, pos);
|
||||||
if (v.type() != nString) {
|
if (v.type() != nString) {
|
||||||
throwTypeError(pos, "%2%: value is %1% while a string was expected", v, errorCtx);
|
throwTypeError(pos, "%2%value is %1% while a string was expected", v, errorCtx);
|
||||||
}
|
}
|
||||||
return v.string.s;
|
return v.string.s;
|
||||||
}
|
}
|
||||||
|
@ -1958,7 +1966,7 @@ BackedStringView EvalState::coerceToString(const Pos & pos, Value & v, PathSet &
|
||||||
if (maybeString)
|
if (maybeString)
|
||||||
return std::move(*maybeString);
|
return std::move(*maybeString);
|
||||||
auto i = v.attrs->find(sOutPath);
|
auto i = v.attrs->find(sOutPath);
|
||||||
if (i == v.attrs->end()) throwTypeError(pos, "%2%: cannot coerce %1% to a string", v, errorCtx);
|
if (i == v.attrs->end()) throwTypeError(pos, "%2%cannot coerce %1% to a string", v, errorCtx);
|
||||||
return coerceToString(pos, *i->value, context, coerceMore, copyToStore, canonicalizePath, errorCtx);
|
return coerceToString(pos, *i->value, context, coerceMore, copyToStore, canonicalizePath, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1989,7 +1997,7 @@ BackedStringView EvalState::coerceToString(const Pos & pos, Value & v, PathSet &
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throwTypeError(pos, "%2%: cannot coerce %1% to a string", v, errorCtx);
|
throwTypeError(pos, "%2%cannot coerce %1% to a string", v, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2021,7 +2029,7 @@ Path EvalState::coerceToPath(const Pos & pos, Value & v, PathSet & context, cons
|
||||||
{
|
{
|
||||||
auto path = coerceToString(pos, v, context, false, false, true, errorCtx).toOwned();
|
auto path = coerceToString(pos, v, context, false, false, true, errorCtx).toOwned();
|
||||||
if (path == "" || path[0] != '/')
|
if (path == "" || path[0] != '/')
|
||||||
throwEvalError(pos, "%2%: string '%1%' doesn't represent an absolute path", path, errorCtx);
|
throwEvalError(pos, "%2%string '%1%' doesn't represent an absolute path", path, errorCtx);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2032,13 +2040,13 @@ StorePath EvalState::coerceToStorePath(const Pos & pos, Value & v, PathSet & con
|
||||||
if (auto storePath = store->maybeParseStorePath(path))
|
if (auto storePath = store->maybeParseStorePath(path))
|
||||||
return *storePath;
|
return *storePath;
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("%2%: path '%1%' is not in the Nix store", path, errorCtx),
|
.msg = hintfmt("%2%path '%1%' is not in the Nix store", path, errorCtx),
|
||||||
.errPos = pos
|
.errPos = pos
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool EvalState::eqValues(Value & v1, Value & v2)
|
bool EvalState::eqValues(Value & v1, Value & v2, const Pos & pos, const std::string & errorCtx)
|
||||||
{
|
{
|
||||||
forceValue(v1, noPos);
|
forceValue(v1, noPos);
|
||||||
forceValue(v2, noPos);
|
forceValue(v2, noPos);
|
||||||
|
@ -2077,7 +2085,7 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
||||||
case nList:
|
case nList:
|
||||||
if (v1.listSize() != v2.listSize()) return false;
|
if (v1.listSize() != v2.listSize()) return false;
|
||||||
for (size_t n = 0; n < v1.listSize(); ++n)
|
for (size_t n = 0; n < v1.listSize(); ++n)
|
||||||
if (!eqValues(*v1.listElems()[n], *v2.listElems()[n])) return false;
|
if (!eqValues(*v1.listElems()[n], *v2.listElems()[n], pos, errorCtx)) return false;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case nAttrs: {
|
case nAttrs: {
|
||||||
|
@ -2087,7 +2095,7 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
||||||
Bindings::iterator i = v1.attrs->find(sOutPath);
|
Bindings::iterator i = v1.attrs->find(sOutPath);
|
||||||
Bindings::iterator j = v2.attrs->find(sOutPath);
|
Bindings::iterator j = v2.attrs->find(sOutPath);
|
||||||
if (i != v1.attrs->end() && j != v2.attrs->end())
|
if (i != v1.attrs->end() && j != v2.attrs->end())
|
||||||
return eqValues(*i->value, *j->value);
|
return eqValues(*i->value, *j->value, pos, errorCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v1.attrs->size() != v2.attrs->size()) return false;
|
if (v1.attrs->size() != v2.attrs->size()) return false;
|
||||||
|
@ -2095,7 +2103,7 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
||||||
/* Otherwise, compare the attributes one by one. */
|
/* Otherwise, compare the attributes one by one. */
|
||||||
Bindings::iterator i, j;
|
Bindings::iterator i, j;
|
||||||
for (i = v1.attrs->begin(), j = v2.attrs->begin(); i != v1.attrs->end(); ++i, ++j)
|
for (i = v1.attrs->begin(), j = v2.attrs->begin(); i != v1.attrs->end(); ++i, ++j)
|
||||||
if (i->name != j->name || !eqValues(*i->value, *j->value))
|
if (i->name != j->name || !eqValues(*i->value, *j->value, pos, errorCtx))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -2112,7 +2120,7 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
||||||
return v1.fpoint == v2.fpoint;
|
return v1.fpoint == v2.fpoint;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throwEvalError("cannot compare %1% with %2%", showType(v1), showType(v2));
|
throwEvalError(pos, "%3%cannot compare %1% with %2%", showType(v1), showType(v2), errorCtx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2237,7 +2245,7 @@ void EvalState::printStats()
|
||||||
std::string ExternalValueBase::coerceToString(const Pos & pos, PathSet & context, bool copyMore, bool copyToStore, const std::string & errorCtx) const
|
std::string ExternalValueBase::coerceToString(const Pos & pos, PathSet & context, bool copyMore, bool copyToStore, const std::string & errorCtx) const
|
||||||
{
|
{
|
||||||
throw TypeError({
|
throw TypeError({
|
||||||
.msg = hintfmt("%2%: cannot coerce %1% to a string", showType(), errorCtx),
|
.msg = hintfmt("%2%cannot coerce %1% to a string", showType(), errorCtx),
|
||||||
.errPos = pos
|
.errPos = pos
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -329,7 +329,7 @@ public:
|
||||||
|
|
||||||
/* Do a deep equality test between two values. That is, list
|
/* Do a deep equality test between two values. That is, list
|
||||||
elements and attributes are compared recursively. */
|
elements and attributes are compared recursively. */
|
||||||
bool eqValues(Value & v1, Value & v2);
|
bool eqValues(Value & v1, Value & v2, const Pos & pos, const std::string & errorCtx);
|
||||||
|
|
||||||
bool isFunctor(Value & fun);
|
bool isFunctor(Value & fun);
|
||||||
|
|
||||||
|
|
|
@ -708,7 +708,7 @@ static void prim_getFlake(EvalState & state, const Pos & pos, Value * * args, Va
|
||||||
{
|
{
|
||||||
state.requireExperimentalFeatureOnEvaluation(Xp::Flakes, "builtins.getFlake", pos);
|
state.requireExperimentalFeatureOnEvaluation(Xp::Flakes, "builtins.getFlake", pos);
|
||||||
|
|
||||||
std::string flakeRefS(state.forceStringNoCtx(*args[0], pos, "While evaluating the argument passed to builtins.getFlake"));
|
std::string flakeRefS(state.forceStringNoCtx(*args[0], pos, "While evaluating the argument passed to builtins.getFlake: "));
|
||||||
auto flakeRef = parseFlakeRef(flakeRefS, {}, true);
|
auto flakeRef = parseFlakeRef(flakeRefS, {}, true);
|
||||||
if (evalSettings.pureEval && !flakeRef.input.isLocked())
|
if (evalSettings.pureEval && !flakeRef.input.isLocked())
|
||||||
throw Error("cannot call 'getFlake' on unlocked flake reference '%s', at %s (use --impure to override)", flakeRefS, pos);
|
throw Error("cannot call 'getFlake' on unlocked flake reference '%s', at %s (use --impure to override)", flakeRefS, pos);
|
||||||
|
|
|
@ -50,7 +50,7 @@ std::string DrvInfo::queryName() const
|
||||||
if (name == "" && attrs) {
|
if (name == "" && attrs) {
|
||||||
auto i = attrs->find(state->sName);
|
auto i = attrs->find(state->sName);
|
||||||
if (i == attrs->end()) throw TypeError("derivation name missing");
|
if (i == attrs->end()) throw TypeError("derivation name missing");
|
||||||
name = state->forceStringNoCtx(*i->value, noPos, "While evaluating the name of a DrvInfo");
|
name = state->forceStringNoCtx(*i->value, noPos, "While evaluating the name of a DrvInfo: ");
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ std::string DrvInfo::querySystem() const
|
||||||
{
|
{
|
||||||
if (system == "" && attrs) {
|
if (system == "" && attrs) {
|
||||||
auto i = attrs->find(state->sSystem);
|
auto i = attrs->find(state->sSystem);
|
||||||
system = i == attrs->end() ? "unknown" : state->forceStringNoCtx(*i->value, *i->pos, "While evaluating the system of a DrvInfo");
|
system = i == attrs->end() ? "unknown" : state->forceStringNoCtx(*i->value, *i->pos, "While evaluating the system of a DrvInfo: ");
|
||||||
}
|
}
|
||||||
return system;
|
return system;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ std::optional<StorePath> DrvInfo::queryDrvPath() const
|
||||||
if (i == attrs->end())
|
if (i == attrs->end())
|
||||||
drvPath = {std::nullopt};
|
drvPath = {std::nullopt};
|
||||||
else
|
else
|
||||||
drvPath = {state->coerceToStorePath(*i->pos, *i->value, context, "Whyle evaluating the drv path of a DrvInfo")};
|
drvPath = {state->coerceToStorePath(*i->pos, *i->value, context, "Whyle evaluating the drv path of a DrvInfo: ")};
|
||||||
}
|
}
|
||||||
return drvPath.value_or(std::nullopt);
|
return drvPath.value_or(std::nullopt);
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ StorePath DrvInfo::queryOutPath() const
|
||||||
Bindings::iterator i = attrs->find(state->sOutPath);
|
Bindings::iterator i = attrs->find(state->sOutPath);
|
||||||
PathSet context;
|
PathSet context;
|
||||||
if (i != attrs->end())
|
if (i != attrs->end())
|
||||||
outPath = state->coerceToStorePath(*i->pos, *i->value, context, "While evaluating the output path of a DrvInfo");
|
outPath = state->coerceToStorePath(*i->pos, *i->value, context, "While evaluating the output path of a DrvInfo: ");
|
||||||
}
|
}
|
||||||
if (!outPath)
|
if (!outPath)
|
||||||
throw UnimplementedError("CA derivations are not yet supported");
|
throw UnimplementedError("CA derivations are not yet supported");
|
||||||
|
@ -108,21 +108,21 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall)
|
||||||
/* Get the ‘outputs’ list. */
|
/* Get the ‘outputs’ list. */
|
||||||
Bindings::iterator i;
|
Bindings::iterator i;
|
||||||
if (attrs && (i = attrs->find(state->sOutputs)) != attrs->end()) {
|
if (attrs && (i = attrs->find(state->sOutputs)) != attrs->end()) {
|
||||||
state->forceList(*i->value, *i->pos, "While evaluating the outputs of a DrvInfo");
|
state->forceList(*i->value, *i->pos, "While evaluating the outputs of a DrvInfo: ");
|
||||||
|
|
||||||
/* For each output... */
|
/* For each output... */
|
||||||
for (auto elem : i->value->listItems()) {
|
for (auto elem : i->value->listItems()) {
|
||||||
/* Evaluate the corresponding set. */
|
/* Evaluate the corresponding set. */
|
||||||
std::string name(state->forceStringNoCtx(*elem, *i->pos, "While evaluating the name of one output of a DrvInfo"));
|
std::string name(state->forceStringNoCtx(*elem, *i->pos, "While evaluating the name of one output of a DrvInfo: "));
|
||||||
Bindings::iterator out = attrs->find(state->symbols.create(name));
|
Bindings::iterator out = attrs->find(state->symbols.create(name));
|
||||||
if (out == attrs->end()) continue; // FIXME: throw error?
|
if (out == attrs->end()) continue; // FIXME: throw error?
|
||||||
state->forceAttrs(*out->value, *i->pos, "While evaluating the description of a DrvInfo output");
|
state->forceAttrs(*out->value, *i->pos, "While evaluating the description of a DrvInfo output: ");
|
||||||
|
|
||||||
/* And evaluate its ‘outPath’ attribute. */
|
/* And evaluate its ‘outPath’ attribute. */
|
||||||
Bindings::iterator outPath = out->value->attrs->find(state->sOutPath);
|
Bindings::iterator outPath = out->value->attrs->find(state->sOutPath);
|
||||||
if (outPath == out->value->attrs->end()) continue; // FIXME: throw error?
|
if (outPath == out->value->attrs->end()) continue; // FIXME: throw error?
|
||||||
PathSet context;
|
PathSet context;
|
||||||
outputs.emplace(name, state->coerceToStorePath(*outPath->pos, *outPath->value, context, "While evaluating the outPath of an output path of a DrvInfo"));
|
outputs.emplace(name, state->coerceToStorePath(*outPath->pos, *outPath->value, context, "While evaluating the outPath of an output path of a DrvInfo: "));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
outputs.emplace("out", queryOutPath());
|
outputs.emplace("out", queryOutPath());
|
||||||
|
@ -151,7 +151,7 @@ std::string DrvInfo::queryOutputName() const
|
||||||
{
|
{
|
||||||
if (outputName == "" && attrs) {
|
if (outputName == "" && attrs) {
|
||||||
Bindings::iterator i = attrs->find(state->sOutputName);
|
Bindings::iterator i = attrs->find(state->sOutputName);
|
||||||
outputName = i != attrs->end() ? state->forceStringNoCtx(*i->value, noPos, "While evaluating the output name of a DrvInfo") : "";
|
outputName = i != attrs->end() ? state->forceStringNoCtx(*i->value, noPos, "While evaluating the output name of a DrvInfo: ") : "";
|
||||||
}
|
}
|
||||||
return outputName;
|
return outputName;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ Bindings * DrvInfo::getMeta()
|
||||||
if (!attrs) return 0;
|
if (!attrs) return 0;
|
||||||
Bindings::iterator a = attrs->find(state->sMeta);
|
Bindings::iterator a = attrs->find(state->sMeta);
|
||||||
if (a == attrs->end()) return 0;
|
if (a == attrs->end()) return 0;
|
||||||
state->forceAttrs(*a->value, *a->pos, "While evaluating the `meta` attribute of a DrvInfo");
|
state->forceAttrs(*a->value, *a->pos, "While evaluating the `meta` attribute of a DrvInfo: ");
|
||||||
meta = a->value->attrs;
|
meta = a->value->attrs;
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
@ -364,7 +364,7 @@ static void getDerivations(EvalState & state, Value & vIn,
|
||||||
`recurseForDerivations = true' attribute. */
|
`recurseForDerivations = true' attribute. */
|
||||||
if (i->value->type() == nAttrs) {
|
if (i->value->type() == nAttrs) {
|
||||||
Bindings::iterator j = i->value->attrs->find(state.sRecurseForDerivations);
|
Bindings::iterator j = i->value->attrs->find(state.sRecurseForDerivations);
|
||||||
if (j != i->value->attrs->end() && state.forceBool(*j->value, *j->pos, "While evaluating the attribute `recurseForDerivations`"))
|
if (j != i->value->attrs->end() && state.forceBool(*j->value, *j->pos, "While evaluating the attribute `recurseForDerivations`: "))
|
||||||
getDerivations(state, *i->value, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
|
getDerivations(state, *i->value, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,7 +103,7 @@ static Path realisePath(EvalState & state, const Pos & pos, Value & v, const Rea
|
||||||
auto path = [&]()
|
auto path = [&]()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return state.coerceToPath(pos, v, context, "While realising the context of a path");
|
return state.coerceToPath(pos, v, context, "While realising the context of a path: ");
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
e.addTrace(pos, "while realising the context of a path");
|
e.addTrace(pos, "while realising the context of a path");
|
||||||
throw;
|
throw;
|
||||||
|
@ -195,9 +195,9 @@ static void import(EvalState & state, const Pos & pos, Value & vPath, Value * vS
|
||||||
, "/"), **state.vImportedDrvToDerivation);
|
, "/"), **state.vImportedDrvToDerivation);
|
||||||
}
|
}
|
||||||
|
|
||||||
state.forceFunction(**state.vImportedDrvToDerivation, pos, "While evaluating imported-drv-to-derivation.nix.gen.hh");
|
state.forceFunction(**state.vImportedDrvToDerivation, pos, "While evaluating imported-drv-to-derivation.nix.gen.hh: ");
|
||||||
v.mkApp(*state.vImportedDrvToDerivation, w);
|
v.mkApp(*state.vImportedDrvToDerivation, w);
|
||||||
state.forceAttrs(v, pos, "While calling imported-drv-to-derivation.nix.gen.hh");
|
state.forceAttrs(v, pos, "While calling imported-drv-to-derivation.nix.gen.hh: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (path == corepkgsPrefix + "fetchurl.nix") {
|
else if (path == corepkgsPrefix + "fetchurl.nix") {
|
||||||
|
@ -210,7 +210,7 @@ static void import(EvalState & state, const Pos & pos, Value & vPath, Value * vS
|
||||||
if (!vScope)
|
if (!vScope)
|
||||||
state.evalFile(path, v);
|
state.evalFile(path, v);
|
||||||
else {
|
else {
|
||||||
state.forceAttrs(*vScope, pos, "While evaluating the first argument passed to builtins.scopedImport");
|
state.forceAttrs(*vScope, pos, "While evaluating the first argument passed to builtins.scopedImport: ");
|
||||||
|
|
||||||
Env * env = &state.allocEnv(vScope->attrs->size());
|
Env * env = &state.allocEnv(vScope->attrs->size());
|
||||||
env->up = &state.baseEnv;
|
env->up = &state.baseEnv;
|
||||||
|
@ -314,7 +314,7 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value
|
||||||
{
|
{
|
||||||
auto path = realisePath(state, pos, *args[0]);
|
auto path = realisePath(state, pos, *args[0]);
|
||||||
|
|
||||||
std::string sym(state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.importNative"));
|
std::string sym(state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.importNative: "));
|
||||||
|
|
||||||
void *handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL);
|
void *handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL);
|
||||||
if (!handle)
|
if (!handle)
|
||||||
|
@ -340,7 +340,7 @@ void prim_importNative(EvalState & state, const Pos & pos, Value * * args, Value
|
||||||
/* Execute a program and parse its output */
|
/* Execute a program and parse its output */
|
||||||
void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.exec");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.exec: ");
|
||||||
auto elems = args[0]->listElems();
|
auto elems = args[0]->listElems();
|
||||||
auto count = args[0]->listSize();
|
auto count = args[0]->listSize();
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
|
@ -549,7 +549,7 @@ struct CompareValues
|
||||||
return v1->integer < v2->fpoint;
|
return v1->integer < v2->fpoint;
|
||||||
if (v1->type() != v2->type())
|
if (v1->type() != v2->type())
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("%s: cannot compare %s with %s", errorCtx, showType(*v1), showType(*v2)),
|
.msg = hintfmt("%scannot compare %s with %s", errorCtx, showType(*v1), showType(*v2)),
|
||||||
.errPos = pos,
|
.errPos = pos,
|
||||||
});
|
});
|
||||||
switch (v1->type()) {
|
switch (v1->type()) {
|
||||||
|
@ -568,13 +568,13 @@ struct CompareValues
|
||||||
return false;
|
return false;
|
||||||
} else if (i == v1->listSize()) {
|
} else if (i == v1->listSize()) {
|
||||||
return true;
|
return true;
|
||||||
} else if (!state.eqValues(*v1->listElems()[i], *v2->listElems()[i])) {
|
} else if (!state.eqValues(*v1->listElems()[i], *v2->listElems()[i], pos, errorCtx)) {
|
||||||
return (*this)(v1->listElems()[i], v2->listElems()[i]);
|
return (*this)(v1->listElems()[i], v2->listElems()[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("%s: cannot compare %s with %s", errorCtx, showType(*v1), showType(*v2)),
|
.msg = hintfmt("%scannot compare %s with %s", errorCtx, showType(*v1), showType(*v2)),
|
||||||
.errPos = pos,
|
.errPos = pos,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -628,7 +628,7 @@ static Bindings::iterator getAttr(
|
||||||
|
|
||||||
static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.genericClosure");
|
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.genericClosure: ");
|
||||||
|
|
||||||
/* Get the start set. */
|
/* Get the start set. */
|
||||||
Bindings::iterator startSet = getAttr(
|
Bindings::iterator startSet = getAttr(
|
||||||
|
@ -639,7 +639,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar
|
||||||
pos
|
pos
|
||||||
);
|
);
|
||||||
|
|
||||||
state.forceList(*startSet->value, pos, "While evaluating the `startSet` attribute passed to builtins.genericClosure");
|
state.forceList(*startSet->value, pos, "While evaluating the `startSet` attribute passed to builtins.genericClosure: ");
|
||||||
|
|
||||||
ValueList workSet;
|
ValueList workSet;
|
||||||
for (auto elem : startSet->value->listItems())
|
for (auto elem : startSet->value->listItems())
|
||||||
|
@ -654,7 +654,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar
|
||||||
pos
|
pos
|
||||||
);
|
);
|
||||||
|
|
||||||
state.forceFunction(*op->value, pos, "While evaluating the `operator` attribute passed to builtins.genericClosure");
|
state.forceFunction(*op->value, pos, "While evaluating the `operator` attribute passed to builtins.genericClosure: ");
|
||||||
|
|
||||||
/* Construct the closure by applying the operator to element of
|
/* Construct the closure by applying the operator to element of
|
||||||
`workSet', adding the result to `workSet', continuing until
|
`workSet', adding the result to `workSet', continuing until
|
||||||
|
@ -668,7 +668,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar
|
||||||
Value * e = *(workSet.begin());
|
Value * e = *(workSet.begin());
|
||||||
workSet.pop_front();
|
workSet.pop_front();
|
||||||
|
|
||||||
state.forceAttrs(*e, pos, "While evaluating one item to be part of the genericClosure");
|
state.forceAttrs(*e, pos, "While evaluating one item to be part of the genericClosure: ");
|
||||||
|
|
||||||
Bindings::iterator key =
|
Bindings::iterator key =
|
||||||
e->attrs->find(state.sKey);
|
e->attrs->find(state.sKey);
|
||||||
|
@ -685,7 +685,7 @@ static void prim_genericClosure(EvalState & state, const Pos & pos, Value * * ar
|
||||||
/* Call the `operator' function with `e' as argument. */
|
/* Call the `operator' function with `e' as argument. */
|
||||||
Value res;
|
Value res;
|
||||||
state.callFunction(*op->value, 1, &e, res, pos);
|
state.callFunction(*op->value, 1, &e, res, pos);
|
||||||
state.forceList(res, pos, "While evaluating the return value of the `operator` passed to builtins.genericClosure");
|
state.forceList(res, pos, "While evaluating the return value of the `operator` passed to builtins.genericClosure: ");
|
||||||
|
|
||||||
/* Add the values returned by the operator to the work set. */
|
/* Add the values returned by the operator to the work set. */
|
||||||
for (auto elem : res.listItems()) {
|
for (auto elem : res.listItems()) {
|
||||||
|
@ -782,7 +782,7 @@ static RegisterPrimOp primop_ceil({
|
||||||
|
|
||||||
static void prim_floor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_floor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto value = state.forceFloat(*args[0], args[0]->determinePos(pos), "While evaluating the first argument passed to builtins.floor");
|
auto value = state.forceFloat(*args[0], args[0]->determinePos(pos), "While evaluating the first argument passed to builtins.floor: ");
|
||||||
v.mkInt(floor(value));
|
v.mkInt(floor(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -839,7 +839,7 @@ static RegisterPrimOp primop_tryEval({
|
||||||
/* Return an environment variable. Use with care. */
|
/* Return an environment variable. Use with care. */
|
||||||
static void prim_getEnv(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_getEnv(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
std::string name(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.getEnv"));
|
std::string name(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.getEnv: "));
|
||||||
v.mkString(evalSettings.restrictEval || evalSettings.pureEval ? "" : getEnv(name).value_or(""));
|
v.mkString(evalSettings.restrictEval || evalSettings.pureEval ? "" : getEnv(name).value_or(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,7 +937,7 @@ static RegisterPrimOp primop_trace({
|
||||||
derivation. */
|
derivation. */
|
||||||
static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.derivationStrict");
|
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.derivationStrict: ");
|
||||||
|
|
||||||
/* Figure out the name first (for stack backtraces). */
|
/* Figure out the name first (for stack backtraces). */
|
||||||
Bindings::iterator attr = getAttr(
|
Bindings::iterator attr = getAttr(
|
||||||
|
@ -951,7 +951,7 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
|
||||||
std::string drvName;
|
std::string drvName;
|
||||||
Pos & posDrvName(*attr->pos);
|
Pos & posDrvName(*attr->pos);
|
||||||
try {
|
try {
|
||||||
drvName = state.forceStringNoCtx(*attr->value, pos, "While evaluating the `name` attribute passed to builtins.derivationStrict");
|
drvName = state.forceStringNoCtx(*attr->value, pos, "While evaluating the `name` attribute passed to builtins.derivationStrict: ");
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
e.addTrace(posDrvName, "while evaluating the derivation attribute 'name'");
|
e.addTrace(posDrvName, "while evaluating the derivation attribute 'name'");
|
||||||
throw;
|
throw;
|
||||||
|
@ -961,14 +961,14 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
|
||||||
std::ostringstream jsonBuf;
|
std::ostringstream jsonBuf;
|
||||||
std::unique_ptr<JSONObject> jsonObject;
|
std::unique_ptr<JSONObject> jsonObject;
|
||||||
attr = args[0]->attrs->find(state.sStructuredAttrs);
|
attr = args[0]->attrs->find(state.sStructuredAttrs);
|
||||||
if (attr != args[0]->attrs->end() && state.forceBool(*attr->value, pos, "While evaluating the `__structuredAttrs` attribute passed to builtins.derivationStrict"))
|
if (attr != args[0]->attrs->end() && state.forceBool(*attr->value, pos, "While evaluating the `__structuredAttrs` attribute passed to builtins.derivationStrict: "))
|
||||||
jsonObject = std::make_unique<JSONObject>(jsonBuf);
|
jsonObject = std::make_unique<JSONObject>(jsonBuf);
|
||||||
|
|
||||||
/* Check whether null attributes should be ignored. */
|
/* Check whether null attributes should be ignored. */
|
||||||
bool ignoreNulls = false;
|
bool ignoreNulls = false;
|
||||||
attr = args[0]->attrs->find(state.sIgnoreNulls);
|
attr = args[0]->attrs->find(state.sIgnoreNulls);
|
||||||
if (attr != args[0]->attrs->end())
|
if (attr != args[0]->attrs->end())
|
||||||
ignoreNulls = state.forceBool(*attr->value, pos, "While evaluating the `__ignoreNulls` attribute passed to builtins.derivationStrict");
|
ignoreNulls = state.forceBool(*attr->value, pos, "While evaluating the `__ignoreNulls` attribute passed to builtins.derivationStrict: ");
|
||||||
|
|
||||||
/* Build the derivation expression by processing the attributes. */
|
/* Build the derivation expression by processing the attributes. */
|
||||||
Derivation drv;
|
Derivation drv;
|
||||||
|
@ -1064,26 +1064,26 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
|
||||||
printValueAsJSON(state, true, *i->value, pos, placeholder, context);
|
printValueAsJSON(state, true, *i->value, pos, placeholder, context);
|
||||||
|
|
||||||
if (i->name == state.sBuilder)
|
if (i->name == state.sBuilder)
|
||||||
drv.builder = state.forceString(*i->value, context, posDrvName, "While evaluating the `builder` attribute passed to builtins.derivationStrict");
|
drv.builder = state.forceString(*i->value, context, posDrvName, "While evaluating the `builder` attribute passed to builtins.derivationStrict: ");
|
||||||
else if (i->name == state.sSystem)
|
else if (i->name == state.sSystem)
|
||||||
drv.platform = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `system` attribute passed to builtins.derivationStrict");
|
drv.platform = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `system` attribute passed to builtins.derivationStrict: ");
|
||||||
else if (i->name == state.sOutputHash)
|
else if (i->name == state.sOutputHash)
|
||||||
outputHash = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHash` attribute passed to builtins.derivationStrict");
|
outputHash = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHash` attribute passed to builtins.derivationStrict: ");
|
||||||
else if (i->name == state.sOutputHashAlgo)
|
else if (i->name == state.sOutputHashAlgo)
|
||||||
outputHashAlgo = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHashAlgo` attribute passed to builtins.derivationStrict");
|
outputHashAlgo = state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHashAlgo` attribute passed to builtins.derivationStrict: ");
|
||||||
else if (i->name == state.sOutputHashMode)
|
else if (i->name == state.sOutputHashMode)
|
||||||
handleHashMode(state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHashMode` attribute passed to builtins.derivationStrict"));
|
handleHashMode(state.forceStringNoCtx(*i->value, posDrvName, "While evaluating the `outputHashMode` attribute passed to builtins.derivationStrict: "));
|
||||||
else if (i->name == state.sOutputs) {
|
else if (i->name == state.sOutputs) {
|
||||||
/* Require ‘outputs’ to be a list of strings. */
|
/* Require ‘outputs’ to be a list of strings. */
|
||||||
state.forceList(*i->value, posDrvName, "While evaluating the `outputs` attribute passed to builtins.derivationStrict");
|
state.forceList(*i->value, posDrvName, "While evaluating the `outputs` attribute passed to builtins.derivationStrict: ");
|
||||||
Strings ss;
|
Strings ss;
|
||||||
for (auto elem : i->value->listItems())
|
for (auto elem : i->value->listItems())
|
||||||
ss.emplace_back(state.forceStringNoCtx(*elem, posDrvName, "While evaluating an element of the `outputs` attribute passed to builtins.derivationStrict"));
|
ss.emplace_back(state.forceStringNoCtx(*elem, posDrvName, "While evaluating an element of the `outputs` attribute passed to builtins.derivationStrict: "));
|
||||||
handleOutputs(ss);
|
handleOutputs(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
auto s = state.coerceToString(*i->pos, *i->value, context, true, "While evaluating an attribute passed to builtins.derivationStrict").toOwned();
|
auto s = state.coerceToString(*i->pos, *i->value, context, true, "While evaluating an attribute passed to builtins.derivationStrict: ").toOwned();
|
||||||
drv.env.emplace(key, s);
|
drv.env.emplace(key, s);
|
||||||
if (i->name == state.sBuilder) drv.builder = std::move(s);
|
if (i->name == state.sBuilder) drv.builder = std::move(s);
|
||||||
else if (i->name == state.sSystem) drv.platform = std::move(s);
|
else if (i->name == state.sSystem) drv.platform = std::move(s);
|
||||||
|
@ -1291,7 +1291,7 @@ static RegisterPrimOp primop_derivationStrict(RegisterPrimOp::Info {
|
||||||
‘out’. */
|
‘out’. */
|
||||||
static void prim_placeholder(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_placeholder(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
v.mkString(hashPlaceholder(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.placeholder")));
|
v.mkString(hashPlaceholder(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.placeholder: ")));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_placeholder({
|
static RegisterPrimOp primop_placeholder({
|
||||||
|
@ -1315,7 +1315,7 @@ static RegisterPrimOp primop_placeholder({
|
||||||
static void prim_toPath(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_toPath(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
Path path = state.coerceToPath(pos, *args[0], context, "While evaluating the first argument passed to builtins.toPath");
|
Path path = state.coerceToPath(pos, *args[0], context, "While evaluating the first argument passed to builtins.toPath: ");
|
||||||
v.mkString(canonPath(path), context);
|
v.mkString(canonPath(path), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1346,7 +1346,7 @@ static void prim_storePath(EvalState & state, const Pos & pos, Value * * args, V
|
||||||
});
|
});
|
||||||
|
|
||||||
PathSet context;
|
PathSet context;
|
||||||
Path path = state.checkSourcePath(state.coerceToPath(pos, *args[0], context, "While evaluating the first argument passed to builtins.storePath"));
|
Path path = state.checkSourcePath(state.coerceToPath(pos, *args[0], context, "While evaluating the first argument passed to builtins.storePath: "));
|
||||||
/* Resolve symlinks in ‘path’, unless ‘path’ itself is a symlink
|
/* Resolve symlinks in ‘path’, unless ‘path’ itself is a symlink
|
||||||
directly in the store. The latter condition is necessary so
|
directly in the store. The latter condition is necessary so
|
||||||
e.g. nix-push does the right thing. */
|
e.g. nix-push does the right thing. */
|
||||||
|
@ -1416,7 +1416,7 @@ static RegisterPrimOp primop_pathExists({
|
||||||
static void prim_baseNameOf(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_baseNameOf(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
v.mkString(baseNameOf(*state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.baseNameOf")), context);
|
v.mkString(baseNameOf(*state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.baseNameOf: ")), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_baseNameOf({
|
static RegisterPrimOp primop_baseNameOf({
|
||||||
|
@ -1436,7 +1436,7 @@ static RegisterPrimOp primop_baseNameOf({
|
||||||
static void prim_dirOf(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_dirOf(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto path = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.dirOf");
|
auto path = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.dirOf: ");
|
||||||
auto dir = dirOf(*path);
|
auto dir = dirOf(*path);
|
||||||
if (args[0]->type() == nPath) v.mkPath(dir); else v.mkString(dir, context);
|
if (args[0]->type() == nPath) v.mkPath(dir); else v.mkString(dir, context);
|
||||||
}
|
}
|
||||||
|
@ -1483,17 +1483,17 @@ static RegisterPrimOp primop_readFile({
|
||||||
which are desugared to 'findFile __nixPath "x"'. */
|
which are desugared to 'findFile __nixPath "x"'. */
|
||||||
static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.findFile");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.findFile: ");
|
||||||
|
|
||||||
SearchPath searchPath;
|
SearchPath searchPath;
|
||||||
|
|
||||||
for (auto v2 : args[0]->listItems()) {
|
for (auto v2 : args[0]->listItems()) {
|
||||||
state.forceAttrs(*v2, pos, "While evaluating an element of the list passed to builtins.findFile");
|
state.forceAttrs(*v2, pos, "While evaluating an element of the list passed to builtins.findFile: ");
|
||||||
|
|
||||||
std::string prefix;
|
std::string prefix;
|
||||||
Bindings::iterator i = v2->attrs->find(state.sPrefix);
|
Bindings::iterator i = v2->attrs->find(state.sPrefix);
|
||||||
if (i != v2->attrs->end())
|
if (i != v2->attrs->end())
|
||||||
prefix = state.forceStringNoCtx(*i->value, pos, "While evaluating the `prefix` attribute of an element of the list passed to builtins.findFile");
|
prefix = state.forceStringNoCtx(*i->value, pos, "While evaluating the `prefix` attribute of an element of the list passed to builtins.findFile: ");
|
||||||
|
|
||||||
i = getAttr(
|
i = getAttr(
|
||||||
state,
|
state,
|
||||||
|
@ -1521,7 +1521,7 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va
|
||||||
searchPath.emplace_back(prefix, path);
|
searchPath.emplace_back(prefix, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto path = state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.findFile");
|
auto path = state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.findFile: ");
|
||||||
|
|
||||||
v.mkPath(state.checkSourcePath(state.findFile(searchPath, path, pos)));
|
v.mkPath(state.checkSourcePath(state.findFile(searchPath, path, pos)));
|
||||||
}
|
}
|
||||||
|
@ -1535,7 +1535,7 @@ static RegisterPrimOp primop_findFile(RegisterPrimOp::Info {
|
||||||
/* Return the cryptographic hash of a file in base-16. */
|
/* Return the cryptographic hash of a file in base-16. */
|
||||||
static void prim_hashFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_hashFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto type = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hashFile");
|
auto type = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hashFile: ");
|
||||||
std::optional<HashType> ht = parseHashType(type);
|
std::optional<HashType> ht = parseHashType(type);
|
||||||
if (!ht)
|
if (!ht)
|
||||||
throw Error({
|
throw Error({
|
||||||
|
@ -1742,7 +1742,7 @@ static RegisterPrimOp primop_toJSON({
|
||||||
/* Parse a JSON string to a value. */
|
/* Parse a JSON string to a value. */
|
||||||
static void prim_fromJSON(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_fromJSON(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto s = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.fromJSON");
|
auto s = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.fromJSON: ");
|
||||||
try {
|
try {
|
||||||
parseJSON(state, s, v);
|
parseJSON(state, s, v);
|
||||||
} catch (JSONParseError &e) {
|
} catch (JSONParseError &e) {
|
||||||
|
@ -1771,8 +1771,8 @@ static RegisterPrimOp primop_fromJSON({
|
||||||
static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
std::string name(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.toFile"));
|
std::string name(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.toFile: "));
|
||||||
std::string contents(state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.toFile"));
|
std::string contents(state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.toFile: "));
|
||||||
|
|
||||||
StorePathSet refs;
|
StorePathSet refs;
|
||||||
|
|
||||||
|
@ -1929,7 +1929,7 @@ static void addPath(
|
||||||
Value res;
|
Value res;
|
||||||
state.callFunction(*filterFun, 2, args, res, pos);
|
state.callFunction(*filterFun, 2, args, res, pos);
|
||||||
|
|
||||||
return state.forceBool(res, pos, "While evaluating the return value of the path filter function");
|
return state.forceBool(res, pos, "While evaluating the return value of the path filter function: ");
|
||||||
}) : defaultPathFilter;
|
}) : defaultPathFilter;
|
||||||
|
|
||||||
std::optional<StorePath> expectedStorePath;
|
std::optional<StorePath> expectedStorePath;
|
||||||
|
@ -1955,9 +1955,9 @@ static void addPath(
|
||||||
static void prim_filterSource(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_filterSource(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
Path path = state.coerceToPath(pos, *args[1], context, "While evaluating the second argument (the path to filter) passed to builtins.filterSource");
|
Path path = state.coerceToPath(pos, *args[1], context, "While evaluating the second argument (the path to filter) passed to builtins.filterSource: ");
|
||||||
|
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument to builtins.filterSource");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument to builtins.filterSource: ");
|
||||||
addPath(state, pos, std::string(baseNameOf(path)), path, args[0], FileIngestionMethod::Recursive, std::nullopt, v, context);
|
addPath(state, pos, std::string(baseNameOf(path)), path, args[0], FileIngestionMethod::Recursive, std::nullopt, v, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2018,7 +2018,7 @@ static RegisterPrimOp primop_filterSource({
|
||||||
|
|
||||||
static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.path");
|
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.path: ");
|
||||||
Path path;
|
Path path;
|
||||||
std::string name;
|
std::string name;
|
||||||
Value * filterFun = nullptr;
|
Value * filterFun = nullptr;
|
||||||
|
@ -2029,15 +2029,15 @@ static void prim_path(EvalState & state, const Pos & pos, Value * * args, Value
|
||||||
for (auto & attr : *args[0]->attrs) {
|
for (auto & attr : *args[0]->attrs) {
|
||||||
auto & n(attr.name);
|
auto & n(attr.name);
|
||||||
if (n == "path")
|
if (n == "path")
|
||||||
path = state.coerceToPath(*attr.pos, *attr.value, context, "While evaluating the `path` attribute passed to builtins.path");
|
path = state.coerceToPath(*attr.pos, *attr.value, context, "While evaluating the `path` attribute passed to builtins.path: ");
|
||||||
else if (attr.name == state.sName)
|
else if (attr.name == state.sName)
|
||||||
name = state.forceStringNoCtx(*attr.value, *attr.pos, "while evaluating the `name` attribute passed to builtins.path");
|
name = state.forceStringNoCtx(*attr.value, *attr.pos, "while evaluating the `name` attribute passed to builtins.path: ");
|
||||||
else if (n == "filter")
|
else if (n == "filter")
|
||||||
state.forceFunction(*(filterFun = attr.value), *attr.pos, "While evaluating the `filter` parameter passed to builtins.path");
|
state.forceFunction(*(filterFun = attr.value), *attr.pos, "While evaluating the `filter` parameter passed to builtins.path: ");
|
||||||
else if (n == "recursive")
|
else if (n == "recursive")
|
||||||
method = FileIngestionMethod { state.forceBool(*attr.value, *attr.pos, "While evaluating the `recursive` attribute passed to builtins.path") };
|
method = FileIngestionMethod { state.forceBool(*attr.value, *attr.pos, "While evaluating the `recursive` attribute passed to builtins.path: ") };
|
||||||
else if (n == "sha256")
|
else if (n == "sha256")
|
||||||
expectedHash = newHashAllowEmpty(state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `sha256` attribute passed to builtins.path"), htSHA256);
|
expectedHash = newHashAllowEmpty(state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `sha256` attribute passed to builtins.path: "), htSHA256);
|
||||||
else
|
else
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("unsupported argument '%1%' to 'addPath'", attr.name),
|
.msg = hintfmt("unsupported argument '%1%' to 'addPath'", attr.name),
|
||||||
|
@ -2100,7 +2100,7 @@ static RegisterPrimOp primop_path({
|
||||||
strings. */
|
strings. */
|
||||||
static void prim_attrNames(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_attrNames(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.attrNames");
|
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.attrNames: ");
|
||||||
|
|
||||||
state.mkList(v, args[0]->attrs->size());
|
state.mkList(v, args[0]->attrs->size());
|
||||||
|
|
||||||
|
@ -2127,7 +2127,7 @@ static RegisterPrimOp primop_attrNames({
|
||||||
order as attrNames. */
|
order as attrNames. */
|
||||||
static void prim_attrValues(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_attrValues(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.attrValues");
|
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.attrValues: ");
|
||||||
|
|
||||||
state.mkList(v, args[0]->attrs->size());
|
state.mkList(v, args[0]->attrs->size());
|
||||||
|
|
||||||
|
@ -2158,8 +2158,8 @@ static RegisterPrimOp primop_attrValues({
|
||||||
/* Dynamic version of the `.' operator. */
|
/* Dynamic version of the `.' operator. */
|
||||||
void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.getAttr");
|
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.getAttr: ");
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.getAttr");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.getAttr: ");
|
||||||
Bindings::iterator i = getAttr(
|
Bindings::iterator i = getAttr(
|
||||||
state,
|
state,
|
||||||
"getAttr",
|
"getAttr",
|
||||||
|
@ -2188,8 +2188,8 @@ static RegisterPrimOp primop_getAttr({
|
||||||
/* Return position information of the specified attribute. */
|
/* Return position information of the specified attribute. */
|
||||||
static void prim_unsafeGetAttrPos(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_unsafeGetAttrPos(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.unsafeGetAttrPos");
|
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.unsafeGetAttrPos: ");
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.unsafeGetAttrPos");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.unsafeGetAttrPos: ");
|
||||||
Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr));
|
Bindings::iterator i = args[1]->attrs->find(state.symbols.create(attr));
|
||||||
if (i == args[1]->attrs->end())
|
if (i == args[1]->attrs->end())
|
||||||
v.mkNull();
|
v.mkNull();
|
||||||
|
@ -2206,8 +2206,8 @@ static RegisterPrimOp primop_unsafeGetAttrPos(RegisterPrimOp::Info {
|
||||||
/* Dynamic version of the `?' operator. */
|
/* Dynamic version of the `?' operator. */
|
||||||
static void prim_hasAttr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_hasAttr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hasAttr");
|
auto attr = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hasAttr: ");
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.hasAttr");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.hasAttr: ");
|
||||||
v.mkBool(args[1]->attrs->find(state.symbols.create(attr)) != args[1]->attrs->end());
|
v.mkBool(args[1]->attrs->find(state.symbols.create(attr)) != args[1]->attrs->end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2240,8 +2240,8 @@ static RegisterPrimOp primop_isAttrs({
|
||||||
|
|
||||||
static void prim_removeAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_removeAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.removeAttrs");
|
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.removeAttrs: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.removeAttrs");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.removeAttrs: ");
|
||||||
|
|
||||||
/* Get the attribute names to be removed.
|
/* Get the attribute names to be removed.
|
||||||
We keep them as Attrs instead of Symbols so std::set_difference
|
We keep them as Attrs instead of Symbols so std::set_difference
|
||||||
|
@ -2249,7 +2249,7 @@ static void prim_removeAttrs(EvalState & state, const Pos & pos, Value * * args,
|
||||||
boost::container::small_vector<Attr, 64> names;
|
boost::container::small_vector<Attr, 64> names;
|
||||||
names.reserve(args[1]->listSize());
|
names.reserve(args[1]->listSize());
|
||||||
for (auto elem : args[1]->listItems()) {
|
for (auto elem : args[1]->listItems()) {
|
||||||
state.forceStringNoCtx(*elem, pos, "While evaluating the values of the second argument passed to builtins.removeAttrs");
|
state.forceStringNoCtx(*elem, pos, "While evaluating the values of the second argument passed to builtins.removeAttrs: ");
|
||||||
names.emplace_back(state.symbols.create(elem->string.s), nullptr);
|
names.emplace_back(state.symbols.create(elem->string.s), nullptr);
|
||||||
}
|
}
|
||||||
std::sort(names.begin(), names.end());
|
std::sort(names.begin(), names.end());
|
||||||
|
@ -2288,14 +2288,14 @@ static RegisterPrimOp primop_removeAttrs({
|
||||||
name, the first takes precedence. */
|
name, the first takes precedence. */
|
||||||
static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the argument passed to builtins.listToAttrs");
|
state.forceList(*args[0], pos, "While evaluating the argument passed to builtins.listToAttrs: ");
|
||||||
|
|
||||||
auto attrs = state.buildBindings(args[0]->listSize());
|
auto attrs = state.buildBindings(args[0]->listSize());
|
||||||
|
|
||||||
std::set<Symbol> seen;
|
std::set<Symbol> seen;
|
||||||
|
|
||||||
for (auto v2 : args[0]->listItems()) {
|
for (auto v2 : args[0]->listItems()) {
|
||||||
state.forceAttrs(*v2, pos, "While evaluating an element of the list passed to builtins.listToAttrs");
|
state.forceAttrs(*v2, pos, "While evaluating an element of the list passed to builtins.listToAttrs: ");
|
||||||
|
|
||||||
Bindings::iterator j = getAttr(
|
Bindings::iterator j = getAttr(
|
||||||
state,
|
state,
|
||||||
|
@ -2305,7 +2305,7 @@ static void prim_listToAttrs(EvalState & state, const Pos & pos, Value * * args,
|
||||||
pos
|
pos
|
||||||
);
|
);
|
||||||
|
|
||||||
auto name = state.forceStringNoCtx(*j->value, *j->pos, "While evaluating the `name` attribute of an element of the list passed to builtins.listToAttrs");
|
auto name = state.forceStringNoCtx(*j->value, *j->pos, "While evaluating the `name` attribute of an element of the list passed to builtins.listToAttrs: ");
|
||||||
|
|
||||||
Symbol sym = state.symbols.create(name);
|
Symbol sym = state.symbols.create(name);
|
||||||
if (seen.insert(sym).second) {
|
if (seen.insert(sym).second) {
|
||||||
|
@ -2350,8 +2350,8 @@ static RegisterPrimOp primop_listToAttrs({
|
||||||
|
|
||||||
static void prim_intersectAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_intersectAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.intersectAttrs");
|
state.forceAttrs(*args[0], pos, "While evaluating the first argument passed to builtins.intersectAttrs: ");
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.intersectAttrs");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.intersectAttrs: ");
|
||||||
|
|
||||||
auto attrs = state.buildBindings(std::min(args[0]->attrs->size(), args[1]->attrs->size()));
|
auto attrs = state.buildBindings(std::min(args[0]->attrs->size(), args[1]->attrs->size()));
|
||||||
|
|
||||||
|
@ -2376,14 +2376,14 @@ static RegisterPrimOp primop_intersectAttrs({
|
||||||
|
|
||||||
static void prim_catAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_catAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
Symbol attrName = state.symbols.create(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.catAttrs"));
|
Symbol attrName = state.symbols.create(state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.catAttrs: "));
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.catAttrs");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.catAttrs: ");
|
||||||
|
|
||||||
Value * res[args[1]->listSize()];
|
Value * res[args[1]->listSize()];
|
||||||
unsigned int found = 0;
|
unsigned int found = 0;
|
||||||
|
|
||||||
for (auto v2 : args[1]->listItems()) {
|
for (auto v2 : args[1]->listItems()) {
|
||||||
state.forceAttrs(*v2, pos, "While evaluating an element in the list passed as second argument to builtins.catAttrs");
|
state.forceAttrs(*v2, pos, "While evaluating an element in the list passed as second argument to builtins.catAttrs: ");
|
||||||
Bindings::iterator i = v2->attrs->find(attrName);
|
Bindings::iterator i = v2->attrs->find(attrName);
|
||||||
if (i != v2->attrs->end())
|
if (i != v2->attrs->end())
|
||||||
res[found++] = i->value;
|
res[found++] = i->value;
|
||||||
|
@ -2456,7 +2456,7 @@ static RegisterPrimOp primop_functionArgs({
|
||||||
/* */
|
/* */
|
||||||
static void prim_mapAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_mapAttrs(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.mapAttrs");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.mapAttrs: ");
|
||||||
|
|
||||||
auto attrs = state.buildBindings(args[1]->attrs->size());
|
auto attrs = state.buildBindings(args[1]->attrs->size());
|
||||||
|
|
||||||
|
@ -2497,15 +2497,15 @@ static void prim_zipAttrsWith(EvalState & state, const Pos & pos, Value * * args
|
||||||
|
|
||||||
std::map<Symbol, std::pair<size_t, Value * *>> attrsSeen;
|
std::map<Symbol, std::pair<size_t, Value * *>> attrsSeen;
|
||||||
|
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.zipAttrsWith");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.zipAttrsWith: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.zipAttrsWith");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.zipAttrsWith: ");
|
||||||
const auto listSize = args[1]->listSize();
|
const auto listSize = args[1]->listSize();
|
||||||
const auto listElems = args[1]->listElems();
|
const auto listElems = args[1]->listElems();
|
||||||
|
|
||||||
for (unsigned int n = 0; n < listSize; ++n) {
|
for (unsigned int n = 0; n < listSize; ++n) {
|
||||||
Value * vElem = listElems[n];
|
Value * vElem = listElems[n];
|
||||||
try {
|
try {
|
||||||
state.forceAttrs(*vElem, noPos, "While evaluating a value of the list passed as second argument to builtins.zipAttrsWith");
|
state.forceAttrs(*vElem, noPos, "While evaluating a value of the list passed as second argument to builtins.zipAttrsWith: ");
|
||||||
for (auto & attr : *vElem->attrs)
|
for (auto & attr : *vElem->attrs)
|
||||||
attrsSeen[attr.name].first++;
|
attrsSeen[attr.name].first++;
|
||||||
} catch (TypeError & e) {
|
} catch (TypeError & e) {
|
||||||
|
@ -2595,7 +2595,7 @@ static RegisterPrimOp primop_isList({
|
||||||
|
|
||||||
static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Value & v)
|
static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(list, pos, "While evaluating the first argument passed to builtins.elemAt");
|
state.forceList(list, pos, "While evaluating the first argument passed to builtins.elemAt: ");
|
||||||
if (n < 0 || (unsigned int) n >= list.listSize())
|
if (n < 0 || (unsigned int) n >= list.listSize())
|
||||||
throw Error({
|
throw Error({
|
||||||
.msg = hintfmt("list index %1% is out of bounds", n),
|
.msg = hintfmt("list index %1% is out of bounds", n),
|
||||||
|
@ -2608,7 +2608,7 @@ static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Valu
|
||||||
/* Return the n-1'th element of a list. */
|
/* Return the n-1'th element of a list. */
|
||||||
static void prim_elemAt(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_elemAt(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
elemAt(state, pos, *args[0], state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.elemAt"), v);
|
elemAt(state, pos, *args[0], state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.elemAt: "), v);
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_elemAt({
|
static RegisterPrimOp primop_elemAt({
|
||||||
|
@ -2643,7 +2643,7 @@ static RegisterPrimOp primop_head({
|
||||||
don't want to use it! */
|
don't want to use it! */
|
||||||
static void prim_tail(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_tail(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.tail");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.tail: ");
|
||||||
if (args[0]->listSize() == 0)
|
if (args[0]->listSize() == 0)
|
||||||
throw Error({
|
throw Error({
|
||||||
.msg = hintfmt("'tail' called on an empty list"),
|
.msg = hintfmt("'tail' called on an empty list"),
|
||||||
|
@ -2674,12 +2674,12 @@ static RegisterPrimOp primop_tail({
|
||||||
/* Apply a function to every element of a list. */
|
/* Apply a function to every element of a list. */
|
||||||
static void prim_map(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_map(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.map");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.map: ");
|
||||||
|
|
||||||
state.mkList(v, args[1]->listSize());
|
state.mkList(v, args[1]->listSize());
|
||||||
|
|
||||||
if (args[1]->listSize() > 0) {
|
if (args[1]->listSize() > 0) {
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.map");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.map: ");
|
||||||
|
|
||||||
for (unsigned int n = 0; n < v.listSize(); ++n)
|
for (unsigned int n = 0; n < v.listSize(); ++n)
|
||||||
(v.listElems()[n] = state.allocValue())->mkApp(
|
(v.listElems()[n] = state.allocValue())->mkApp(
|
||||||
|
@ -2708,14 +2708,14 @@ static RegisterPrimOp primop_map({
|
||||||
returns true. */
|
returns true. */
|
||||||
static void prim_filter(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_filter(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.filter");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.filter: ");
|
||||||
|
|
||||||
if (args[1]->listSize() == 0) {
|
if (args[1]->listSize() == 0) {
|
||||||
v = *args[1];
|
v = *args[1];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.filter");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.filter: ");
|
||||||
|
|
||||||
// FIXME: putting this on the stack is risky.
|
// FIXME: putting this on the stack is risky.
|
||||||
Value * vs[args[1]->listSize()];
|
Value * vs[args[1]->listSize()];
|
||||||
|
@ -2725,7 +2725,7 @@ static void prim_filter(EvalState & state, const Pos & pos, Value * * args, Valu
|
||||||
for (unsigned int n = 0; n < args[1]->listSize(); ++n) {
|
for (unsigned int n = 0; n < args[1]->listSize(); ++n) {
|
||||||
Value res;
|
Value res;
|
||||||
state.callFunction(*args[0], *args[1]->listElems()[n], res, noPos);
|
state.callFunction(*args[0], *args[1]->listElems()[n], res, noPos);
|
||||||
if (state.forceBool(res, pos, "While evaluating the return value of the filtering function passed to builtins.filter"))
|
if (state.forceBool(res, pos, "While evaluating the return value of the filtering function passed to builtins.filter: "))
|
||||||
vs[k++] = args[1]->listElems()[n];
|
vs[k++] = args[1]->listElems()[n];
|
||||||
else
|
else
|
||||||
same = false;
|
same = false;
|
||||||
|
@ -2753,9 +2753,9 @@ static RegisterPrimOp primop_filter({
|
||||||
static void prim_elem(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_elem(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
bool res = false;
|
bool res = false;
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.elem");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.elem: ");
|
||||||
for (auto elem : args[1]->listItems())
|
for (auto elem : args[1]->listItems())
|
||||||
if (state.eqValues(*args[0], *elem)) {
|
if (state.eqValues(*args[0], *elem, pos, "While searching for the presence of the given element in the list: ")) {
|
||||||
res = true;
|
res = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2775,7 +2775,7 @@ static RegisterPrimOp primop_elem({
|
||||||
/* Concatenate a list of lists. */
|
/* Concatenate a list of lists. */
|
||||||
static void prim_concatLists(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_concatLists(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.concatLists");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.concatLists: ");
|
||||||
state.concatLists(v, args[0]->listSize(), args[0]->listElems(), pos, "While evaluating a value of the list passed to builtins.concatLists");
|
state.concatLists(v, args[0]->listSize(), args[0]->listElems(), pos, "While evaluating a value of the list passed to builtins.concatLists");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2791,7 +2791,7 @@ static RegisterPrimOp primop_concatLists({
|
||||||
/* Return the length of a list. This is an O(1) time operation. */
|
/* Return the length of a list. This is an O(1) time operation. */
|
||||||
static void prim_length(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_length(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.length");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.length: ");
|
||||||
v.mkInt(args[0]->listSize());
|
v.mkInt(args[0]->listSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2808,8 +2808,8 @@ static RegisterPrimOp primop_length({
|
||||||
right. The operator is applied strictly. */
|
right. The operator is applied strictly. */
|
||||||
static void prim_foldlStrict(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_foldlStrict(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.foldlStrict");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.foldlStrict: ");
|
||||||
state.forceList(*args[2], pos, "While evaluating the third argument passed to builtins.foldlStrict");
|
state.forceList(*args[2], pos, "While evaluating the third argument passed to builtins.foldlStrict: ");
|
||||||
|
|
||||||
if (args[2]->listSize()) {
|
if (args[2]->listSize()) {
|
||||||
Value * vCur = args[1];
|
Value * vCur = args[1];
|
||||||
|
@ -2841,13 +2841,13 @@ static RegisterPrimOp primop_foldlStrict({
|
||||||
|
|
||||||
static void anyOrAll(bool any, EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void anyOrAll(bool any, EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceFunction(*args[0], pos, std::string("While evaluating the first argument passed to builtins.") + (any ? "any" : "all"));
|
state.forceFunction(*args[0], pos, std::string("While evaluating the first argument passed to builtins.: ") + (any ? "any" : "all: "));
|
||||||
state.forceList(*args[1], pos, std::string("While evaluating the second argument passed to builtins.") + (any ? "any" : "all"));
|
state.forceList(*args[1], pos, std::string("While evaluating the second argument passed to builtins.: ") + (any ? "any" : "all"));
|
||||||
|
|
||||||
Value vTmp;
|
Value vTmp;
|
||||||
for (auto elem : args[1]->listItems()) {
|
for (auto elem : args[1]->listItems()) {
|
||||||
state.callFunction(*args[0], *elem, vTmp, pos);
|
state.callFunction(*args[0], *elem, vTmp, pos);
|
||||||
bool res = state.forceBool(vTmp, pos, std::string("While evaluating the return value of the function passed to builtins.") + (any ? "any" : "all"));
|
bool res = state.forceBool(vTmp, pos, std::string("While evaluating the return value of the function passed to builtins.: ") + (any ? "any" : "all"));
|
||||||
if (res == any) {
|
if (res == any) {
|
||||||
v.mkBool(any);
|
v.mkBool(any);
|
||||||
return;
|
return;
|
||||||
|
@ -2890,7 +2890,7 @@ static RegisterPrimOp primop_all({
|
||||||
|
|
||||||
static void prim_genList(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_genList(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto len = state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.genList");
|
auto len = state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.genList: ");
|
||||||
|
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
|
@ -2928,7 +2928,7 @@ static void prim_lessThan(EvalState & state, const Pos & pos, Value * * args, Va
|
||||||
|
|
||||||
static void prim_sort(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_sort(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.sort");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.sort: ");
|
||||||
|
|
||||||
auto len = args[1]->listSize();
|
auto len = args[1]->listSize();
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
|
@ -2936,7 +2936,7 @@ static void prim_sort(EvalState & state, const Pos & pos, Value * * args, Value
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.sort");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.sort: ");
|
||||||
|
|
||||||
state.mkList(v, len);
|
state.mkList(v, len);
|
||||||
for (unsigned int n = 0; n < len; ++n) {
|
for (unsigned int n = 0; n < len; ++n) {
|
||||||
|
@ -2948,12 +2948,12 @@ static void prim_sort(EvalState & state, const Pos & pos, Value * * args, Value
|
||||||
/* Optimization: if the comparator is lessThan, bypass
|
/* Optimization: if the comparator is lessThan, bypass
|
||||||
callFunction. */
|
callFunction. */
|
||||||
if (args[0]->isPrimOp() && args[0]->primOp->fun == prim_lessThan)
|
if (args[0]->isPrimOp() && args[0]->primOp->fun == prim_lessThan)
|
||||||
return CompareValues(state, pos, "While evaluating the ordering function passed to builtins.sort")(a, b);
|
return CompareValues(state, pos, "While evaluating the ordering function passed to builtins.sort: ")(a, b);
|
||||||
|
|
||||||
Value * vs[] = {a, b};
|
Value * vs[] = {a, b};
|
||||||
Value vBool;
|
Value vBool;
|
||||||
state.callFunction(*args[0], 2, vs, vBool, pos);
|
state.callFunction(*args[0], 2, vs, vBool, pos);
|
||||||
return state.forceBool(vBool, pos, "While evaluating the return value of the sorting function passed to builtins.sort");
|
return state.forceBool(vBool, pos, "While evaluating the return value of the sorting function passed to builtins.sort: ");
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FIXME: std::sort can segfault if the comparator is not a strict
|
/* FIXME: std::sort can segfault if the comparator is not a strict
|
||||||
|
@ -2985,8 +2985,8 @@ static RegisterPrimOp primop_sort({
|
||||||
|
|
||||||
static void prim_partition(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_partition(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.partition");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.partition: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.partition");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.partition: ");
|
||||||
|
|
||||||
auto len = args[1]->listSize();
|
auto len = args[1]->listSize();
|
||||||
|
|
||||||
|
@ -2997,7 +2997,7 @@ static void prim_partition(EvalState & state, const Pos & pos, Value * * args, V
|
||||||
state.forceValue(*vElem, pos);
|
state.forceValue(*vElem, pos);
|
||||||
Value res;
|
Value res;
|
||||||
state.callFunction(*args[0], *vElem, res, pos);
|
state.callFunction(*args[0], *vElem, res, pos);
|
||||||
if (state.forceBool(res, pos, "While evaluating the return value of the partition function passed to builtins.partition"))
|
if (state.forceBool(res, pos, "While evaluating the return value of the partition function passed to builtins.partition: "))
|
||||||
right.push_back(vElem);
|
right.push_back(vElem);
|
||||||
else
|
else
|
||||||
wrong.push_back(vElem);
|
wrong.push_back(vElem);
|
||||||
|
@ -3045,15 +3045,15 @@ static RegisterPrimOp primop_partition({
|
||||||
|
|
||||||
static void prim_groupBy(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_groupBy(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.groupBy");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.groupBy: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.groupBy");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.groupBy: ");
|
||||||
|
|
||||||
ValueVectorMap attrs;
|
ValueVectorMap attrs;
|
||||||
|
|
||||||
for (auto vElem : args[1]->listItems()) {
|
for (auto vElem : args[1]->listItems()) {
|
||||||
Value res;
|
Value res;
|
||||||
state.callFunction(*args[0], *vElem, res, pos);
|
state.callFunction(*args[0], *vElem, res, pos);
|
||||||
auto name = state.forceStringNoCtx(res, pos, "While evaluating the return value of the grouping function passed to builtins.groupBy");
|
auto name = state.forceStringNoCtx(res, pos, "While evaluating the return value of the grouping function passed to builtins.groupBy: ");
|
||||||
Symbol sym = state.symbols.create(name);
|
Symbol sym = state.symbols.create(name);
|
||||||
auto vector = attrs.try_emplace(sym, ValueVector()).first;
|
auto vector = attrs.try_emplace(sym, ValueVector()).first;
|
||||||
vector->second.push_back(vElem);
|
vector->second.push_back(vElem);
|
||||||
|
@ -3097,8 +3097,8 @@ static RegisterPrimOp primop_groupBy({
|
||||||
|
|
||||||
static void prim_concatMap(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_concatMap(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.concatMap");
|
state.forceFunction(*args[0], pos, "While evaluating the first argument passed to builtins.concatMap: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.concatMap");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.concatMap: ");
|
||||||
auto nrLists = args[1]->listSize();
|
auto nrLists = args[1]->listSize();
|
||||||
|
|
||||||
Value lists[nrLists];
|
Value lists[nrLists];
|
||||||
|
@ -3108,7 +3108,7 @@ static void prim_concatMap(EvalState & state, const Pos & pos, Value * * args, V
|
||||||
Value * vElem = args[1]->listElems()[n];
|
Value * vElem = args[1]->listElems()[n];
|
||||||
state.callFunction(*args[0], *vElem, lists[n], pos);
|
state.callFunction(*args[0], *vElem, lists[n], pos);
|
||||||
try {
|
try {
|
||||||
state.forceList(lists[n], lists[n].determinePos(args[0]->determinePos(pos)), "While evaluating the return value of the function passed to buitlins.concatMap");
|
state.forceList(lists[n], lists[n].determinePos(args[0]->determinePos(pos)), "While evaluating the return value of the function passed to buitlins.concatMap: ");
|
||||||
} catch (TypeError &e) {
|
} catch (TypeError &e) {
|
||||||
e.addTrace(pos, hintfmt("while invoking '%s'", "concatMap"));
|
e.addTrace(pos, hintfmt("while invoking '%s'", "concatMap"));
|
||||||
throw;
|
throw;
|
||||||
|
@ -3147,11 +3147,11 @@ static void prim_add(EvalState & state, const Pos & pos, Value * * args, Value &
|
||||||
state.forceValue(*args[0], pos);
|
state.forceValue(*args[0], pos);
|
||||||
state.forceValue(*args[1], pos);
|
state.forceValue(*args[1], pos);
|
||||||
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
||||||
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first argument of the addition")
|
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first argument of the addition: ")
|
||||||
+ state.forceFloat(*args[1], pos, "While evaluating the second argument of the addition"));
|
+ state.forceFloat(*args[1], pos, "While evaluating the second argument of the addition: "));
|
||||||
else
|
else
|
||||||
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the addition")
|
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the addition: ")
|
||||||
+ state.forceInt(*args[1], pos, "While evaluating the second argument of the addition"));
|
+ state.forceInt(*args[1], pos, "While evaluating the second argument of the addition: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_add({
|
static RegisterPrimOp primop_add({
|
||||||
|
@ -3168,11 +3168,11 @@ static void prim_sub(EvalState & state, const Pos & pos, Value * * args, Value &
|
||||||
state.forceValue(*args[0], pos);
|
state.forceValue(*args[0], pos);
|
||||||
state.forceValue(*args[1], pos);
|
state.forceValue(*args[1], pos);
|
||||||
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
||||||
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first argument of the subtraction")
|
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first argument of the subtraction: ")
|
||||||
- state.forceFloat(*args[1], pos, "While evaluating the second argument of the subtraction"));
|
- state.forceFloat(*args[1], pos, "While evaluating the second argument of the subtraction: "));
|
||||||
else
|
else
|
||||||
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the subtraction")
|
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the subtraction: ")
|
||||||
- state.forceInt(*args[1], pos, "While evaluating the second argument of the subtraction"));
|
- state.forceInt(*args[1], pos, "While evaluating the second argument of the subtraction: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_sub({
|
static RegisterPrimOp primop_sub({
|
||||||
|
@ -3189,11 +3189,11 @@ static void prim_mul(EvalState & state, const Pos & pos, Value * * args, Value &
|
||||||
state.forceValue(*args[0], pos);
|
state.forceValue(*args[0], pos);
|
||||||
state.forceValue(*args[1], pos);
|
state.forceValue(*args[1], pos);
|
||||||
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
if (args[0]->type() == nFloat || args[1]->type() == nFloat)
|
||||||
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first of the multiplication")
|
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first of the multiplication: ")
|
||||||
* state.forceFloat(*args[1], pos, "While evaluating the second argument of the multiplication"));
|
* state.forceFloat(*args[1], pos, "While evaluating the second argument of the multiplication: "));
|
||||||
else
|
else
|
||||||
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the multiplication")
|
v.mkInt( state.forceInt(*args[0], pos, "While evaluating the first argument of the multiplication: ")
|
||||||
* state.forceInt(*args[1], pos, "While evaluating the second argument of the multiplication"));
|
* state.forceInt(*args[1], pos, "While evaluating the second argument of the multiplication: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_mul({
|
static RegisterPrimOp primop_mul({
|
||||||
|
@ -3210,7 +3210,7 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value &
|
||||||
state.forceValue(*args[0], pos);
|
state.forceValue(*args[0], pos);
|
||||||
state.forceValue(*args[1], pos);
|
state.forceValue(*args[1], pos);
|
||||||
|
|
||||||
NixFloat f2 = state.forceFloat(*args[1], pos, "While evaluating the second operand of the division");
|
NixFloat f2 = state.forceFloat(*args[1], pos, "While evaluating the second operand of the division: ");
|
||||||
if (f2 == 0)
|
if (f2 == 0)
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("division by zero"),
|
.msg = hintfmt("division by zero"),
|
||||||
|
@ -3218,10 +3218,10 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value &
|
||||||
});
|
});
|
||||||
|
|
||||||
if (args[0]->type() == nFloat || args[1]->type() == nFloat) {
|
if (args[0]->type() == nFloat || args[1]->type() == nFloat) {
|
||||||
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first operand of the division") / f2);
|
v.mkFloat(state.forceFloat(*args[0], pos, "While evaluating the first operand of the division: ") / f2);
|
||||||
} else {
|
} else {
|
||||||
NixInt i1 = state.forceInt(*args[0], pos, "While evaluating the first operand of the division");
|
NixInt i1 = state.forceInt(*args[0], pos, "While evaluating the first operand of the division: ");
|
||||||
NixInt i2 = state.forceInt(*args[1], pos, "While evaluating the second operand of the division");
|
NixInt i2 = state.forceInt(*args[1], pos, "While evaluating the second operand of the division: ");
|
||||||
/* Avoid division overflow as it might raise SIGFPE. */
|
/* Avoid division overflow as it might raise SIGFPE. */
|
||||||
if (i1 == std::numeric_limits<NixInt>::min() && i2 == -1)
|
if (i1 == std::numeric_limits<NixInt>::min() && i2 == -1)
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
|
@ -3244,8 +3244,8 @@ static RegisterPrimOp primop_div({
|
||||||
|
|
||||||
static void prim_bitAnd(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_bitAnd(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitAnd")
|
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitAnd: ")
|
||||||
& state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitAnd"));
|
& state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitAnd: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_bitAnd({
|
static RegisterPrimOp primop_bitAnd({
|
||||||
|
@ -3259,8 +3259,8 @@ static RegisterPrimOp primop_bitAnd({
|
||||||
|
|
||||||
static void prim_bitOr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_bitOr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitOr")
|
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitOr: ")
|
||||||
| state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitOr"));
|
| state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitOr: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_bitOr({
|
static RegisterPrimOp primop_bitOr({
|
||||||
|
@ -3274,8 +3274,8 @@ static RegisterPrimOp primop_bitOr({
|
||||||
|
|
||||||
static void prim_bitXor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_bitXor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitXor")
|
v.mkInt(state.forceInt(*args[0], pos, "While evaluating the first argument passed to builtins.bitXor: ")
|
||||||
^ state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitXor"));
|
^ state.forceInt(*args[1], pos, "While evaluating the second argument passed to builtins.bitXor: "));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RegisterPrimOp primop_bitXor({
|
static RegisterPrimOp primop_bitXor({
|
||||||
|
@ -3319,7 +3319,7 @@ static RegisterPrimOp primop_lessThan({
|
||||||
static void prim_toString(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_toString(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.coerceToString(pos, *args[0], context, true, false, "While evaluating the first argument passed to builtins.toString");
|
auto s = state.coerceToString(pos, *args[0], context, true, false, "While evaluating the first argument passed to builtins.toString: ");
|
||||||
v.mkString(*s, context);
|
v.mkString(*s, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3353,10 +3353,10 @@ static RegisterPrimOp primop_toString({
|
||||||
non-negative. */
|
non-negative. */
|
||||||
static void prim_substring(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_substring(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
int start = state.forceInt(*args[0], pos, "While evaluating the first argument (the start offset) passed to builtins.substring");
|
int start = state.forceInt(*args[0], pos, "While evaluating the first argument (the start offset) passed to builtins.substring: ");
|
||||||
int len = state.forceInt(*args[1], pos, "While evaluating the second argument (the substring length) passed to builtins.substring");
|
int len = state.forceInt(*args[1], pos, "While evaluating the second argument (the substring length) passed to builtins.substring: ");
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.coerceToString(pos, *args[2], context, "While evaluating the third argument (the string) passed to builtins.substring");
|
auto s = state.coerceToString(pos, *args[2], context, "While evaluating the third argument (the string) passed to builtins.substring: ");
|
||||||
|
|
||||||
if (start < 0)
|
if (start < 0)
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
|
@ -3390,7 +3390,7 @@ static RegisterPrimOp primop_substring({
|
||||||
static void prim_stringLength(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_stringLength(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.stringLength");
|
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.stringLength: ");
|
||||||
v.mkInt(s->size());
|
v.mkInt(s->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3407,7 +3407,7 @@ static RegisterPrimOp primop_stringLength({
|
||||||
/* Return the cryptographic hash of a string in base-16. */
|
/* Return the cryptographic hash of a string in base-16. */
|
||||||
static void prim_hashString(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_hashString(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto type = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hashString");
|
auto type = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.hashString: ");
|
||||||
std::optional<HashType> ht = parseHashType(type);
|
std::optional<HashType> ht = parseHashType(type);
|
||||||
if (!ht)
|
if (!ht)
|
||||||
throw Error({
|
throw Error({
|
||||||
|
@ -3416,7 +3416,7 @@ static void prim_hashString(EvalState & state, const Pos & pos, Value * * args,
|
||||||
});
|
});
|
||||||
|
|
||||||
PathSet context; // discarded
|
PathSet context; // discarded
|
||||||
auto s = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.hashString");
|
auto s = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.hashString: ");
|
||||||
|
|
||||||
v.mkString(hashString(*ht, s).to_string(Base16, false));
|
v.mkString(hashString(*ht, s).to_string(Base16, false));
|
||||||
}
|
}
|
||||||
|
@ -3455,14 +3455,14 @@ std::shared_ptr<RegexCache> makeRegexCache()
|
||||||
|
|
||||||
void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto re = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.match");
|
auto re = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.match: ");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
auto regex = state.regexCache->get(re);
|
auto regex = state.regexCache->get(re);
|
||||||
|
|
||||||
PathSet context;
|
PathSet context;
|
||||||
const auto str = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.match");
|
const auto str = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.match: ");
|
||||||
|
|
||||||
std::cmatch match;
|
std::cmatch match;
|
||||||
if (!std::regex_match(str.begin(), str.end(), match, regex)) {
|
if (!std::regex_match(str.begin(), str.end(), match, regex)) {
|
||||||
|
@ -3536,14 +3536,14 @@ static RegisterPrimOp primop_match({
|
||||||
non-matching parts interleaved by the lists of the matching groups. */
|
non-matching parts interleaved by the lists of the matching groups. */
|
||||||
void prim_split(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
void prim_split(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto re = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.split");
|
auto re = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.split: ");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
auto regex = state.regexCache->get(re);
|
auto regex = state.regexCache->get(re);
|
||||||
|
|
||||||
PathSet context;
|
PathSet context;
|
||||||
const auto str = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.split");
|
const auto str = state.forceString(*args[1], context, pos, "While evaluating the second argument passed to builtins.split: ");
|
||||||
|
|
||||||
auto begin = std::cregex_iterator(str.begin(), str.end(), regex);
|
auto begin = std::cregex_iterator(str.begin(), str.end(), regex);
|
||||||
auto end = std::cregex_iterator();
|
auto end = std::cregex_iterator();
|
||||||
|
@ -3642,8 +3642,8 @@ static void prim_concatStringsSep(EvalState & state, const Pos & pos, Value * *
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
|
|
||||||
auto sep = state.forceString(*args[0], context, pos, "While evaluating the first argument (the separator string) passed to builtins.concatStringsSep");
|
auto sep = state.forceString(*args[0], context, pos, "While evaluating the first argument (the separator string) passed to builtins.concatStringsSep: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument (the list of strings to concat) passed to builtins.concatStringsSep");
|
state.forceList(*args[1], pos, "While evaluating the second argument (the list of strings to concat) passed to builtins.concatStringsSep: ");
|
||||||
|
|
||||||
std::string res;
|
std::string res;
|
||||||
res.reserve((args[1]->listSize() + 32) * sep.size());
|
res.reserve((args[1]->listSize() + 32) * sep.size());
|
||||||
|
@ -3651,7 +3651,7 @@ static void prim_concatStringsSep(EvalState & state, const Pos & pos, Value * *
|
||||||
|
|
||||||
for (auto elem : args[1]->listItems()) {
|
for (auto elem : args[1]->listItems()) {
|
||||||
if (first) first = false; else res += sep;
|
if (first) first = false; else res += sep;
|
||||||
res += *state.coerceToString(pos, *elem, context, "While evaluating one element of the list of strings to concat passed to builtins.concatStringsSep");
|
res += *state.coerceToString(pos, *elem, context, "While evaluating one element of the list of strings to concat passed to builtins.concatStringsSep: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
v.mkString(res, context);
|
v.mkString(res, context);
|
||||||
|
@ -3670,8 +3670,8 @@ static RegisterPrimOp primop_concatStringsSep({
|
||||||
|
|
||||||
static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.replaceStrings");
|
state.forceList(*args[0], pos, "While evaluating the first argument passed to builtins.replaceStrings: ");
|
||||||
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.replaceStrings");
|
state.forceList(*args[1], pos, "While evaluating the second argument passed to builtins.replaceStrings: ");
|
||||||
if (args[0]->listSize() != args[1]->listSize())
|
if (args[0]->listSize() != args[1]->listSize())
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("'from' and 'to' arguments to 'replaceStrings' have different lengths"),
|
.msg = hintfmt("'from' and 'to' arguments to 'replaceStrings' have different lengths"),
|
||||||
|
@ -3681,18 +3681,18 @@ static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * ar
|
||||||
std::vector<std::string> from;
|
std::vector<std::string> from;
|
||||||
from.reserve(args[0]->listSize());
|
from.reserve(args[0]->listSize());
|
||||||
for (auto elem : args[0]->listItems())
|
for (auto elem : args[0]->listItems())
|
||||||
from.emplace_back(state.forceString(*elem, pos, "While evaluating one of the strings to replace in builtins.replaceStrings"));
|
from.emplace_back(state.forceString(*elem, pos, "While evaluating one of the strings to replace in builtins.replaceStrings: "));
|
||||||
|
|
||||||
std::vector<std::pair<std::string, PathSet>> to;
|
std::vector<std::pair<std::string, PathSet>> to;
|
||||||
to.reserve(args[1]->listSize());
|
to.reserve(args[1]->listSize());
|
||||||
for (auto elem : args[1]->listItems()) {
|
for (auto elem : args[1]->listItems()) {
|
||||||
PathSet ctx;
|
PathSet ctx;
|
||||||
auto s = state.forceString(*elem, ctx, pos, "While evaluating one of the replacement strings of builtins.replaceStrings");
|
auto s = state.forceString(*elem, ctx, pos, "While evaluating one of the replacement strings of builtins.replaceStrings: ");
|
||||||
to.emplace_back(s, std::move(ctx));
|
to.emplace_back(s, std::move(ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.forceString(*args[2], context, pos, "While evaluating the third argument passed to builtins.replaceStrings");
|
auto s = state.forceString(*args[2], context, pos, "While evaluating the third argument passed to builtins.replaceStrings: ");
|
||||||
|
|
||||||
std::string res;
|
std::string res;
|
||||||
// Loops one past last character to handle the case where 'from' contains an empty string.
|
// Loops one past last character to handle the case where 'from' contains an empty string.
|
||||||
|
@ -3750,7 +3750,7 @@ static RegisterPrimOp primop_replaceStrings({
|
||||||
|
|
||||||
static void prim_parseDrvName(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_parseDrvName(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto name = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.parseDrvName");
|
auto name = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.parseDrvName: ");
|
||||||
DrvName parsed(name);
|
DrvName parsed(name);
|
||||||
auto attrs = state.buildBindings(2);
|
auto attrs = state.buildBindings(2);
|
||||||
attrs.alloc(state.sName).mkString(parsed.name);
|
attrs.alloc(state.sName).mkString(parsed.name);
|
||||||
|
@ -3774,8 +3774,8 @@ static RegisterPrimOp primop_parseDrvName({
|
||||||
|
|
||||||
static void prim_compareVersions(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_compareVersions(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto version1 = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.compareVersions");
|
auto version1 = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.compareVersions: ");
|
||||||
auto version2 = state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.compareVersions");
|
auto version2 = state.forceStringNoCtx(*args[1], pos, "While evaluating the second argument passed to builtins.compareVersions: ");
|
||||||
v.mkInt(compareVersions(version1, version2));
|
v.mkInt(compareVersions(version1, version2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3794,7 +3794,7 @@ static RegisterPrimOp primop_compareVersions({
|
||||||
|
|
||||||
static void prim_splitVersion(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_splitVersion(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
auto version = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.splitVersion");
|
auto version = state.forceStringNoCtx(*args[0], pos, "While evaluating the first argument passed to builtins.splitVersion: ");
|
||||||
auto iter = version.cbegin();
|
auto iter = version.cbegin();
|
||||||
Strings components;
|
Strings components;
|
||||||
while (iter != version.cend()) {
|
while (iter != version.cend()) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace nix {
|
||||||
static void prim_unsafeDiscardStringContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_unsafeDiscardStringContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.unsafeDiscardStringContext");
|
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.unsafeDiscardStringContext: ");
|
||||||
v.mkString(*s);
|
v.mkString(*s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ static RegisterPrimOp primop_unsafeDiscardStringContext("__unsafeDiscardStringCo
|
||||||
static void prim_hasContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_hasContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
state.forceString(*args[0], context, pos, "While evaluating the argument passed to builtins.hasContext");
|
state.forceString(*args[0], context, pos, "While evaluating the argument passed to builtins.hasContext: ");
|
||||||
v.mkBool(!context.empty());
|
v.mkBool(!context.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ static RegisterPrimOp primop_hasContext("__hasContext", 1, prim_hasContext);
|
||||||
static void prim_unsafeDiscardOutputDependency(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_unsafeDiscardOutputDependency(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.unsafeDiscardOutputDependency");
|
auto s = state.coerceToString(pos, *args[0], context, "While evaluating the argument passed to builtins.unsafeDiscardOutputDependency: ");
|
||||||
|
|
||||||
PathSet context2;
|
PathSet context2;
|
||||||
for (auto & p : context)
|
for (auto & p : context)
|
||||||
|
@ -72,7 +72,7 @@ static void prim_getContext(EvalState & state, const Pos & pos, Value * * args,
|
||||||
Strings outputs;
|
Strings outputs;
|
||||||
};
|
};
|
||||||
PathSet context;
|
PathSet context;
|
||||||
state.forceString(*args[0], context, pos, "While evaluating the argument passed to builtins.getContext");
|
state.forceString(*args[0], context, pos, "While evaluating the argument passed to builtins.getContext: ");
|
||||||
auto contextInfos = std::map<Path, ContextInfo>();
|
auto contextInfos = std::map<Path, ContextInfo>();
|
||||||
for (const auto & p : context) {
|
for (const auto & p : context) {
|
||||||
Path drv;
|
Path drv;
|
||||||
|
@ -136,9 +136,9 @@ static RegisterPrimOp primop_getContext("__getContext", 1, prim_getContext);
|
||||||
static void prim_appendContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_appendContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
{
|
{
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto orig = state.forceString(*args[0], context, pos, "while evaluating the first argument passed to builtins.appendContext");
|
auto orig = state.forceString(*args[0], context, pos, "while evaluating the first argument passed to builtins.appendContext: ");
|
||||||
|
|
||||||
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.appendContext");
|
state.forceAttrs(*args[1], pos, "While evaluating the second argument passed to builtins.appendContext: ");
|
||||||
|
|
||||||
auto sPath = state.symbols.create("path");
|
auto sPath = state.symbols.create("path");
|
||||||
auto sAllOutputs = state.symbols.create("allOutputs");
|
auto sAllOutputs = state.symbols.create("allOutputs");
|
||||||
|
@ -150,16 +150,16 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg
|
||||||
});
|
});
|
||||||
if (!settings.readOnlyMode)
|
if (!settings.readOnlyMode)
|
||||||
state.store->ensurePath(state.store->parseStorePath(i.name));
|
state.store->ensurePath(state.store->parseStorePath(i.name));
|
||||||
state.forceAttrs(*i.value, *i.pos, "While evaluating the value of a string context");
|
state.forceAttrs(*i.value, *i.pos, "While evaluating the value of a string context: ");
|
||||||
auto iter = i.value->attrs->find(sPath);
|
auto iter = i.value->attrs->find(sPath);
|
||||||
if (iter != i.value->attrs->end()) {
|
if (iter != i.value->attrs->end()) {
|
||||||
if (state.forceBool(*iter->value, *iter->pos, "While evaluating the `path` attribute of a string context"))
|
if (state.forceBool(*iter->value, *iter->pos, "While evaluating the `path` attribute of a string context: "))
|
||||||
context.insert(i.name);
|
context.insert(i.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
iter = i.value->attrs->find(sAllOutputs);
|
iter = i.value->attrs->find(sAllOutputs);
|
||||||
if (iter != i.value->attrs->end()) {
|
if (iter != i.value->attrs->end()) {
|
||||||
if (state.forceBool(*iter->value, *iter->pos, "While evaluating the `allOutputs` attribute of a string context")) {
|
if (state.forceBool(*iter->value, *iter->pos, "While evaluating the `allOutputs` attribute of a string context: ")) {
|
||||||
if (!isDerivation(i.name)) {
|
if (!isDerivation(i.name)) {
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("Tried to add all-outputs context of %s, which is not a derivation, to a string", i.name),
|
.msg = hintfmt("Tried to add all-outputs context of %s, which is not a derivation, to a string", i.name),
|
||||||
|
@ -172,7 +172,7 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg
|
||||||
|
|
||||||
iter = i.value->attrs->find(state.sOutputs);
|
iter = i.value->attrs->find(state.sOutputs);
|
||||||
if (iter != i.value->attrs->end()) {
|
if (iter != i.value->attrs->end()) {
|
||||||
state.forceList(*iter->value, *iter->pos, "While evaluating the `outputs` attribute of a string context");
|
state.forceList(*iter->value, *iter->pos, "While evaluating the `outputs` attribute of a string context: ");
|
||||||
if (iter->value->listSize() && !isDerivation(i.name)) {
|
if (iter->value->listSize() && !isDerivation(i.name)) {
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("Tried to add derivation output context of %s, which is not a derivation, to a string", i.name),
|
.msg = hintfmt("Tried to add derivation output context of %s, which is not a derivation, to a string", i.name),
|
||||||
|
@ -180,7 +180,7 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
for (auto elem : iter->value->listItems()) {
|
for (auto elem : iter->value->listItems()) {
|
||||||
auto name = state.forceStringNoCtx(*elem, *iter->pos, "While evaluating an output name within a string context");
|
auto name = state.forceStringNoCtx(*elem, *iter->pos, "While evaluating an output name within a string context: ");
|
||||||
context.insert(concatStrings("!", name, "!", i.name));
|
context.insert(concatStrings("!", name, "!", i.name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,18 +22,18 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar
|
||||||
for (auto & attr : *args[0]->attrs) {
|
for (auto & attr : *args[0]->attrs) {
|
||||||
std::string_view n(attr.name);
|
std::string_view n(attr.name);
|
||||||
if (n == "url")
|
if (n == "url")
|
||||||
url = state.coerceToString(*attr.pos, *attr.value, context, false, false, "While evaluating the `url` attribute passed to builtins.fetchMercurial").toOwned();
|
url = state.coerceToString(*attr.pos, *attr.value, context, false, false, "While evaluating the `url` attribute passed to builtins.fetchMercurial: ").toOwned();
|
||||||
else if (n == "rev") {
|
else if (n == "rev") {
|
||||||
// Ugly: unlike fetchGit, here the "rev" attribute can
|
// Ugly: unlike fetchGit, here the "rev" attribute can
|
||||||
// be both a revision or a branch/tag name.
|
// be both a revision or a branch/tag name.
|
||||||
auto value = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `rev` attribute passed to builtins.fetchMercurial");
|
auto value = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `rev` attribute passed to builtins.fetchMercurial: ");
|
||||||
if (std::regex_match(value.begin(), value.end(), revRegex))
|
if (std::regex_match(value.begin(), value.end(), revRegex))
|
||||||
rev = Hash::parseAny(value, htSHA1);
|
rev = Hash::parseAny(value, htSHA1);
|
||||||
else
|
else
|
||||||
ref = value;
|
ref = value;
|
||||||
}
|
}
|
||||||
else if (n == "name")
|
else if (n == "name")
|
||||||
name = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `name` attribute passed to builtins.fetchMercurial");
|
name = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the `name` attribute passed to builtins.fetchMercurial: ");
|
||||||
else
|
else
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("unsupported argument '%s' to 'fetchMercurial'", attr.name),
|
.msg = hintfmt("unsupported argument '%s' to 'fetchMercurial'", attr.name),
|
||||||
|
@ -48,7 +48,7 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar
|
||||||
});
|
});
|
||||||
|
|
||||||
} else
|
} else
|
||||||
url = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.fetchMercurial").toOwned();
|
url = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to builtins.fetchMercurial: ").toOwned();
|
||||||
|
|
||||||
// FIXME: git externals probably can be used to bypass the URI
|
// FIXME: git externals probably can be used to bypass the URI
|
||||||
// whitelist. Ah well.
|
// whitelist. Ah well.
|
||||||
|
|
|
@ -102,7 +102,7 @@ static void fetchTree(
|
||||||
state.forceValue(*args[0], pos);
|
state.forceValue(*args[0], pos);
|
||||||
|
|
||||||
if (args[0]->type() == nAttrs) {
|
if (args[0]->type() == nAttrs) {
|
||||||
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.fetchTree");
|
state.forceAttrs(*args[0], pos, "While evaluating the argument passed to builtins.fetchTree: ");
|
||||||
|
|
||||||
fetchers::Attrs attrs;
|
fetchers::Attrs attrs;
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ static void fetchTree(
|
||||||
.msg = hintfmt("unexpected attribute 'type'"),
|
.msg = hintfmt("unexpected attribute 'type'"),
|
||||||
.errPos = pos
|
.errPos = pos
|
||||||
});
|
});
|
||||||
type = state.forceStringNoCtx(*aType->value, *aType->pos, "While evaluating the `type` attribute passed to builtins.fetchTree");
|
type = state.forceStringNoCtx(*aType->value, *aType->pos, "While evaluating the `type` attribute passed to builtins.fetchTree: ");
|
||||||
} else if (!type)
|
} else if (!type)
|
||||||
throw Error({
|
throw Error({
|
||||||
.msg = hintfmt("attribute 'type' is missing in call to 'fetchTree'"),
|
.msg = hintfmt("attribute 'type' is missing in call to 'fetchTree'"),
|
||||||
|
@ -151,7 +151,7 @@ static void fetchTree(
|
||||||
|
|
||||||
input = fetchers::Input::fromAttrs(std::move(attrs));
|
input = fetchers::Input::fromAttrs(std::move(attrs));
|
||||||
} else {
|
} else {
|
||||||
auto url = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to the fetcher").toOwned();
|
auto url = state.coerceToString(pos, *args[0], context, false, false, "While evaluating the first argument passed to the fetcher: ").toOwned();
|
||||||
|
|
||||||
if (type == "git") {
|
if (type == "git") {
|
||||||
fetchers::Attrs attrs;
|
fetchers::Attrs attrs;
|
||||||
|
@ -198,11 +198,11 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
|
||||||
for (auto & attr : *args[0]->attrs) {
|
for (auto & attr : *args[0]->attrs) {
|
||||||
std::string n(attr.name);
|
std::string n(attr.name);
|
||||||
if (n == "url")
|
if (n == "url")
|
||||||
url = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the url we should fetch");
|
url = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the url we should fetch: ");
|
||||||
else if (n == "sha256")
|
else if (n == "sha256")
|
||||||
expectedHash = newHashAllowEmpty(state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the sha256 of the content we should fetch"), htSHA256);
|
expectedHash = newHashAllowEmpty(state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the sha256 of the content we should fetch: "), htSHA256);
|
||||||
else if (n == "name")
|
else if (n == "name")
|
||||||
name = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the name of the content we should fetch");
|
name = state.forceStringNoCtx(*attr.value, *attr.pos, "While evaluating the name of the content we should fetch: ");
|
||||||
else
|
else
|
||||||
throw EvalError({
|
throw EvalError({
|
||||||
.msg = hintfmt("unsupported argument '%s' to '%s'", attr.name, who),
|
.msg = hintfmt("unsupported argument '%s' to '%s'", attr.name, who),
|
||||||
|
@ -216,7 +216,7 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
|
||||||
.errPos = pos
|
.errPos = pos
|
||||||
});
|
});
|
||||||
} else
|
} else
|
||||||
url = state.forceStringNoCtx(*args[0], pos, "While evaluating the url we should fetch");
|
url = state.forceStringNoCtx(*args[0], pos, "While evaluating the url we should fetch: ");
|
||||||
|
|
||||||
url = resolveUri(*url);
|
url = resolveUri(*url);
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace nix {
|
||||||
|
|
||||||
static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Value & val)
|
static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Value & val)
|
||||||
{
|
{
|
||||||
auto toml = state.forceStringNoCtx(*args[0], pos, "While evaluating the argument passed to builtins.fromTOML");
|
auto toml = state.forceStringNoCtx(*args[0], pos, "While evaluating the argument passed to builtins.fromTOML: ");
|
||||||
|
|
||||||
std::istringstream tomlStream(std::string{toml});
|
std::istringstream tomlStream(std::string{toml});
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ struct CmdEval : MixJSON, InstallableCommand
|
||||||
|
|
||||||
else if (raw) {
|
else if (raw) {
|
||||||
stopProgressBar();
|
stopProgressBar();
|
||||||
std::cout << *state->coerceToString(noPos, *v, context, "While generating the eval command output");
|
std::cout << *state->coerceToString(noPos, *v, context, "While generating the eval command output: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (json) {
|
else if (json) {
|
||||||
|
|
|
@ -126,12 +126,12 @@ static void enumerateOutputs(EvalState & state, Value & vFlake,
|
||||||
std::function<void(const std::string & name, Value & vProvide, const Pos & pos)> callback)
|
std::function<void(const std::string & name, Value & vProvide, const Pos & pos)> callback)
|
||||||
{
|
{
|
||||||
auto pos = vFlake.determinePos(noPos);
|
auto pos = vFlake.determinePos(noPos);
|
||||||
state.forceAttrs(vFlake, pos, "While evaluating a flake to get its outputs");
|
state.forceAttrs(vFlake, pos, "While evaluating a flake to get its outputs: ");
|
||||||
|
|
||||||
auto aOutputs = vFlake.attrs->get(state.symbols.create("outputs"));
|
auto aOutputs = vFlake.attrs->get(state.symbols.create("outputs"));
|
||||||
assert(aOutputs);
|
assert(aOutputs);
|
||||||
|
|
||||||
state.forceAttrs(*aOutputs->value, pos, "While evaluating the outputs of a flake");
|
state.forceAttrs(*aOutputs->value, pos, "While evaluating the outputs of a flake: ");
|
||||||
|
|
||||||
auto sHydraJobs = state.symbols.create("hydraJobs");
|
auto sHydraJobs = state.symbols.create("hydraJobs");
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ static void showHelp(std::vector<std::string> subcommand, MultiCommand & topleve
|
||||||
if (!attr)
|
if (!attr)
|
||||||
throw UsageError("Nix has no subcommand '%s'", concatStringsSep("", subcommand));
|
throw UsageError("Nix has no subcommand '%s'", concatStringsSep("", subcommand));
|
||||||
|
|
||||||
auto markdown = state.forceString(*attr->value, noPos, "While evaluating the lowdown help text");
|
auto markdown = state.forceString(*attr->value, noPos, "While evaluating the lowdown help text: ");
|
||||||
|
|
||||||
RunPager pager;
|
RunPager pager;
|
||||||
std::cout << renderMarkdownToTerminal(markdown) << "\n";
|
std::cout << renderMarkdownToTerminal(markdown) << "\n";
|
||||||
|
|
|
@ -28,17 +28,17 @@ std::string resolveMirrorUrl(EvalState & state, const std::string & url)
|
||||||
Value vMirrors;
|
Value vMirrors;
|
||||||
// FIXME: use nixpkgs flake
|
// FIXME: use nixpkgs flake
|
||||||
state.eval(state.parseExprFromString("import <nixpkgs/pkgs/build-support/fetchurl/mirrors.nix>", "."), vMirrors);
|
state.eval(state.parseExprFromString("import <nixpkgs/pkgs/build-support/fetchurl/mirrors.nix>", "."), vMirrors);
|
||||||
state.forceAttrs(vMirrors, noPos, "While evaluating the set of all mirrors");
|
state.forceAttrs(vMirrors, noPos, "While evaluating the set of all mirrors: ");
|
||||||
|
|
||||||
auto mirrorList = vMirrors.attrs->find(state.symbols.create(mirrorName));
|
auto mirrorList = vMirrors.attrs->find(state.symbols.create(mirrorName));
|
||||||
if (mirrorList == vMirrors.attrs->end())
|
if (mirrorList == vMirrors.attrs->end())
|
||||||
throw Error("unknown mirror name '%s'", mirrorName);
|
throw Error("unknown mirror name '%s'", mirrorName);
|
||||||
state.forceList(*mirrorList->value, noPos, "While evaluating this mirror configuration");
|
state.forceList(*mirrorList->value, noPos, "While evaluating this mirror configuration: ");
|
||||||
|
|
||||||
if (mirrorList->value->listSize() < 1)
|
if (mirrorList->value->listSize() < 1)
|
||||||
throw Error("mirror URL '%s' did not expand to anything", url);
|
throw Error("mirror URL '%s' did not expand to anything", url);
|
||||||
|
|
||||||
std::string mirror(state.forceString(*mirrorList->value->listElems()[0], noPos, "While evaluating the first available mirror"));
|
std::string mirror(state.forceString(*mirrorList->value->listElems()[0], noPos, "While evaluating the first available mirror: "));
|
||||||
return mirror + (hasSuffix(mirror, "/") ? "" : "/") + s.substr(p + 1);
|
return mirror + (hasSuffix(mirror, "/") ? "" : "/") + s.substr(p + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,27 +196,27 @@ static int main_nix_prefetch_url(int argc, char * * argv)
|
||||||
Value vRoot;
|
Value vRoot;
|
||||||
state->evalFile(path, vRoot);
|
state->evalFile(path, vRoot);
|
||||||
Value & v(*findAlongAttrPath(*state, attrPath, autoArgs, vRoot).first);
|
Value & v(*findAlongAttrPath(*state, attrPath, autoArgs, vRoot).first);
|
||||||
state->forceAttrs(v, noPos, "While evaluating the source attribute to prefetch");
|
state->forceAttrs(v, noPos, "While evaluating the source attribute to prefetch: ");
|
||||||
|
|
||||||
/* Extract the URL. */
|
/* Extract the URL. */
|
||||||
auto & attr = v.attrs->need(state->symbols.create("urls"));
|
auto & attr = v.attrs->need(state->symbols.create("urls"));
|
||||||
state->forceList(*attr.value, noPos, "While evaluating the urls to prefetch");
|
state->forceList(*attr.value, noPos, "While evaluating the urls to prefetch: ");
|
||||||
if (attr.value->listSize() < 1)
|
if (attr.value->listSize() < 1)
|
||||||
throw Error("'urls' list is empty");
|
throw Error("'urls' list is empty");
|
||||||
url = state->forceString(*attr.value->listElems()[0], noPos, "While evaluating the first url from the urls list");
|
url = state->forceString(*attr.value->listElems()[0], noPos, "While evaluating the first url from the urls list: ");
|
||||||
|
|
||||||
/* Extract the hash mode. */
|
/* Extract the hash mode. */
|
||||||
auto attr2 = v.attrs->get(state->symbols.create("outputHashMode"));
|
auto attr2 = v.attrs->get(state->symbols.create("outputHashMode"));
|
||||||
if (!attr2)
|
if (!attr2)
|
||||||
printInfo("warning: this does not look like a fetchurl call");
|
printInfo("warning: this does not look like a fetchurl call");
|
||||||
else
|
else
|
||||||
unpack = state->forceString(*attr2->value, noPos, "While evaluating the outputHashMode of the source to prefetch") == "recursive";
|
unpack = state->forceString(*attr2->value, noPos, "While evaluating the outputHashMode of the source to prefetch: ") == "recursive";
|
||||||
|
|
||||||
/* Extract the name. */
|
/* Extract the name. */
|
||||||
if (!name) {
|
if (!name) {
|
||||||
auto attr3 = v.attrs->get(state->symbols.create("name"));
|
auto attr3 = v.attrs->get(state->symbols.create("name"));
|
||||||
if (!attr3)
|
if (!attr3)
|
||||||
name = state->forceString(*attr3->value, noPos, "While evaluating the name of the source to prefetch");
|
name = state->forceString(*attr3->value, noPos, "While evaluating the name of the source to prefetch: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -342,7 +342,7 @@ StringSet NixRepl::completePrefix(const std::string & prefix)
|
||||||
Expr * e = parseString(expr);
|
Expr * e = parseString(expr);
|
||||||
Value v;
|
Value v;
|
||||||
e->eval(*state, *env, v);
|
e->eval(*state, *env, v);
|
||||||
state->forceAttrs(v, noPos, "nevermind, it is ignored anyway");
|
state->forceAttrs(v, noPos, "nevermind, it is ignored anyway: ");
|
||||||
|
|
||||||
for (auto & i : *v.attrs) {
|
for (auto & i : *v.attrs) {
|
||||||
std::string name = i.name;
|
std::string name = i.name;
|
||||||
|
@ -461,7 +461,7 @@ bool NixRepl::processLine(std::string line)
|
||||||
|
|
||||||
if (v.type() == nPath || v.type() == nString) {
|
if (v.type() == nPath || v.type() == nString) {
|
||||||
PathSet context;
|
PathSet context;
|
||||||
auto filename = state->coerceToString(noPos, v, context, "While evaluating the filename to edit");
|
auto filename = state->coerceToString(noPos, v, context, "While evaluating the filename to edit: ");
|
||||||
pos.file = state->symbols.create(*filename);
|
pos.file = state->symbols.create(*filename);
|
||||||
} else if (v.isLambda()) {
|
} else if (v.isLambda()) {
|
||||||
pos = v.lambda.fun->pos;
|
pos = v.lambda.fun->pos;
|
||||||
|
@ -675,7 +675,7 @@ void NixRepl::reloadFiles()
|
||||||
|
|
||||||
void NixRepl::addAttrsToScope(Value & attrs)
|
void NixRepl::addAttrsToScope(Value & attrs)
|
||||||
{
|
{
|
||||||
state->forceAttrs(attrs, [&]() { return attrs.determinePos(noPos); }, "While evaluating an attribute set to be merged in the global scope");
|
state->forceAttrs(attrs, [&]() { return attrs.determinePos(noPos); }, "While evaluating an attribute set to be merged in the global scope: ");
|
||||||
if (displ + attrs.attrs->size() >= envSize)
|
if (displ + attrs.attrs->size() >= envSize)
|
||||||
throw Error("environment full; cannot add more variables");
|
throw Error("environment full; cannot add more variables");
|
||||||
|
|
||||||
|
@ -780,7 +780,7 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
|
||||||
Bindings::iterator i = v.attrs->find(state->sDrvPath);
|
Bindings::iterator i = v.attrs->find(state->sDrvPath);
|
||||||
PathSet context;
|
PathSet context;
|
||||||
if (i != v.attrs->end())
|
if (i != v.attrs->end())
|
||||||
str << state->store->printStorePath(state->coerceToStorePath(*i->pos, *i->value, context, "While evaluating the drvPath of a derivation"));
|
str << state->store->printStorePath(state->coerceToStorePath(*i->pos, *i->value, context, "While evaluating the drvPath of a derivation: "));
|
||||||
else
|
else
|
||||||
str << "???";
|
str << "???";
|
||||||
str << "»";
|
str << "»";
|
||||||
|
|
|
@ -144,7 +144,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
|
||||||
Bindings & bindings(*state->allocBindings(0));
|
Bindings & bindings(*state->allocBindings(0));
|
||||||
auto v2 = findAlongAttrPath(*state, settings.thisSystem, bindings, *v).first;
|
auto v2 = findAlongAttrPath(*state, settings.thisSystem, bindings, *v).first;
|
||||||
|
|
||||||
return store->parseStorePath(state->forceString(*v2, noPos, "While evaluating the path tho latest nix version"));
|
return store->parseStorePath(state->forceString(*v2, noPos, "While evaluating the path tho latest nix version: "));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue