aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorYorick van Pelt <yorick@yorickvanpelt.nl>2023-08-28 18:20:23 +0200
committerPuck Meerburg <puck@puckipedia.com>2024-05-16 13:01:40 +0000
commit194654c96f61acc6dc47dd3126ad47618d45a0c8 (patch)
tree29a479d197f81ac80c4a260969e2ad39e0e9de95 /src/libexpr
parentc6bb377c91f40ae571d0a0fc951b736cb8fc2ead (diff)
primops: change to std::function, allowing the passing of user data
(cherry picked from commit 48aa57549d514432d6621c1e29f051951eca2d7f) Change-Id: Ib7d5c6514031ceb6c42ac44588be6b0c1c3c225b
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.hh3
-rw-r--r--src/libexpr/primops.cc7
2 files changed, 7 insertions, 3 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 2291d618c..411364d9f 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -17,6 +17,7 @@
#include <optional>
#include <unordered_map>
#include <mutex>
+#include <functional>
namespace nix {
@@ -71,7 +72,7 @@ struct PrimOp
/**
* Implementation of the primop.
*/
- PrimOpFun fun;
+ std::function<std::remove_pointer<PrimOpFun>::type> fun;
/**
* Optional experimental for this to be gated on.
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 33a2688f1..51a257e87 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -3329,8 +3329,11 @@ static void prim_sort(EvalState & state, const PosIdx pos, Value * * args, Value
callFunction. */
/* TODO: (layus) this is absurd. An optimisation like this
should be outside the lambda creation */
- if (args[0]->isPrimOp() && args[0]->primOp->fun == prim_lessThan)
- return CompareValues(state, noPos, "while evaluating the ordering function passed to builtins.sort")(a, b);
+ if (args[0]->isPrimOp()) {
+ auto ptr = args[0]->primOp->fun.target<decltype(&prim_lessThan)>();
+ if (ptr && *ptr == prim_lessThan)
+ return CompareValues(state, noPos, "while evaluating the ordering function passed to builtins.sort")(a, b);
+ }
Value * vs[] = {a, b};
Value vBool;