Skip to content

Commit

Permalink
Avoid introducing local variable (and GC frame store) when the inline…
Browse files Browse the repository at this point in the history
…r is

confused about the return point.

(cherry picked from commit bb247cf)
ref #13461
  • Loading branch information
yuyichao authored and tkelman committed Oct 7, 2015
1 parent 8b63092 commit adb832a
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion base/array.jl
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,10 @@ end
setindex!{T}(A::Array{T}, x, i1::Real) = arrayset(A, convert(T,x)::T, to_index(i1))
setindex!{T}(A::Array{T}, x, i1::Real, i2::Real, I::Real...) = arrayset(A, convert(T,x)::T, to_index(i1), to_index(i2), to_indexes(I...)...)

unsafe_setindex!{T}(A::Array{T}, x, i1::Real, I::Real...) = @inbounds return arrayset(A, convert(T,x)::T, to_index(i1), to_indexes(I...)...)
# Type inference is confused by `@inbounds return ...` and introduces a
# !ispointerfree local variable and a GC frame
unsafe_setindex!{T}(A::Array{T}, x, i1::Real, I::Real...) =
(@inbounds arrayset(A, convert(T,x)::T, to_index(i1), to_indexes(I...)...); A)

# These are redundant with the abstract fallbacks but needed for bootstrap
function setindex!(A::Array, x, I::AbstractVector{Int})
Expand Down

0 comments on commit adb832a

Please sign in to comment.