libexpr: remove maxPrimOpArity
this was only used to enable an optimization we no longer need such
strong guarantees for: SmallVector can be used with a dynamic size.
Change-Id: I4513fb7e665827fe363ce6308448656e6c5badb7
This commit is contained in:
parent
85d600ca4d
commit
94bb66c867
|
@ -458,14 +458,6 @@ void EvalState::addConstant(const std::string & name, Value * v, Constant info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PrimOp::check()
|
|
||||||
{
|
|
||||||
if (arity > maxPrimOpArity) {
|
|
||||||
throw Error("primop arity must not exceed %1%", maxPrimOpArity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & output, PrimOp & primOp)
|
std::ostream & operator<<(std::ostream & output, PrimOp & primOp)
|
||||||
{
|
{
|
||||||
output << "primop " << primOp.name;
|
output << "primop " << primOp.name;
|
||||||
|
@ -1636,7 +1628,8 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
/* We have all the arguments, so call the primop with
|
/* We have all the arguments, so call the primop with
|
||||||
the previous and new arguments. */
|
the previous and new arguments. */
|
||||||
|
|
||||||
Value * vArgs[maxPrimOpArity];
|
// max arity as of writing is 3. even 4 seems excessive though.
|
||||||
|
SmallVector<Value *, 4> vArgs(arity);
|
||||||
auto n = argsDone;
|
auto n = argsDone;
|
||||||
for (Value * arg = &vCur; arg->isPrimOpApp(); arg = arg->primOpApp.left)
|
for (Value * arg = &vCur; arg->isPrimOpApp(); arg = arg->primOpApp.left)
|
||||||
vArgs[--n] = arg->primOpApp.right;
|
vArgs[--n] = arg->primOpApp.right;
|
||||||
|
@ -1653,7 +1646,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
// 1. Unify this and above code. Heavily redundant.
|
// 1. Unify this and above code. Heavily redundant.
|
||||||
// 2. Create a fake env (arg1, arg2, etc.) and a fake expr (arg1: arg2: etc: builtins.name arg1 arg2 etc)
|
// 2. Create a fake env (arg1, arg2, etc.) and a fake expr (arg1: arg2: etc: builtins.name arg1 arg2 etc)
|
||||||
// so the debugger allows to inspect the wrong parameters passed to the builtin.
|
// so the debugger allows to inspect the wrong parameters passed to the builtin.
|
||||||
fn->fun(*this, vCur.determinePos(noPos), vArgs, vCur);
|
fn->fun(*this, vCur.determinePos(noPos), vArgs.data(), vCur);
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
e.addTrace(positions[pos], "while calling the '%1%' builtin", fn->name);
|
e.addTrace(positions[pos], "while calling the '%1%' builtin", fn->name);
|
||||||
throw;
|
throw;
|
||||||
|
|
|
@ -22,13 +22,6 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
/**
|
|
||||||
* We put a limit on primop arity because it lets us use a fixed size array on
|
|
||||||
* the stack. 8 is already an impractical number of arguments. Use an attrset
|
|
||||||
* argument for such overly complicated functions.
|
|
||||||
*/
|
|
||||||
constexpr size_t maxPrimOpArity = 8;
|
|
||||||
|
|
||||||
class Store;
|
class Store;
|
||||||
class EvalState;
|
class EvalState;
|
||||||
class StorePath;
|
class StorePath;
|
||||||
|
@ -82,12 +75,6 @@ struct PrimOp
|
||||||
* Optional experimental for this to be gated on.
|
* Optional experimental for this to be gated on.
|
||||||
*/
|
*/
|
||||||
std::optional<ExperimentalFeature> experimentalFeature;
|
std::optional<ExperimentalFeature> experimentalFeature;
|
||||||
|
|
||||||
/**
|
|
||||||
* Validity check to be performed by functions that introduce primops,
|
|
||||||
* such as RegisterPrimOp() and Value::mkPrimOp().
|
|
||||||
*/
|
|
||||||
void check();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & output, PrimOp & primOp);
|
std::ostream & operator<<(std::ostream & output, PrimOp & primOp);
|
||||||
|
|
|
@ -27,7 +27,6 @@ Value::Value(primop_t, PrimOp & primop)
|
||||||
, primOp(&primop)
|
, primOp(&primop)
|
||||||
, _primop_pad(0)
|
, _primop_pad(0)
|
||||||
{
|
{
|
||||||
primop.check();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,7 +75,6 @@ PrimOp * Value::primOpAppPrimOp() const
|
||||||
|
|
||||||
void Value::mkPrimOp(PrimOp * p)
|
void Value::mkPrimOp(PrimOp * p)
|
||||||
{
|
{
|
||||||
p->check();
|
|
||||||
clearValue();
|
clearValue();
|
||||||
internalType = tPrimOp;
|
internalType = tPrimOp;
|
||||||
primOp = p;
|
primOp = p;
|
||||||
|
|
Loading…
Reference in a new issue