Skip to content

Commit 44ddaef

Browse files
committed
fix cycle
1 parent 24484fd commit 44ddaef

File tree

1 file changed

+32
-15
lines changed

1 file changed

+32
-15
lines changed

graalpython/lib-graalpython/itertools.py

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -935,34 +935,51 @@ def __init__(self, iterable):
935935
self.saved = []
936936
self.iterable = iter(iterable)
937937
self.index = 0
938+
self.firstpass = False
938939

939940
@__graalpython__.builtin_method
940941
def __iter__(self):
941942
return self
942943

943944
@__graalpython__.builtin_method
944945
def __next__(self):
945-
if self.index > 0:
946-
if not self.saved:
947-
raise StopIteration
948-
if len(self.saved) > self.index:
949-
obj = self.saved[self.index]
950-
self.index += 1
951-
else:
952-
obj = self.saved[0]
953-
self.index = 1
954-
else:
946+
if self.iterable:
955947
try:
956948
obj = next(self.iterable)
957949
except StopIteration:
958-
if not self.saved:
959-
raise
960-
obj = self.saved[0]
961-
self.index = 1
950+
self.iterable = None
962951
else:
963-
self.saved.append(obj)
952+
if not self.firstpass:
953+
self.saved.append(obj)
954+
return obj
955+
if not self.saved:
956+
raise StopIteration
957+
obj = self.saved[self.index]
958+
self.index += 1
959+
if self.index >= len(self.saved):
960+
self.index = 0
964961
return obj
965962

963+
@__graalpython__.builtin_method
964+
def __reduce__(self):
965+
if self.iterable is None:
966+
it = iter(self.saved)
967+
if self.index:
968+
it.__setstate__(self.index)
969+
return type(self), (it,), (self.saved, True)
970+
return type(self), (self.iterable,), (self.saved, self.firstpass)
971+
972+
@__graalpython__.builtin_method
973+
def __setstate__(self, state):
974+
if (not isinstance(state, tuple) or
975+
len(state) != 2 or
976+
not isinstance(state[0], list) or
977+
not isinstance(state[1], int)):
978+
raise TypeError("invalid state tuple")
979+
self.saved = state[0]
980+
self.firstpass = state[1]
981+
self.index = 0
982+
966983

967984
class compress():
968985
"""Make an iterator that filters elements from *data* returning

0 commit comments

Comments
 (0)