Skip to content

Commit f2951a7

Browse files
committed
Avoid iterating twice over generators when there is an exception
... at least in Julia >= 1.11 which fixed it via JuliaLang/julia#53151
1 parent b3b1df9 commit f2951a7

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

src/ordered_dict.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,20 @@ OrderedDict(kv::AbstractDict{K,V}) where {K,V} = OrderedDict{K,V}(kv)
6767
OrderedDict(ps::Pair{K,V}...) where {K,V} = OrderedDict{K,V}(ps)
6868
OrderedDict(ps::Pair...) = OrderedDict(ps)
6969

70-
function OrderedDict(kv)
71-
try
72-
dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
73-
catch e
74-
if isempty(methods(iterate, (typeof(kv),))) ||
75-
!all(x->isa(x, Union{Tuple,Pair}), kv)
76-
throw(ArgumentError("OrderedDict(kv): kv needs to be an iterator of tuples or pairs"))
77-
else
78-
rethrow(e)
70+
@static if VERSION >= v1.11
71+
# see JuliaLang/julia#53151
72+
OrderedDict(kv) = dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
73+
else
74+
function OrderedDict(kv)
75+
try
76+
dict_with_eltype((K, V) -> OrderedDict{K, V}, kv, eltype(kv))
77+
catch e
78+
if isempty(methods(iterate, (typeof(kv),))) ||
79+
!all(x->isa(x, Union{Tuple,Pair}), kv)
80+
throw(ArgumentError("OrderedDict(kv): kv needs to be an iterator of tuples or pairs"))
81+
else
82+
rethrow(e)
83+
end
7984
end
8085
end
8186
end

test/test_ordered_dict.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,13 @@ using OrderedCollections, Test
507507
@test del_slots4 == 0
508508
end
509509

510+
@testset "Issue #86" begin
511+
counter = 0
512+
expensive_function(k) = (counter += 1; k > 2 && error("too large!"))
513+
@test_throws ErrorException OrderedDict(k => expensive_function(k) for k in 1:3)
514+
@test counter == 3
515+
end
516+
510517
@testset "ordered access" begin
511518
od = OrderedDict(:a=>1, :b=>2, :c=>3)
512519
@test popfirst!(od) == (:a => 1)

0 commit comments

Comments
 (0)