@@ -74,8 +74,11 @@ function vmap_singlethread!(
7474 :: Val{NonTemporal} ,
7575 args:: Vararg{AbstractArray,A}
7676) where {F,T<: NativeTypes ,A,NonTemporal}
77- ptry, ptrargs, N = setup_vmap! (f, y, Val {NonTemporal} (), args... )
78- _vmap_singlethread! (f, ptry, Zero (), N, Val {NonTemporal} (), ptrargs)
77+ presy = preserve_buffer (y)
78+ GC. @preserve presy begin
79+ ptry, ptrargs, N = setup_vmap! (f, y, Val {NonTemporal} (), args... )
80+ _vmap_singlethread! (f, ptry, Zero (), N, Val {NonTemporal} (), ptrargs)
81+ end
7982 nothing
8083end
8184function _vmap_singlethread! (
@@ -263,20 +266,25 @@ function vmap_multithread!(
263266 end
264267 nothing
265268end
266- function gc_preserve_vmap_quote (NonTemporal:: Bool , Threaded:: Bool , A:: Int )
267- m = Threaded ? :vmap_multithread! : :vmap_singlethread!
268- call = Expr (:call , m, :f , :y , Expr (:call , Expr (:curly , :Val , NonTemporal)))
269+ function gc_preserve_call_quote (call, A:: Int )
269270 q = Expr (:block , Expr (:meta , :inline ))
270271 gcpres = Expr (:gc_preserve , call)
271- for a ∈ 1 : Int (A) :: Int
272+ for a ∈ 1 : A
272273 arg = Symbol (:arg_ , a)
273274 parg = Symbol (:parg_ , a)
274- push! (q. args, Expr (:(= ), arg, :(@inbounds args[ $ a]))) # Expr(:ref, : args, a )))
275+ push! (q. args, Expr (:(= ), arg, :($ getfield ( args, $ a) )))
275276 push! (q. args, Expr (:(= ), parg, Expr (:call , :preserve_buffer , arg)))
276277 push! (call. args, arg)
277278 push! (gcpres. args, parg)
278279 end
279- push! (q. args, gcpres, :y )
280+ push! (q. args, gcpres)
281+ q
282+ end
283+ function gc_preserve_vmap_quote (NonTemporal:: Bool , Threaded:: Bool , A:: Int )
284+ m = Threaded ? :vmap_multithread! : :vmap_singlethread!
285+ call = Expr (:call , m, :f , :y , Expr (:call , Expr (:curly , :Val , NonTemporal)))
286+ q = gc_preserve_call_quote (call, A)
287+ push! (q. args, :y )
280288 q
281289end
282290@generated function gc_preserve_vmap! (
0 commit comments