From 35d75649d7d95a6f51623ff840db5bb9343de1c9 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Mon, 4 Jul 2016 06:19:17 -0500 Subject: [PATCH] Prevent mapslices from mutating the original array --- base/abstractarray.jl | 6 ++++-- test/arrayops.jl | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/base/abstractarray.jl b/base/abstractarray.jl index 52f55c6b30493f..fec3620e2a2bbf 100644 --- a/base/abstractarray.jl +++ b/base/abstractarray.jl @@ -1417,7 +1417,8 @@ function mapslices(f, A::AbstractArray, dims::AbstractVector) idx[d] = Colon() end - r1 = f(view(A, idx...)) + Aslice = A[idx...] + r1 = f(Aslice) # determine result size and allocate Rsize = copy(dimsA) @@ -1449,7 +1450,8 @@ function mapslices(f, A::AbstractArray, dims::AbstractVector) for i in 1:nidx idx[otherdims[i]] = ridx[otherdims[i]] = I.I[i] end - R[ridx...] = f(view(A, idx...)) + _unsafe_getindex!(Aslice, A, idx...) + R[ridx...] = f(Aslice) end end diff --git a/test/arrayops.jl b/test/arrayops.jl index 66bb95f0965636..16a96faae68018 100644 --- a/test/arrayops.jl +++ b/test/arrayops.jl @@ -843,6 +843,12 @@ let n3a = mapslices(x-> ones(1,6), c, [2,3]) @test size(n1a) == (1,6,4) && size(n2a) == (1,3,6) && size(n3a) == (2,1,6) @test size(n1) == (6,1,4) && size(n2) == (6,3,1) && size(n3) == (2,6,1) + + # mutating functions + o = ones(3, 4) + m = mapslices(x->fill!(x, 0), o, 2) + @test m == zeros(3, 4) + @test o == ones(3, 4) end