primops: change to std::function, allowing the passing of user data
(cherry picked from commit 48aa57549d514432d6621c1e29f051951eca2d7f)
Change-Id: Ib7d5c6514031ceb6c42ac44588be6b0c1c3c225b
This commit is contained in:
parent
c6bb377c91
commit
194654c96f
|
@ -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.
|
||||||
|
|
|
@ -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()) {
|
||||||
|
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);
|
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;
|
||||||
|
|
Loading…
Reference in a new issue