diff --git a/src/libexpr/include/nix/expr/primops.hh b/src/libexpr/include/nix/expr/primops.hh index f0742a138..0b4ecdd50 100644 --- a/src/libexpr/include/nix/expr/primops.hh +++ b/src/libexpr/include/nix/expr/primops.hh @@ -27,7 +27,12 @@ constexpr size_t conservativeStackReservation = 16; struct RegisterPrimOp { typedef std::vector PrimOps; - static PrimOps * primOps; + + static PrimOps & primOps() + { + static PrimOps primOps; + return primOps; + } /** * You can register a constant by passing an arity of 0. fun diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index b7b027fba..535a9a501 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -4713,13 +4713,9 @@ static RegisterPrimOp primop_splitVersion({ *************************************************************/ -RegisterPrimOp::PrimOps * RegisterPrimOp::primOps; - - RegisterPrimOp::RegisterPrimOp(PrimOp && primOp) { - if (!primOps) primOps = new PrimOps; - primOps->push_back(std::move(primOp)); + primOps().push_back(std::move(primOp)); } @@ -4973,14 +4969,12 @@ void EvalState::createBaseEnv(const EvalSettings & evalSettings) )", }); - if (RegisterPrimOp::primOps) - for (auto & primOp : *RegisterPrimOp::primOps) - if (experimentalFeatureSettings.isEnabled(primOp.experimentalFeature)) - { - auto primOpAdjusted = primOp; - primOpAdjusted.arity = std::max(primOp.args.size(), primOp.arity); - addPrimOp(std::move(primOpAdjusted)); - } + for (auto & primOp : RegisterPrimOp::primOps()) + if (experimentalFeatureSettings.isEnabled(primOp.experimentalFeature)) { + auto primOpAdjusted = primOp; + primOpAdjusted.arity = std::max(primOp.args.size(), primOp.arity); + addPrimOp(std::move(primOpAdjusted)); + } for (auto & primOp : evalSettings.extraPrimOps) { auto primOpAdjusted = primOp;