@@ -39,15 +39,19 @@ macro threadcall(f, rettype, argtypes, argvals...)
39
39
args = Symbol[]
40
40
for (i, T) in enumerate (argtypes)
41
41
arg = Symbol (" arg" , i)
42
- push! (body, :($ arg = unsafe_load (convert (Ptr{$ T}, p))))
42
+ push! (body, :($ arg = unsafe_convert ( $ T, cconvert ( $ T, unsafe_load (convert (Ptr{$ T}, p)) ))))
43
43
push! (body, :(p += Core. sizeof ($ T)))
44
44
push! (args, arg)
45
45
end
46
- push! (body, :(gc_state = ccall (:jl_gc_safe_enter , Int8, (), )))
47
- push! (body, :(ret = ccall (fptr, $ rettype, ($ (argtypes... ),), $ (args... ))))
48
- push! (body, :(unsafe_store! (convert (Ptr{$ rettype}, retval_ptr), ret)))
49
- push! (body, :(gc_state = ccall (:jl_gc_safe_leave , Cvoid, (Int8,), gc_state)))
50
- push! (body, :(return Int (Core. sizeof ($ rettype))))
46
+ append! (body, (quote
47
+ GC. @preserve $ (args... ) begin
48
+ gc_state = ccall (:jl_gc_safe_enter , Int8, ())
49
+ ret = ccall (fptr, $ rettype, ($ (argtypes... ),), $ (args... ))
50
+ ccall (:jl_gc_safe_leave , Cvoid, (Int8,), gc_state)
51
+ unsafe_store! (convert (Ptr{$ rettype}, retval_ptr), ret)
52
+ return Int (Core. sizeof ($ rettype))
53
+ end
54
+ end ). args)
51
55
52
56
# return code to generate wrapper function and send work request thread queue
53
57
wrapper = Expr (:var"hygienic-scope" , wrapper, @__MODULE__ , __source__)
0 commit comments