Skip to content

Commit 7e2efb4

Browse files
committed
Fixes that id() of tuple was changing on * 1, refs RustPython#2840
1 parent 08614bf commit 7e2efb4

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

Lib/test/seq_tests.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,6 @@ def __getitem__(self, key):
311311
return str(key) + '!!!'
312312
self.assertEqual(next(iter(T((1,2)))), 1)
313313

314-
# TODO: RUSTPYTHON
315-
@unittest.expectedFailure
316314
def test_repeat(self):
317315
for m in range(4):
318316
s = tuple(range(m))

vm/src/builtins/tuple.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,17 @@ impl PyTuple {
169169

170170
#[pymethod(name = "__mul__")]
171171
#[pymethod(name = "__rmul__")]
172-
fn mul(&self, counter: isize, vm: &VirtualMachine) -> PyRef<Self> {
173-
if self.elements.is_empty() || counter == 0 {
172+
fn mul(zelf: PyRef<Self>, counter: isize, vm: &VirtualMachine) -> PyRef<Self> {
173+
if zelf.elements.is_empty() || counter == 0 {
174174
vm.ctx.empty_tuple.clone()
175+
} else if counter == 1 && zelf.clone_class().is(PyTuple::class(vm)) {
176+
// Special case: when some `tuple` is multiplied by `1`,
177+
// nothing really happens, we need to return an object itself
178+
// with the same `id()` to be compatible with CPython.
179+
// This only works for `tuple` itself, not its subclasses.
180+
zelf
175181
} else {
176-
let elements = sequence::seq_mul(&self.elements, counter)
182+
let elements = sequence::seq_mul(&zelf.elements, counter)
177183
.cloned()
178184
.collect::<Vec<_>>()
179185
.into_boxed_slice();

0 commit comments

Comments
 (0)