diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py index 2382322cd2..61b9bce330 100644 --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -765,16 +765,6 @@ def test_translate(self, size): self.assertEqual(s.count(_('!')), repeats * 2) self.assertEqual(s.count(_('z')), repeats * 3) - # TODO: RUSTPYTHON - @unittest.expectedFailure - def test_lstrip(self, size): - super().test_lstrip(size) - - # TODO: RUSTPYTHON - @unittest.expectedFailure - def test_rstrip(self, size): - super().test_rstrip(size) - class BytesTest(unittest.TestCase, BaseStrTest): diff --git a/vm/src/builtins/str.rs b/vm/src/builtins/str.rs index bf0d17276a..2a65fcfa8f 100644 --- a/vm/src/builtins/str.rs +++ b/vm/src/builtins/str.rs @@ -592,25 +592,41 @@ impl PyStr { } #[pymethod] - fn lstrip(&self, chars: OptionalOption) -> String { - self.as_str() - .py_strip( - chars, - |s, chars| s.trim_start_matches(|c| chars.contains(c)), - |s| s.trim_start(), - ) - .to_owned() + fn lstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { + let s = zelf.as_str(); + let stripped = s.py_strip( + chars, + |s, chars| s.trim_start_matches(|c| chars.contains(c)), + |s| s.trim_start(), + ); + if s == stripped { + zelf + } else { + stripped.into_pystr_ref(vm) + } } #[pymethod] - fn rstrip(&self, chars: OptionalOption) -> String { - self.as_str() - .py_strip( - chars, - |s, chars| s.trim_end_matches(|c| chars.contains(c)), - |s| s.trim_end(), - ) - .to_owned() + fn rstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { + let s = zelf.as_str(); + let stripped = s.py_strip( + chars, + |s, chars| s.trim_end_matches(|c| chars.contains(c)), + |s| s.trim_end(), + ); + if s == stripped { + zelf + } else { + stripped.into_pystr_ref(vm) + } } #[pymethod]