1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-28 22:01:15 +02:00

Merge branch 'register-constant' of https://github.com/shlevy/nix

This commit is contained in:
Eelco Dolstra 2018-02-13 12:24:48 +01:00
commit 7828dca9e8
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
6 changed files with 15 additions and 6 deletions

View file

@ -404,7 +404,7 @@ Path EvalState::toRealPath(const Path & path, const PathSet & context)
};
void EvalState::addConstant(const string & name, Value & v)
Value * EvalState::addConstant(const string & name, Value & v)
{
Value * v2 = allocValue();
*v2 = v;
@ -412,12 +412,18 @@ void EvalState::addConstant(const string & name, Value & v)
baseEnv.values[baseEnvDispl++] = v2;
string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name;
baseEnv.values[0]->attrs->push_back(Attr(symbols.create(name2), v2));
return v2;
}
Value * EvalState::addPrimOp(const string & name,
unsigned int arity, PrimOpFun primOp)
{
if (arity == 0) {
Value v;
primOp(*this, noPos, nullptr, v);
return addConstant(name, v);
}
Value * v = allocValue();
string name2 = string(name, 0, 2) == "__" ? string(name, 2) : name;
Symbol sym = symbols.create(name2);

View file

@ -210,7 +210,7 @@ private:
void createBaseEnv();
void addConstant(const string & name, Value & v);
Value * addConstant(const string & name, Value & v);
Value * addPrimOp(const string & name,
unsigned int arity, PrimOpFun primOp);

View file

@ -9,6 +9,9 @@ struct RegisterPrimOp
{
typedef std::vector<std::tuple<std::string, size_t, PrimOpFun>> 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);
};