diff --git a/src/CxxWrap.jl b/src/CxxWrap.jl index 24fa658..df958cb 100644 --- a/src/CxxWrap.jl +++ b/src/CxxWrap.jl @@ -759,14 +759,25 @@ macro initcxx() return :(initialize_julia_module($__module__)) end +# This struct is mirrored in C++, with always a pointer in the first field struct SafeCFunction fptr::Ptr{Cvoid} return_type::Type argtypes::Array{Type,1} end +# Helper struct that can store a Base.CFunction +struct _SafeCFunction + fptr::Union{Ptr{Cvoid},Base.CFunction} + return_type::Type + argtypes::Array{Type,1} +end + +Base.convert(::Type{SafeCFunction}, f::_SafeCFunction) = SafeCFunction(Base.unsafe_convert(Ptr{Cvoid}, f.fptr), f.return_type, f.argtypes) +map_julia_arg_type(x::Type{SafeCFunction}) = _SafeCFunction + macro safe_cfunction(f, rt, args) - return esc(:($(@__MODULE__).SafeCFunction(@cfunction($f, $rt, $args), $rt, [$(args.args...)]))) + return esc(:($(@__MODULE__)._SafeCFunction(@cfunction($f, $rt, $args), $rt, [$(args.args...)]))) end isnull(x::CxxBaseRef) = (x.cpp_object == C_NULL) diff --git a/test/functions.jl b/test/functions.jl index ed2b791..3373cf3 100644 --- a/test/functions.jl +++ b/test/functions.jl @@ -112,6 +112,12 @@ c_func = @safe_cfunction(testf, Float64, (Float64,Float64)) CppTestFunctions.test_safe_cfunction(c_func) CppTestFunctions.test_safe_cfunction2(c_func) +function local_testf() + testf_private(x,y) = x + y + return @safe_cfunction($testf_private, Float64, (Float64,Float64)) +end +CppTestFunctions.test_safe_cfunction(local_testf()) + Base.show(io::IO, x::CppTestFunctions.BoxedNumber) = show(io, CppTestFunctions.getnumber(x)) let boxed_num_val = Ref{Int32}(0)