diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index cec6b83b6..0c1d9d886 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -311,8 +311,6 @@ class CommonTest(unittest.TestCase): return str(key) + '!!!' self.assertEqual(next(iter(T((1,2)))), 1) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_repeat(self): for m in range(4): s = tuple(range(m)) diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 7506cbbdf..a798b922a 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -169,11 +169,17 @@ impl PyTuple { #[pymethod(name = "__mul__")] #[pymethod(name = "__rmul__")] - fn mul(&self, counter: isize, vm: &VirtualMachine) -> PyRef { - if self.elements.is_empty() || counter == 0 { + fn mul(zelf: PyRef, counter: isize, vm: &VirtualMachine) -> PyRef { + if zelf.elements.is_empty() || counter == 0 { vm.ctx.empty_tuple.clone() + } else if counter == 1 && zelf.clone_class().is(PyTuple::class(vm)) { + // Special case: when some `tuple` is multiplied by `1`, + // nothing really happens, we need to return an object itself + // with the same `id()` to be compatible with CPython. + // This only works for `tuple` itself, not its subclasses. + zelf } else { - let elements = sequence::seq_mul(&self.elements, counter) + let elements = sequence::seq_mul(&zelf.elements, counter) .cloned() .collect::>() .into_boxed_slice();