Skip to content

Commit

Permalink
Don't provide 'getFlake' if the 'flakes' feature is not enabled
Browse files Browse the repository at this point in the history
  • Loading branch information
edolstra committed Jun 17, 2020
1 parent fdff09e commit 0a1d3c1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/libexpr/flake/flake.cc
Expand Up @@ -588,7 +588,7 @@ static void prim_getFlake(EvalState & state, const Pos & pos, Value * * args, Va
v);
}

static RegisterPrimOp r2("getFlake", 1, prim_getFlake);
static RegisterPrimOp r2("getFlake", 1, prim_getFlake, "flakes");

}

Expand Down
8 changes: 5 additions & 3 deletions src/libexpr/primops.cc
Expand Up @@ -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});
}


Expand Down Expand Up @@ -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. */
Expand Down
17 changes: 15 additions & 2 deletions src/libexpr/primops.hh
Expand Up @@ -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
Expand Down

0 comments on commit 0a1d3c1

Please sign in to comment.