Skip to content

Type stable and efficient wrapper of arbitrary Julia functions

License

Notifications You must be signed in to change notification settings

JuliaLang/FunctionWrappers.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FunctionWrappers.jl: Type stable and efficient wrapper of arbitrary functions

Build Status codecov

Proof of principle implementation of JuliaLang/julia#13984.

Limitations

  1. Does not handle more than 128 arguments without jlcall wrapper

    128 is an arbitrary limit. Should be high enough for all practical cases

  2. Does not support vararg argument types

  3. 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.

Compared to @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.

Simple Usage Example

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