diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libexpr/eval.cc | 10 | ||||
-rw-r--r-- | src/libexpr/eval.hh | 1 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 9 |
3 files changed, 20 insertions, 0 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 02df4a4a325a..3334e4bbded8 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -176,6 +176,16 @@ Path evalPath(EvalState & state, Expr e) } +int evalInt(EvalState & state, Expr e) +{ + e = evalExpr(state, e); + int i; + if (!matchInt(e, i)) + throw TypeError(format("value is %1% while an integer was expected") % showType(e)); + return i; +} + + bool evalBool(EvalState & state, Expr e) { e = evalExpr(state, e); diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index b34e91055a37..a7f4e69437be 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -62,6 +62,7 @@ Expr strictEvalExpr(EvalState & state, Expr e, /* Specific results. */ string evalString(EvalState & state, Expr e); Path evalPath(EvalState & state, Expr e); +int evalInt(EvalState & state, Expr e); bool evalBool(EvalState & state, Expr e); ATermList evalList(EvalState & state, Expr e); ATerm coerceToString(Expr e); diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 190d587330d1..1739b6656d45 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -771,6 +771,14 @@ static Expr primRelativise(EvalState & state, const ATermVector & args) } +static Expr primAdd(EvalState & state, const ATermVector & args) +{ + int i1 = evalInt(state, args[0]); + int i2 = evalInt(state, args[1]); + return makeInt(i1 + i2); +} + + void EvalState::addPrimOps() { addPrimOp("builtins", 0, primBuiltins); @@ -801,6 +809,7 @@ void EvalState::addPrimOps() addPrimOp("__hasAttr", 2, primHasAttr); addPrimOp("removeAttrs", 2, primRemoveAttrs); addPrimOp("relativise", 2, primRelativise); + addPrimOp("__add", 2, primAdd); } |