Cfunction pointer back to Function?

julia> foo() = Cint(1)
foo (generic function with 1 method)

julia> ptr = cfunction(foo, Cint, Tuple{})
Ptr{Nothing} @0x00007f5dacc48510

Is it possible to derive foo from ptr?

julia> foo() = Cint(1);

julia> ptr = cfunction(foo, Cint, Tuple{});

julia> _foo = unsafe_wrap(Array, reinterpret(Ptr{typeof(foo)}, ptr), (), false)[];

julia> _foo === foo
true

julia> foo()
1

julia> _foo()
1

unsafe_wrap(Array, reinterpret(Ptr{typeof(foo)}, ptr), (), false)[] uses foo, and I’m curious if it can be done without it. Sorry if I was unclear.

How about directly call it by ccall, but in this way, foo’s signature info is still needed :

julia> foo() = Cint(1)
foo (generic function with 1 method)

julia> ptr = cfunction(foo, Cint, Tuple{})
Ptr{Void} @0x0000000111712e30

julia> _foo() = ccall(ptr, Cint, ())
_foo (generic function with 1 method)

The use case I had in mind was for a C library’s callback setter. E.g. void* SetCallback(void* funcPtr) sets a new callback function, and returns the previous callback function. I was curious if that returned function pointer could be changed back into a Julia Function without knowing anything more about it.

No you can’t do that. Only with debug info maybe but that shouldn’t be used in normal code.

This is only a complicated way to spell typeof(foo).instance. The ptr is not used AT ALL.

2 Likes

Each time you call SetCallback from Julia, you could store the Function object in a dictionary keyed by the cfunction, e.g. mydict[mycfunction] = myfunction. Then the next time you call SetCallback you could look up the Function in your dictionary if you want.

1 Like