Proof of principle implementation of JuliaLang/julia#13984.
Does not handle more than 128 arguments without jlcall wrapper
128 is an arbitrary limit. Should be high enough for all practical cases
Does not support vararg argument types
Wrapper Object cannot be serialized by dump.c
and therefore the
precompilation of FunctionWrappers
is done using a runtime branch
and by making the wrapper type mutable.
@cfunction
This does not require LLVM trampoline support, which is not currently supported by LLVM
on all the architectures julia runs on (JuliaLang/julia#27174).
Other than this issue @cfunction
should cover all of the use cases.
using FunctionWrappers
import FunctionWrappers: FunctionWrapper
# For a function that sends (x1::T1, x2::T2, ...) -> ::TN, you use
# a FunctionWrapper{TN, Tuple{T1, T2, ...}}.
struct TypeStableStruct
fun::FunctionWrapper{Float64, Tuple{Float64, Float64}}
second_arg::Float64
end
evaluate_strfun(str, arg) = str.fun(arg, str.second_arg)
example = TypeStableStruct(hypot, 1.0)
@code_warntype evaluate_strfun(example, 1.5) # all good