@@ -249,6 +249,30 @@ function unsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, n) where T
249249 return dest
250250end
251251
252+
253+ function _unsafe_copyto! (dest, doffs, src, soffs, n)
254+ destp = pointer (dest, doffs)
255+ srcp = pointer (src, soffs)
256+ @inbounds if destp < srcp || destp > srcp + n
257+ for i = 1 : n
258+ if isassigned (src, soffs + i - 1 )
259+ dest[doffs + i - 1 ] = src[soffs + i - 1 ]
260+ else
261+ _unsetindex! (dest, doffs + i - 1 )
262+ end
263+ end
264+ else
265+ for i = n: - 1 : 1
266+ if isassigned (src, soffs + i - 1 )
267+ dest[doffs + i - 1 ] = src[soffs + i - 1 ]
268+ else
269+ _unsetindex! (dest, doffs + i - 1 )
270+ end
271+ end
272+ end
273+ return dest
274+ end
275+
252276"""
253277 unsafe_copyto!(dest::Array, do, src::Array, so, N)
254278
@@ -279,37 +303,23 @@ function unsafe_copyto!(dest::Array{T}, doffs, src::Array{T}, soffs, n) where T
279303 ccall (:jl_array_typetagdata , Ptr{UInt8}, (Any,), src) + soffs - 1 ,
280304 n)
281305 else
282- # handle base-case: everything else above was just optimizations
283- @inbounds if destp < srcp || destp > srcp + n
284- for i = 1 : n
285- if isassigned (src, soffs + i - 1 )
286- dest[doffs + i - 1 ] = src[soffs + i - 1 ]
287- else
288- _unsetindex! (dest, doffs + i - 1 )
289- end
290- end
291- else
292- for i = n: - 1 : 1
293- if isassigned (src, soffs + i - 1 )
294- dest[doffs + i - 1 ] = src[soffs + i - 1 ]
295- else
296- _unsetindex! (dest, doffs + i - 1 )
297- end
298- end
299- end
306+ _unsafe_copyto! (dest, doffs, src, soffs, n)
300307 end
301308 @_gc_preserve_end t2
302309 @_gc_preserve_end t1
303310 return dest
304311end
305312
313+ unsafe_copyto! (dest:: Array , doffs, src:: Array , soffs, n) =
314+ _unsafe_copyto! (dest, doffs, src, soffs, n)
315+
306316"""
307317 copyto!(dest, do, src, so, N)
308318
309319Copy `N` elements from collection `src` starting at offset `so`, to array `dest` starting at
310320offset `do`. Return `dest`.
311321"""
312- function copyto! (dest:: Array{T} , doffs:: Integer , src:: Array{T} , soffs:: Integer , n:: Integer ) where T
322+ function copyto! (dest:: Array , doffs:: Integer , src:: Array , soffs:: Integer , n:: Integer )
313323 n == 0 && return dest
314324 n > 0 || _throw_argerror ()
315325 if soffs < 1 || doffs < 1 || soffs+ n- 1 > length (src) || doffs+ n- 1 > length (dest)
@@ -327,7 +337,7 @@ function _throw_argerror()
327337 throw (ArgumentError (" Number of elements to copy must be nonnegative." ))
328338end
329339
330- copyto! (dest:: Array{T} , src:: Array{T} ) where {T} = copyto! (dest, 1 , src, 1 , length (src))
340+ copyto! (dest:: Array , src:: Array ) = copyto! (dest, 1 , src, 1 , length (src))
331341
332342# N.B: The generic definition in multidimensional.jl covers, this, this is just here
333343# for bootstrapping purposes.
0 commit comments