Skip to content

Commit 35d7564

Browse files
committed
Prevent mapslices from mutating the original array
1 parent 3e1878b commit 35d7564

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

base/abstractarray.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,7 +1417,8 @@ function mapslices(f, A::AbstractArray, dims::AbstractVector)
14171417
idx[d] = Colon()
14181418
end
14191419

1420-
r1 = f(view(A, idx...))
1420+
Aslice = A[idx...]
1421+
r1 = f(Aslice)
14211422

14221423
# determine result size and allocate
14231424
Rsize = copy(dimsA)
@@ -1449,7 +1450,8 @@ function mapslices(f, A::AbstractArray, dims::AbstractVector)
14491450
for i in 1:nidx
14501451
idx[otherdims[i]] = ridx[otherdims[i]] = I.I[i]
14511452
end
1452-
R[ridx...] = f(view(A, idx...))
1453+
_unsafe_getindex!(Aslice, A, idx...)
1454+
R[ridx...] = f(Aslice)
14531455
end
14541456
end
14551457

test/arrayops.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,12 @@ let
843843
n3a = mapslices(x-> ones(1,6), c, [2,3])
844844
@test size(n1a) == (1,6,4) && size(n2a) == (1,3,6) && size(n3a) == (2,1,6)
845845
@test size(n1) == (6,1,4) && size(n2) == (6,3,1) && size(n3) == (2,6,1)
846+
847+
# mutating functions
848+
o = ones(3, 4)
849+
m = mapslices(x->fill!(x, 0), o, 2)
850+
@test m == zeros(3, 4)
851+
@test o == ones(3, 4)
846852
end
847853

848854

0 commit comments

Comments
 (0)