aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-06-17 16:54:32 +0200
committerEelco Dolstra <edolstra@gmail.com>2020-06-18 14:03:00 +0200
commit5771c8bbf29325c24e55c75743194612228f4e07 (patch)
tree273b0e0705a15c2bbd4573713d9851e430bb0f3d /src/libexpr
parent2a61bbf77fd1b4bd518912b4923265b91a8f9d67 (diff)
Don't provide 'getFlake' if the 'flakes' feature is not enabled
(cherry picked from commit 0a1d3c1dd311f94e9d1f56e1aa7fe1ab34314ec1)
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/primops.cc8
-rw-r--r--src/libexpr/primops.hh17
2 files changed, 20 insertions, 5 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index bb1926282..2f1a41a64 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -2202,10 +2202,11 @@ static void prim_splitVersion(EvalState & state, const Pos & pos, Value * * args
RegisterPrimOp::PrimOps * RegisterPrimOp::primOps;
-RegisterPrimOp::RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun)
+RegisterPrimOp::RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun,
+ std::optional<std::string> requiredFeature)
{
if (!primOps) primOps = new PrimOps;
- primOps->emplace_back(name, arity, fun);
+ primOps->push_back({name, arity, fun, requiredFeature});
}
@@ -2397,7 +2398,8 @@ void EvalState::createBaseEnv()
if (RegisterPrimOp::primOps)
for (auto & primOp : *RegisterPrimOp::primOps)
- addPrimOp(std::get<0>(primOp), std::get<1>(primOp), std::get<2>(primOp));
+ if (!primOp.requiredFeature || settings.isExperimentalFeatureEnabled(*primOp.requiredFeature))
+ addPrimOp(primOp.name, primOp.arity, primOp.primOp);
/* Now that we've added all primops, sort the `builtins' set,
because attribute lookups expect it to be sorted. */
diff --git a/src/libexpr/primops.hh b/src/libexpr/primops.hh
index 05d0792ef..75c460ecf 100644
--- a/src/libexpr/primops.hh
+++ b/src/libexpr/primops.hh
@@ -7,12 +7,25 @@ namespace nix {
struct RegisterPrimOp
{
- typedef std::vector<std::tuple<std::string, size_t, PrimOpFun>> PrimOps;
+ struct Info
+ {
+ std::string name;
+ size_t arity;
+ PrimOpFun primOp;
+ std::optional<std::string> requiredFeature;
+ };
+
+ typedef std::vector<Info> PrimOps;
static PrimOps * primOps;
+
/* You can register a constant by passing an arity of 0. fun
will get called during EvalState initialization, so there
may be primops not yet added and builtins is not yet sorted. */
- RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun);
+ RegisterPrimOp(
+ std::string name,
+ size_t arity,
+ PrimOpFun fun,
+ std::optional<std::string> requiredFeature = {});
};
/* These primops are disabled without enableNativeCode, but plugins