Skip to content

Commit 78898f7

Browse files
committed
use memmove in Array grow and delete
this allows them to work on undefined references allow pointer(a, i) to work on all arrays
1 parent 5296045 commit 78898f7

File tree

6 files changed

+21
-18
lines changed

6 files changed

+21
-18
lines changed

base/abstractarray.jl

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ eltype{T,n}(::AbstractArray{T,n}) = T
1212
eltype{T,n}(::Type{AbstractArray{T,n}}) = T
1313
eltype{T<:AbstractArray}(::Type{T}) = eltype(super(T))
1414
iseltype(x,T) = eltype(x) <: T
15+
elsize{T}(::AbstractArray{T}) = sizeof(T)
1516
isinteger(x::AbstractArray) = all(isinteger,x)
1617
isinteger{T<:Integer,n}(x::AbstractArray{T,n}) = true
1718
isreal(x::AbstractArray) = all(isreal,x)

base/array.jl

+14-11
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ size(a::Array) = arraysize(a)
1919
size(a::Array, d) = arraysize(a, d)
2020
size(a::Matrix) = (arraysize(a,1), arraysize(a,2))
2121
length(a::Array) = arraylen(a)
22-
function sizeof{T}(a::Array{T})
23-
(isbits(T) ? sizeof(eltype(a)) : sizeof(Ptr)) * length(a)
24-
end
22+
elsize{T}(a::Array{T}) = isbits(T) ? sizeof(T) : sizeof(Ptr)
23+
sizeof(a::Array) = elsize(a) * length(a)
2524

2625
strides{T}(a::Array{T,1}) = (1,)
2726
strides{T}(a::Array{T,2}) = (1, size(a,1))
@@ -396,17 +395,19 @@ end
396395

397396
function _growat_beg!(a::Vector, i::Integer, delta::Integer)
398397
ccall(:jl_array_grow_beg, Void, (Any, Uint), a, delta)
399-
@inbounds for k = 1:i-1
400-
a[k] = a[k+delta]
398+
if i > 1
399+
ccall(:memmove, Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
400+
pointer(a, 1), pointer(a, 1+delta), (i-1)*elsize(a))
401401
end
402402
return a
403403
end
404404

405405
function _growat_end!(a::Vector, i::Integer, delta::Integer)
406406
ccall(:jl_array_grow_end, Void, (Any, Uint), a, delta)
407407
n = length(a)
408-
@inbounds for k = n:-1:(i+delta)
409-
a[k] = a[k-delta]
408+
if n >= i+delta
409+
ccall(:memmove, Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
410+
pointer(a, i+delta), pointer(a, i), (n-i-delta+1)*elsize(a))
410411
end
411412
return a
412413
end
@@ -425,17 +426,19 @@ function _deleteat!(a::Vector, i::Integer, delta::Integer)
425426
end
426427

427428
function _deleteat_beg!(a::Vector, i::Integer, delta::Integer)
428-
@inbounds for k = i+delta-1:-1:1+delta
429-
a[k] = a[k-delta]
429+
if i > 1
430+
ccall(:memmove, Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
431+
pointer(a, 1+delta), pointer(a, 1), (i-1)*elsize(a))
430432
end
431433
ccall(:jl_array_del_beg, Void, (Any, Uint), a, delta)
432434
return a
433435
end
434436

435437
function _deleteat_end!(a::Vector, i::Integer, delta::Integer)
436438
n = length(a)
437-
@inbounds for k = i:n-delta
438-
a[k] = a[k+delta]
439+
if n >= i+delta
440+
ccall(:memmove, Ptr{Void}, (Ptr{Void}, Ptr{Void}, Csize_t),
441+
pointer(a, i), pointer(a, i+delta), (n-i-delta+1)*elsize(a))
439442
end
440443
ccall(:jl_array_del_end, Void, (Any, Uint), a, delta)
441444
return a

base/darray.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,10 @@ function getindex(r::RemoteRef, args...)
231231
end
232232
end
233233

234-
getindex(d::DArray, i::Int) = getindex(d, ind2sub(size(d), i))
235-
getindex(d::DArray, i::Int...) = getindex(d, sub2ind(size(d), i...))
234+
getindex(d::DArray, i::Int) = getindex_tuple(d, ind2sub(size(d), i))
235+
getindex(d::DArray, i::Int...) = getindex_tuple(d, i)
236236

237-
function getindex{T}(d::DArray{T}, I::(Int...))
237+
function getindex_tuple{T}(d::DArray{T}, I::(Int...))
238238
chidx = locate(d, I...)
239239
chunk = d.chunks[chidx...]
240240
idxs = d.indexes[chidx...]

base/iobuffer.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ end
1616

1717
function copy(b::IOBuffer)
1818
ret = IOBuffer(b.writable?copy(b.data):b.data,
19-
b.readable,b.writable,b.seekable,b.append,b.maxsize)
19+
b.readable,b.writable,b.seekable,b.append,b.maxsize)
2020
ret.size = b.size
2121
ret.ptr = b.ptr
2222
ret

base/pointer.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pointer{T}(::Type{T}, x::Ptr) = convert(Ptr{T}, x)
2828
# pointer. they just map the array element type to the pointer type for
2929
# convenience in cases that work.
3030
pointer{T}(x::AbstractArray{T}) = convert(Ptr{T},x)
31-
pointer{T}(x::AbstractArray{T}, i::Integer) = convert(Ptr{T},x)+(i-1)*sizeof(T)
31+
pointer{T}(x::AbstractArray{T}, i::Integer) = convert(Ptr{T},x) + (i-1)*elsize(x)
3232

3333
# unsafe pointer to array conversions
3434
pointer_to_array(p, d::Integer, own=false) = pointer_to_array(p, (d,), own)

base/sparse/sparsematrix.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -712,8 +712,7 @@ prod{T}(A::SparseMatrixCSC{T}, region) = reducedim(*,A,region,one(T))
712712
#sum(A::SparseMatrixCSC{Bool}) = countnz(A)
713713

714714
## getindex
715-
getindex(A::SparseMatrixCSC, i::Integer) = getindex(A, ind2sub(size(A),i))
716-
getindex(A::SparseMatrixCSC, I::(Integer,Integer)) = getindex(A, I[1], I[2])
715+
getindex(A::SparseMatrixCSC, i::Integer) = getindex(A, ind2sub(size(A),i)...)
717716

718717
function getindex{T}(A::SparseMatrixCSC{T}, i0::Integer, i1::Integer)
719718
if !(1 <= i0 <= A.m && 1 <= i1 <= A.n); throw(BoundsError()); end

0 commit comments

Comments
 (0)