primops: change to std::function, allowing the passing of user data

(cherry picked from commit 48aa57549d514432d6621c1e29f051951eca2d7f)
Change-Id: Ib7d5c6514031ceb6c42ac44588be6b0c1c3c225b
This commit is contained in:
Yorick van Pelt 2023-08-28 18:20:23 +02:00 committed by Puck Meerburg
parent c6bb377c91
commit 194654c96f
2 changed files with 7 additions and 3 deletions

View file

@ -17,6 +17,7 @@
#include <optional> #include <optional>
#include <unordered_map> #include <unordered_map>
#include <mutex> #include <mutex>
#include <functional>
namespace nix { namespace nix {
@ -71,7 +72,7 @@ struct PrimOp
/** /**
* Implementation of the primop. * Implementation of the primop.
*/ */
PrimOpFun fun; std::function<std::remove_pointer<PrimOpFun>::type> fun;
/** /**
* Optional experimental for this to be gated on. * Optional experimental for this to be gated on.

View file

@ -3329,8 +3329,11 @@ static void prim_sort(EvalState & state, const PosIdx pos, Value * * args, Value
callFunction. */ callFunction. */
/* TODO: (layus) this is absurd. An optimisation like this /* TODO: (layus) this is absurd. An optimisation like this
should be outside the lambda creation */ should be outside the lambda creation */
if (args[0]->isPrimOp() && args[0]->primOp->fun == prim_lessThan) if (args[0]->isPrimOp()) {
return CompareValues(state, noPos, "while evaluating the ordering function passed to builtins.sort")(a, b); 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 * vs[] = {a, b};
Value vBool; Value vBool;