1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-26 07:31:15 +02:00

Allow using RegisterPrimop to define constants.

This enables plugins to add new constants, as well as new primops.
This commit is contained in:
Shea Levy 2018-02-08 13:00:53 -05:00
parent 88cd2d41ac
commit 081f14a169
No known key found for this signature in database
GPG key ID: 5C0BD6957D86FE27
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);