Skip to content

Commit e2ca208

Browse files
authored
Return at once when repeating an empty sequence (#8842)
* Return at once when repeating an empty sequence Assisted-by: Claude Code:claude-opus-5-5 * use sys.maxsize for the empty array repeat check
1 parent eabba7c commit e2ca208

4 files changed

Lines changed: 23 additions & 1 deletion

File tree

‎crates/vm/src/sequence.rs‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ where
9898
{
9999
fn mul(&self, vm: &VirtualMachine, n: isize) -> PyResult<Vec<T>> {
100100
let n = vm.check_repeat_or_overflow_error(self.as_ref().len(), n)?;
101+
if self.as_ref().is_empty() {
102+
return Ok(Vec::new());
103+
}
101104

102105
if n > 1 && core::mem::size_of_val(self.as_ref()) >= MAX_MEMORY_SIZE / n {
103106
return Err(vm.no_memory_error());
@@ -134,7 +137,7 @@ where
134137

135138
if n == 0 {
136139
self.as_vec_mut().clear();
137-
} else if n != 1 {
140+
} else if n != 1 && !self.as_ref().is_empty() {
138141
let len = self.as_ref().len();
139142
let v = self.as_vec_mut();
140143
v.try_reserve_exact(len * (n - 1))

‎extra_tests/snippets/builtin_bytearray.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,3 +882,8 @@ class B(bytearray):
882882
assert_raises(
883883
IndexError, lambda: a[-sys.maxsize - i], _msg="bytearray index out of range"
884884
)
885+
886+
# Repeating an empty bytearray by a huge count returns at once
887+
empty = bytearray()
888+
empty *= sys.maxsize
889+
assert empty == bytearray()

‎extra_tests/snippets/builtin_list.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,3 +1062,9 @@ def __iter__(self):
10621062
# A report the list can act on is acted on.
10631063
assert list(Reports(3)) == [1, 2, 3]
10641064
assert list(Reports(0)) == [1, 2, 3]
1065+
1066+
# Repeating an empty list by a huge count returns at once
1067+
empty = []
1068+
empty *= sys.maxsize
1069+
assert empty == []
1070+
assert [] * sys.maxsize == []

‎extra_tests/snippets/stdlib_array.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from array import array
23
from pickle import dumps, loads
34

@@ -176,3 +177,10 @@ def test_frombytes_of_itself():
176177
wide = array("i", [1, 2, 3])
177178
with assert_raises(TypeError):
178179
wide.frombytes(memoryview(wide))
180+
181+
182+
# Repeating an empty array by a huge count returns at once
183+
empty = array("i")
184+
assert empty * sys.maxsize == array("i")
185+
empty *= sys.maxsize
186+
assert empty == array("i")

0 commit comments

Comments
 (0)