Make primop registration pluggable
This way we don't have to put all primops in one giant file.
This commit is contained in:
parent
96515b0c0d
commit
12b257f045
4 changed files with 33 additions and 3 deletions
|
@ -26,9 +26,9 @@ typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args,
|
||||||
struct PrimOp
|
struct PrimOp
|
||||||
{
|
{
|
||||||
PrimOpFun fun;
|
PrimOpFun fun;
|
||||||
unsigned int arity;
|
size_t arity;
|
||||||
Symbol name;
|
Symbol name;
|
||||||
PrimOp(PrimOpFun fun, unsigned int arity, Symbol name)
|
PrimOp(PrimOpFun fun, size_t arity, Symbol name)
|
||||||
: fun(fun), arity(arity), name(name) { }
|
: fun(fun), arity(arity), name(name) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ libexpr_NAME = libnixexpr
|
||||||
|
|
||||||
libexpr_DIR := $(d)
|
libexpr_DIR := $(d)
|
||||||
|
|
||||||
libexpr_SOURCES := $(wildcard $(d)/*.cc) $(d)/lexer-tab.cc $(d)/parser-tab.cc
|
libexpr_SOURCES := $(wildcard $(d)/*.cc) $(wildcard $(d)/primops/*.cc) $(d)/lexer-tab.cc $(d)/parser-tab.cc
|
||||||
|
|
||||||
libexpr_CXXFLAGS := -Wno-deprecated-register
|
libexpr_CXXFLAGS := -Wno-deprecated-register
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
#include "value-to-json.hh"
|
#include "value-to-json.hh"
|
||||||
#include "value-to-xml.hh"
|
#include "value-to-xml.hh"
|
||||||
|
#include "primops.hh"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -1725,6 +1726,16 @@ static void prim_fetchTarball(EvalState & state, const Pos & pos, Value * * args
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
RegisterPrimOp::PrimOps * RegisterPrimOp::primOps;
|
||||||
|
|
||||||
|
|
||||||
|
RegisterPrimOp::RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun)
|
||||||
|
{
|
||||||
|
if (!primOps) primOps = new PrimOps;
|
||||||
|
primOps->emplace_back(name, arity, fun);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::createBaseEnv()
|
void EvalState::createBaseEnv()
|
||||||
{
|
{
|
||||||
baseEnv.up = 0;
|
baseEnv.up = 0;
|
||||||
|
@ -1889,6 +1900,10 @@ void EvalState::createBaseEnv()
|
||||||
}
|
}
|
||||||
addConstant("__nixPath", v);
|
addConstant("__nixPath", v);
|
||||||
|
|
||||||
|
if (RegisterPrimOp::primOps)
|
||||||
|
for (auto & primOp : *RegisterPrimOp::primOps)
|
||||||
|
addPrimOp(std::get<0>(primOp), std::get<1>(primOp), std::get<2>(primOp));
|
||||||
|
|
||||||
/* Now that we've added all primops, sort the `builtins' set,
|
/* Now that we've added all primops, sort the `builtins' set,
|
||||||
because attribute lookups expect it to be sorted. */
|
because attribute lookups expect it to be sorted. */
|
||||||
baseEnv.values[0]->attrs->sort();
|
baseEnv.values[0]->attrs->sort();
|
||||||
|
|
15
src/libexpr/primops.hh
Normal file
15
src/libexpr/primops.hh
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include "eval.hh"
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
struct RegisterPrimOp
|
||||||
|
{
|
||||||
|
typedef std::vector<std::tuple<std::string, size_t, PrimOpFun>> PrimOps;
|
||||||
|
static PrimOps * primOps;
|
||||||
|
RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue