diff --git a/base/array.jl b/base/array.jl index 61a3c39ca2bb7..df79d7aa96261 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1117,12 +1117,13 @@ function _growbeg!(a::Vector, delta::Integer) len = length(a) offset = memoryrefoffset(ref) newlen = len + delta - setfield!(a, :size, (newlen,)) # if offset is far enough advanced to fit data in existing memory without copying if delta <= offset - 1 setfield!(a, :ref, @inbounds memoryref(ref, 1 - delta)) + setfield!(a, :size, (newlen,)) else @noinline _growbeg_internal!(a, delta, len) + setfield!(a, :size, (newlen,)) end return end @@ -1172,11 +1173,11 @@ function _growend!(a::Vector, delta::Integer) len = length(a) newlen = len + delta offset = memoryrefoffset(ref) - setfield!(a, :size, (newlen,)) newmemlen = offset + newlen - 1 if memlen < newmemlen @noinline _growend_internal!(a, delta, len) end + setfield!(a, :size, (newlen,)) return end @@ -1194,7 +1195,6 @@ function _growat!(a::Vector, i::Integer, delta::Integer) memlen = length(mem) newlen = len + delta offset = memoryrefoffset(ref) - setfield!(a, :size, (newlen,)) newmemlen = offset + newlen - 1 # which side would we rather grow into? @@ -1204,11 +1204,13 @@ function _growat!(a::Vector, i::Integer, delta::Integer) newref = @inbounds memoryref(mem, offset - delta) unsafe_copyto!(newref, ref, i) setfield!(a, :ref, newref) + setfield!(a, :size, (newlen,)) for j in i:i+delta-1 @inbounds _unsetindex!(a, j) end elseif !prefer_start && memlen >= newmemlen unsafe_copyto!(mem, offset - 1 + delta + i, mem, offset - 1 + i, len - i + 1) + setfield!(a, :size, (newlen,)) for j in i:i+delta-1 @inbounds _unsetindex!(a, j) end @@ -1222,6 +1224,7 @@ function _growat!(a::Vector, i::Integer, delta::Integer) unsafe_copyto!(newref, ref, i-1) unsafe_copyto!(newmem, newoffset + delta + i - 1, mem, offset + i - 1, len - i + 1) setfield!(a, :ref, newref) + setfield!(a, :size, (newlen,)) end end @@ -1234,11 +1237,11 @@ function _deletebeg!(a::Vector, delta::Integer) @inbounds _unsetindex!(a, i) end newlen = len - delta + setfield!(a, :size, (newlen,)) if newlen != 0 # if newlen==0 we could accidentally index past the memory newref = @inbounds memoryref(a.ref, delta + 1) setfield!(a, :ref, newref) end - setfield!(a, :size, (newlen,)) return end function _deleteend!(a::Vector, delta::Integer)