Skip to content

Commit fbeedb7

Browse files
committed
Fix seq_mul with negative numbers
1 parent deca878 commit fbeedb7

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

vm/src/obj/objsequence.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -362,31 +362,30 @@ pub fn seq_le(
362362
pub struct SeqMul<'a> {
363363
seq: &'a dyn SimpleSeq,
364364
repetitions: usize,
365-
iter: DynPyIter<'a>,
366-
}
367-
impl SeqMul<'_> {
368-
fn next_iter(&mut self) {
369-
self.repetitions -= 1;
370-
self.iter = self.seq.iter();
371-
}
365+
iter: Option<DynPyIter<'a>>,
372366
}
373367
impl<'a> Iterator for SeqMul<'a> {
374368
type Item = &'a PyObjectRef;
375369
fn next(&mut self) -> Option<Self::Item> {
376-
match self.iter.next() {
370+
if self.seq.len() == 0 {
371+
return None;
372+
}
373+
match self.iter.as_mut().and_then(Iterator::next) {
377374
Some(item) => Some(item),
378375
None => {
379376
if self.repetitions == 0 {
380377
None
381378
} else {
382-
self.next_iter();
379+
self.repetitions -= 1;
380+
self.iter = Some(self.seq.iter());
383381
self.next()
384382
}
385383
}
386384
}
387385
}
388386
fn size_hint(&self) -> (usize, Option<usize>) {
389-
let size = self.iter.len() + (self.repetitions * self.seq.len());
387+
let size = self.iter.as_ref().map_or(0, ExactSizeIterator::len)
388+
+ (self.repetitions * self.seq.len());
390389
(size, Some(size))
391390
}
392391
}
@@ -395,8 +394,8 @@ impl ExactSizeIterator for SeqMul<'_> {}
395394
pub fn seq_mul(seq: &dyn SimpleSeq, repetitions: isize) -> SeqMul {
396395
SeqMul {
397396
seq,
398-
repetitions: repetitions.max(0) as usize - 1,
399-
iter: seq.iter(),
397+
repetitions: repetitions.max(0) as usize,
398+
iter: None,
400399
}
401400
}
402401

0 commit comments

Comments
 (0)