Skip to content

Commit 48cd97c

Browse files
authored
Merge pull request #65 from Tokazama/master
Fix stack overflow bug in known_length
2 parents d8ee3f6 + 3cd7dc5 commit 48cd97c

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ArrayInterface"
22
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
3-
version = "2.12.0"
3+
version = "2.12.1"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/ArrayInterface.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,19 @@ Otherwise, return `nothing`.
3535
known_length(x) = known_length(typeof(x))
3636
known_length(::Type{<:NTuple{N,<:Any}}) where {N} = N
3737
known_length(::Type{<:NamedTuple{L}}) where {L} = length(L)
38-
known_length(::Type{T}) where {T<:Base.Slice} = known_length(parent_type(T))
38+
known_length(::Type{<:Number}) = 1
39+
function known_length(::Type{T}) where {T}
40+
if parent_type(T) <: T
41+
return nothing
42+
else
43+
return known_length(parent_type(T))
44+
end
45+
end
46+
@inline function known_length(::Type{<:SubArray{T,N,P,I}}) where {T,N,P,I}
47+
return _known_length(ntuple(i -> known_length(I.parameters[i]), Val(N)))
48+
end
49+
_known_length(x::Tuple{Vararg{<:Union{Int,Nothing}}}) = nothing
50+
_known_length(x::Tuple{Vararg{Int}}) = prod(x)
3951

4052
"""
4153
can_change_size(::Type{T}) -> Bool

test/runtests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,11 @@ end
204204
@test ArrayInterface.known_length(1:2) == nothing
205205
@test ArrayInterface.known_length((1,)) == 1
206206
@test ArrayInterface.known_length((a=1,b=2)) == 2
207+
@test ArrayInterface.known_length([]) == nothing
208+
209+
x = view(SArray{Tuple{3,3,3}}(ones(3,3,3)), :, SOneTo(2), 2)
210+
@test @inferred(ArrayInterface.known_length(x)) == 6
211+
@test @inferred(ArrayInterface.known_length(x')) == 6
207212
end
208213

209214
@testset "indices" begin

0 commit comments

Comments
 (0)