From 3e2dc41d6842d3260ca9294ad4391ae464130e21 Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Thu, 6 Jun 2024 17:17:41 +0000 Subject: [PATCH 1/4] fix prepend StackOverflow issue Attempt to fix #54711 Test introduced by #36227 --- base/array.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/base/array.jl b/base/array.jl index 0e0f22ae384c6..43cea879bdbd7 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1316,8 +1316,7 @@ end append!(a::AbstractVector, iter) = _append!(a, IteratorSize(iter), iter) push!(a::AbstractVector, iter...) = append!(a, iter) - -append!(a::AbstractVector, iter...) = foldl(append!, iter, init=a) +append!(a::AbstractVector, iter...) = for v in iter; append!(a, v); end function _append!(a::AbstractVector, ::Union{HasLength,HasShape}, iter) n = Int(length(iter))::Int @@ -1376,10 +1375,9 @@ function prepend!(a::Vector{T}, items::Union{AbstractVector{<:T},Tuple}) where T return a end -prepend!(a::Vector, iter) = _prepend!(a, IteratorSize(iter), iter) -pushfirst!(a::Vector, iter...) = prepend!(a, iter) - -prepend!(a::AbstractVector, iter...) = foldr((v, a) -> prepend!(a, v), iter, init=a) +prepend!(a::AbstractVector, iter) = _prepend!(a, IteratorSize(iter), iter) +pushfirst!(a::AbstractVector, iter...) = prepend!(a, iter) +prepend!(a::AbstractVector, iter...) = for v in iter; prepend!(a, v); end function _prepend!(a::Vector, ::Union{HasLength,HasShape}, iter) @_terminates_locally_meta From 712ba249d9e9a06e887907ef2cb812af0a921261 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> Date: Fri, 7 Jun 2024 17:00:39 +0900 Subject: [PATCH 2/4] Apply suggestions from code review --- base/array.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/array.jl b/base/array.jl index 43cea879bdbd7..5ecb7b8f6718f 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1316,7 +1316,7 @@ end append!(a::AbstractVector, iter) = _append!(a, IteratorSize(iter), iter) push!(a::AbstractVector, iter...) = append!(a, iter) -append!(a::AbstractVector, iter...) = for v in iter; append!(a, v); end +append!(a::AbstractVector, iter...) = (for v in iter; append!(a, v); end; return a) function _append!(a::AbstractVector, ::Union{HasLength,HasShape}, iter) n = Int(length(iter))::Int @@ -1377,7 +1377,7 @@ end prepend!(a::AbstractVector, iter) = _prepend!(a, IteratorSize(iter), iter) pushfirst!(a::AbstractVector, iter...) = prepend!(a, iter) -prepend!(a::AbstractVector, iter...) = for v in iter; prepend!(a, v); end +prepend!(a::AbstractVector, iter...) = (for v in iter; prepend!(a, v); end; return a) function _prepend!(a::Vector, ::Union{HasLength,HasShape}, iter) @_terminates_locally_meta From 7cad570699513eeece48a142c6ed4ee6d5bdfe53 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> Date: Fri, 7 Jun 2024 23:14:36 +0900 Subject: [PATCH 3/4] Update base/array.jl --- base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/array.jl b/base/array.jl index 5ecb7b8f6718f..49f6408d3f124 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1377,7 +1377,7 @@ end prepend!(a::AbstractVector, iter) = _prepend!(a, IteratorSize(iter), iter) pushfirst!(a::AbstractVector, iter...) = prepend!(a, iter) -prepend!(a::AbstractVector, iter...) = (for v in iter; prepend!(a, v); end; return a) +prepend!(a::AbstractVector, iter...) = (for i = length(iter):-1:1; prepend!(a, iter[i]); end; return a) function _prepend!(a::Vector, ::Union{HasLength,HasShape}, iter) @_terminates_locally_meta From 58c81d36547a26f21694320bc5a7189db76f3456 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> Date: Fri, 7 Jun 2024 23:20:29 +0900 Subject: [PATCH 4/4] Update base/array.jl Co-authored-by: Jameson Nash --- base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/array.jl b/base/array.jl index 49f6408d3f124..32c543ff12638 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1377,7 +1377,7 @@ end prepend!(a::AbstractVector, iter) = _prepend!(a, IteratorSize(iter), iter) pushfirst!(a::AbstractVector, iter...) = prepend!(a, iter) -prepend!(a::AbstractVector, iter...) = (for i = length(iter):-1:1; prepend!(a, iter[i]); end; return a) +prepend!(a::AbstractVector, iter...) = (for v = reverse(iter); prepend!(a, v); end; return a) function _prepend!(a::Vector, ::Union{HasLength,HasShape}, iter) @_terminates_locally_meta