@@ -865,47 +865,50 @@ class zip_longest():
865
865
"""
866
866
867
867
@__graalpython__ .builtin_method
868
- def __iter__ (self ):
868
+ def __new__ (subtype , * args , fillvalue = None ):
869
+ self = object .__new__ (subtype )
870
+ self .fillvalue = fillvalue
871
+ self .tuplesize = len (args )
872
+ self .numactive = len (args )
873
+ self .ittuple = [iter (arg ) for arg in args ]
869
874
return self
870
875
871
876
@__graalpython__ .builtin_method
872
- def _fetch (self , index ):
873
- it = self .iterators [index ]
874
- if it is not None :
875
- try :
876
- return next (it )
877
- except StopIteration :
878
- self .active -= 1
879
- if self .active <= 0 :
880
- # It was the last active iterator
881
- raise
882
- self .iterators [index ] = None
883
- return self .fillvalue
877
+ def __iter__ (self ):
878
+ return self
884
879
885
880
@__graalpython__ .builtin_method
886
881
def __next__ (self ):
887
- if self .active <= 0 :
882
+ if not self .tuplesize :
888
883
raise StopIteration
889
- nb = len (self .iterators )
890
- if nb == 0 :
884
+ if not self .numactive :
891
885
raise StopIteration
892
- result = []
893
- for index in range (nb ):
894
- result .append (self ._fetch (index ))
886
+ result = [None ] * self .tuplesize
887
+ for idx , it in enumerate (self .ittuple ):
888
+ if it is None :
889
+ item = self .fillvalue
890
+ else :
891
+ try :
892
+ item = next (it )
893
+ except StopIteration :
894
+ self .numactive -= 1
895
+ if self .numactive == 0 :
896
+ raise StopIteration
897
+ else :
898
+ item = self .fillvalue
899
+ self .ittuple [idx ] = None
900
+ except :
901
+ self .numactive = 0
902
+ raise
903
+ result [idx ] = item
895
904
return tuple (result )
896
905
897
- @__graalpython__ .builtin_method
898
- def __new__ (subtype , iter1 , * args , fillvalue = None ):
899
- self = object .__new__ (subtype )
900
- self .fillvalue = fillvalue
901
- self .active = len (args ) + 1
902
- self .iterators = [iter (iter1 )] + [iter (arg ) for arg in args ]
903
- return self
904
-
905
906
@__graalpython__ .builtin_method
906
907
def __reduce__ (self ):
907
- return type (self ), tuple ([(it if it else tuple ()) for it in self .iterators ]), self .fillvalue
908
-
908
+ args = []
909
+ for elem in self .ittuple :
910
+ args .append (elem if elem is not None else tuple ())
911
+ return type (self ), tuple (args ), self .fillvalue
909
912
910
913
@__graalpython__ .builtin_method
911
914
def __setstate__ (self , state ):
0 commit comments