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:
eldritch horrors 2024-11-27 02:09:08 +01:00
parent 85d600ca4d
commit 94bb66c867
3 changed files with 3 additions and 25 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;