diff options
author | Shea Levy <shea@shealevy.com> | 2018-02-08T18·00-0500 |
---|---|---|
committer | Shea Levy <shea@shealevy.com> | 2018-02-08T19·35-0500 |
commit | 081f14a169d36243f97263acb41fb108af243619 (patch) | |
tree | 563a1287be33bff5b2d36d38a9e77338425d45b4 /src/libexpr/eval.cc | |
parent | 88cd2d41acb994684a3e4ead1b1676019f43b4b6 (diff) |
Allow using RegisterPrimop to define constants.
This enables plugins to add new constants, as well as new primops.
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r-- | src/libexpr/eval.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 0b0a0f7b1790..1f3bbc0a53bd 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -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); |