3636# # copy ##
3737
3838function  unsafe_copy! {T} (dest:: Ptr{T} , src:: Ptr{T} , n)
39+     #  Do not use this to copy data between pointer arrays.
40+     #  It can't be made safe no matter how carefully you checked.
3941    ccall (:memmove , Ptr{Void}, (Ptr{Void}, Ptr{Void}, UInt),
4042          dest, src, n* sizeof (T))
4143    return  dest
@@ -45,9 +47,8 @@ function unsafe_copy!{T}(dest::Array{T}, doffs, src::Array{T}, soffs, n)
4547    if  isbits (T)
4648        unsafe_copy! (pointer (dest, doffs), pointer (src, soffs), n)
4749    else 
48-         for  i= 0 : n- 1 
49-             @inbounds  arrayset (dest, src[i+ soffs], i+ doffs)
50-         end 
50+         ccall (:jl_array_ptr_copy , Void, (Any, Ptr{Void}, Any, Ptr{Void}, Int),
51+               dest, pointer (dest, doffs), src, pointer (src, soffs), n)
5152    end 
5253    return  dest
5354end 
6364
6465copy! {T} (dest:: Array{T} , src:: Array{T} ) =  copy! (dest, 1 , src, 1 , length (src))
6566
66- function  copy (a:: Array )
67-     b =  similar (a)
68-     ccall (:memcpy , Ptr{Void}, (Ptr{Void}, Ptr{Void}, UInt), b, a, sizeof (a))
69-     return  b
70- end 
67+ copy {T<:Array} (a:: T ) =  ccall (:jl_array_copy , Ref{T}, (Any,), a)
7168
7269function  reinterpret {T,S} (:: Type{T} , a:: Array{S,1} )
7370    nel =  Int (div (length (a)* sizeof (S),sizeof (T)))
@@ -389,66 +386,13 @@ setindex!{T, N}(A::Array{T, N}, x::Number, ::Vararg{Colon, N}) = fill!(A, x)
389386
390387#  efficiently grow an array
391388
392- function  _growat! (a:: Vector , i:: Integer , delta:: Integer )
393-     n =  length (a)
394-     if  i <  div (n,2 )
395-         _growat_beg! (a, i, delta)
396-     else 
397-         _growat_end! (a, i, delta)
398-     end 
399-     return  a
400- end 
401- 
402- function  _growat_beg! (a:: Vector , i:: Integer , delta:: Integer )
403-     ccall (:jl_array_grow_beg , Void, (Any, UInt), a, delta)
404-     if  i >  1 
405-         ccall (:memmove , Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
406-               pointer (a, 1 ), pointer (a, 1 + delta), (i- 1 )* elsize (a))
407-     end 
408-     return  a
409- end 
410- 
411- function  _growat_end! (a:: Vector , i:: Integer , delta:: Integer )
412-     ccall (:jl_array_grow_end , Void, (Any, UInt), a, delta)
413-     n =  length (a)
414-     if  n >=  i+ delta
415-         ccall (:memmove , Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
416-               pointer (a, i+ delta), pointer (a, i), (n- i- delta+ 1 )* elsize (a))
417-     end 
418-     return  a
419- end 
389+ _growat! (a:: Vector , i:: Integer , delta:: Integer ) = 
390+     ccall (:jl_array_grow_at , Void, (Any, Int, UInt), a, i -  1 , delta)
420391
421392#  efficiently delete part of an array
422393
423- function  _deleteat! (a:: Vector , i:: Integer , delta:: Integer )
424-     n =  length (a)
425-     last =  i+ delta- 1 
426-     if  i- 1  <  n- last
427-         _deleteat_beg! (a, i, delta)
428-     else 
429-         _deleteat_end! (a, i, delta)
430-     end 
431-     return  a
432- end 
433- 
434- function  _deleteat_beg! (a:: Vector , i:: Integer , delta:: Integer )
435-     if  i >  1 
436-         ccall (:memmove , Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
437-               pointer (a, 1 + delta), pointer (a, 1 ), (i- 1 )* elsize (a))
438-     end 
439-     ccall (:jl_array_del_beg , Void, (Any, UInt), a, delta)
440-     return  a
441- end 
442- 
443- function  _deleteat_end! (a:: Vector , i:: Integer , delta:: Integer )
444-     n =  length (a)
445-     if  n >=  i+ delta
446-         ccall (:memmove , Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
447-               pointer (a, i), pointer (a, i+ delta), (n- i- delta+ 1 )* elsize (a))
448-     end 
449-     ccall (:jl_array_del_end , Void, (Any, UInt), a, delta)
450-     return  a
451- end 
394+ _deleteat! (a:: Vector , i:: Integer , delta:: Integer ) = 
395+     ccall (:jl_array_del_at , Void, (Any, Int, UInt), a, i -  1 , delta)
452396
453397# # Dequeue functionality ##
454398
@@ -528,34 +472,20 @@ function shift!(a::Vector)
528472end 
529473
530474function  insert! {T} (a:: Array{T,1} , i:: Integer , item)
531-     if  ! (1  <=  i <=  length (a)+ 1 )
532-         throw (BoundsError ())
533-     end 
534-     if  i ==  length (a)+ 1 
535-         return  push! (a, item)
536-     end 
537-     item =  convert (T, item)
475+     #  Throw convert error before changing the shape of the array
476+     _item =  convert (T, item)
538477    _growat! (a, i, 1 )
539-     a[i] =  item
478+     #  _growat! already did bound check
479+     @inbounds  a[i] =  _item
540480    return  a
541481end 
542482
543- function  deleteat! (a:: Vector , i:: Integer )
544-     if  ! (1  <=  i <=  length (a))
545-         throw (BoundsError ())
546-     end 
547-     return  _deleteat! (a, i, 1 )
548- end 
483+ deleteat! (a:: Vector , i:: Integer ) =  (_deleteat! (a, i, 1 ); a)
549484
550485function  deleteat! {T<:Integer} (a:: Vector , r:: UnitRange{T} )
551486    n =  length (a)
552-     isempty (r) &&  return  a
553-     f =  first (r)
554-     l =  last (r)
555-     if  ! (1  <=  f &&  l <=  n)
556-         throw (BoundsError ())
557-     end 
558-     return  _deleteat! (a, f, length (r))
487+     isempty (r) ||  _deleteat! (a, first (r), length (r))
488+     return  a
559489end 
560490
561491function  deleteat! (a:: Vector , inds)
@@ -622,18 +552,9 @@ function splice!{T<:Integer}(a::Vector, r::UnitRange{T}, ins=_default_splice)
622552
623553    if  m <  d
624554        delta =  d -  m
625-         if  f- 1  <  n- l
626-             _deleteat_beg! (a, f, delta)
627-         else 
628-             _deleteat_end! (a, l- delta+ 1 , delta)
629-         end 
555+         _deleteat! (a, (f -  1  <  n -  l) ?  f :  (l -  delta +  1 ), delta)
630556    elseif  m >  d
631-         delta =  m -  d
632-         if  f- 1  <  n- l
633-             _growat_beg! (a, f, delta)
634-         else 
635-             _growat_end! (a, l+ 1 , delta)
636-         end 
557+         _growat! (a, (f -  1  <  n -  l) ?  f :  (l +  1 ), m -  d)
637558    end 
638559
639560    k =  1 
@@ -693,17 +614,22 @@ function vcat{T}(arrays::Vector{T}...)
693614    end 
694615    arr =  Array {T} (n)
695616    ptr =  pointer (arr)
696-     offset =  0 
697617    if  isbits (T)
698-         elsz =  sizeof (T)
618+         elsz =  Core . sizeof (T)
699619    else 
700620        elsz =  Core. sizeof (Ptr{Void})
701621    end 
702622    for  a in  arrays
703-         nba =  length (a)* elsz
704-         ccall (:memcpy , Ptr{Void}, (Ptr{Void}, Ptr{Void}, UInt),
705-               ptr+ offset, a, nba)
706-         offset +=  nba
623+         na =  length (a)
624+         nba =  na *  elsz
625+         if  isbits (T)
626+             ccall (:memcpy , Ptr{Void}, (Ptr{Void}, Ptr{Void}, UInt),
627+                   ptr, a, nba)
628+         else 
629+             ccall (:jl_array_ptr_copy , Void, (Any, Ptr{Void}, Any, Ptr{Void}, Int),
630+                   arr, ptr, a, pointer (a), na)
631+         end 
632+         ptr +=  nba
707633    end 
708634    return  arr
709635end 
0 commit comments