diff --git a/src/libexpr/eval-settings.cc b/src/libexpr/eval-settings.cc index ade0abf9a..ebb9e5bbd 100644 --- a/src/libexpr/eval-settings.cc +++ b/src/libexpr/eval-settings.cc @@ -103,4 +103,13 @@ Path getNixDefExpr() : getHome() + "/.nix-defexpr"; } +void EvalSettings::addPrimOp(PrimOp && primOp) +{ + extraPrimOps.emplace_back(std::move(primOp)); } +void EvalSettings::addPrimOp(const PrimOp & primOp) +{ + extraPrimOps.emplace_back(PrimOp(primOp)); +} + +} // namespace nix \ No newline at end of file diff --git a/src/libexpr/eval-settings.hh b/src/libexpr/eval-settings.hh index fe947aefd..368173b01 100644 --- a/src/libexpr/eval-settings.hh +++ b/src/libexpr/eval-settings.hh @@ -7,6 +7,7 @@ namespace nix { class EvalState; +struct PrimOp; struct EvalSettings : Config { @@ -50,6 +51,17 @@ struct EvalSettings : Config LookupPathHooks lookupPathHooks; + std::vector extraPrimOps; + + /** + * Register a primop to be added when an EvalState is created from these settings. + */ + void addPrimOp(PrimOp && primOp); + /** + * Register a primop to be added when an EvalState is created from these settings. + */ + void addPrimOp(const PrimOp & primOp); + Setting enableNativeCode{this, false, "allow-unsafe-native-code-during-evaluation", R"( Enable built-in functions that allow executing native code. diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 4e15175ac..53b649606 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -353,7 +353,7 @@ EvalState::EvalState( #include "fetchurl.nix.gen.hh" ); - createBaseEnv(); + createBaseEnv(settings); } diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index eb6f667a2..9b8899ccf 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -633,7 +633,7 @@ private: unsigned int baseEnvDispl = 0; - void createBaseEnv(); + void createBaseEnv(const EvalSettings & settings); Value * addConstant(const std::string & name, Value & v, Constant info); diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 54682ea31..b078592e7 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -4669,7 +4669,7 @@ RegisterPrimOp::RegisterPrimOp(PrimOp && primOp) } -void EvalState::createBaseEnv() +void EvalState::createBaseEnv(const EvalSettings & evalSettings) { baseEnv.up = 0; @@ -4928,6 +4928,12 @@ void EvalState::createBaseEnv() addPrimOp(std::move(primOpAdjusted)); } + for (auto & primOp : evalSettings.extraPrimOps) { + auto primOpAdjusted = primOp; + primOpAdjusted.arity = std::max(primOp.args.size(), primOp.arity); + addPrimOp(std::move(primOpAdjusted)); + } + /* Add a wrapper around the derivation primop that computes the `drvPath' and `outPath' attributes lazily.