From 8a8752163611400e2386f1f1a449d9d3fb8f1496 Mon Sep 17 00:00:00 2001 From: Mathnerd314 Date: Sun, 6 Sep 2015 17:03:23 -0600 Subject: [PATCH] forceFunction: allow functors as well --- src/libexpr/eval-inline.hh | 10 ++++++++++ src/libexpr/eval.cc | 2 +- src/libexpr/eval.hh | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh index c8d83814f..b470fa315 100644 --- a/src/libexpr/eval-inline.hh +++ b/src/libexpr/eval-inline.hh @@ -78,5 +78,15 @@ inline void EvalState::forceList(Value & v, const Pos & pos) throwTypeError("value is %1% while a list was expected, at %2%", v, pos); } +inline bool EvalState::isFunctor(Value& fun) +{ + if (fun.type == tAttrs) { + auto found = fun.attrs->find(sFunctor); + if (found != fun.attrs->end()) { + return true; + } + } + return false; +} } diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 74f88e498..93c3111af 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1294,7 +1294,7 @@ bool EvalState::forceBool(Value & v) void EvalState::forceFunction(Value & v, const Pos & pos) { forceValue(v); - if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp) + if (v.type != tLambda && v.type != tPrimOp && v.type != tPrimOpApp && !isFunctor(v)) throwTypeError("value is %1% while a function was expected, at %2%", v, pos); } diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 8df0084fd..eb55f6d4d 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -213,6 +213,8 @@ public: elements and attributes are compared recursively. */ bool eqValues(Value & v1, Value & v2); + bool isFunctor(Value & fun); + void callFunction(Value & fun, Value & arg, Value & v, const Pos & pos); void callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos);