From f9f2be1aaca78d082029aa65b4f932c454bf3e88 Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Tue, 14 Feb 2023 11:15:55 +0200 Subject: [PATCH 1/3] optimize bytes-like (l|r)strip --- vm/src/builtins/bytes.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index 12e968926c2..d5365e2ed76 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -366,13 +366,23 @@ impl PyBytes { } #[pymethod] - fn lstrip(&self, chars: OptionalOption) -> Self { - self.inner.lstrip(chars).into() + fn lstrip(zelf: PyRef, chars: OptionalOption, vm: &VirtualMachine) -> PyRef { + let stripped = zelf.inner.lstrip(chars); + if stripped == zelf.as_bytes().to_vec() { + zelf + } else { + vm.ctx.new_bytes(stripped) + } } #[pymethod] - fn rstrip(&self, chars: OptionalOption) -> Self { - self.inner.rstrip(chars).into() + fn rstrip(zelf: PyRef, chars: OptionalOption, vm: &VirtualMachine) -> PyRef { + let stripped = zelf.inner.rstrip(chars); + if stripped == zelf.as_bytes().to_vec() { + zelf + } else { + vm.ctx.new_bytes(stripped) + } } /// removeprefix($self, prefix, /) From 49a81d2003eafb2d66c8bb5b5991d55f25571eb4 Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Tue, 14 Feb 2023 12:23:18 +0200 Subject: [PATCH 2/3] fix formatting --- vm/src/builtins/bytes.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index d5365e2ed76..b3ef0452709 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -366,7 +366,11 @@ impl PyBytes { } #[pymethod] - fn lstrip(zelf: PyRef, chars: OptionalOption, vm: &VirtualMachine) -> PyRef { + fn lstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { let stripped = zelf.inner.lstrip(chars); if stripped == zelf.as_bytes().to_vec() { zelf @@ -376,7 +380,11 @@ impl PyBytes { } #[pymethod] - fn rstrip(zelf: PyRef, chars: OptionalOption, vm: &VirtualMachine) -> PyRef { + fn rstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { let stripped = zelf.inner.rstrip(chars); if stripped == zelf.as_bytes().to_vec() { zelf From 8b5e6aae3a7d073e477a28184db8d1efca490948 Mon Sep 17 00:00:00 2001 From: Dan Nasman Date: Thu, 16 Feb 2023 13:53:18 +0200 Subject: [PATCH 3/3] change return type of bytesinner (l|r)strip --- vm/src/builtins/bytearray.rs | 32 ++++++++++++++++++++++++++++---- vm/src/builtins/bytes.rs | 6 +++--- vm/src/bytesinner.rs | 28 ++++++++++++---------------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/vm/src/builtins/bytearray.rs b/vm/src/builtins/bytearray.rs index c1f42b61db8..ff45b90182b 100644 --- a/vm/src/builtins/bytearray.rs +++ b/vm/src/builtins/bytearray.rs @@ -507,13 +507,37 @@ impl PyByteArray { } #[pymethod] - fn lstrip(&self, chars: OptionalOption) -> Self { - self.inner().lstrip(chars).into() + fn lstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { + let inner = zelf.inner(); + let stripped = inner.lstrip(chars); + let elements = &inner.elements; + if stripped == elements { + drop(inner); + zelf + } else { + vm.new_pyref(PyByteArray::from(stripped.to_vec())) + } } #[pymethod] - fn rstrip(&self, chars: OptionalOption) -> Self { - self.inner().rstrip(chars).into() + fn rstrip( + zelf: PyRef, + chars: OptionalOption, + vm: &VirtualMachine, + ) -> PyRef { + let inner = zelf.inner(); + let stripped = inner.rstrip(chars); + let elements = &inner.elements; + if stripped == elements { + drop(inner); + zelf + } else { + vm.new_pyref(PyByteArray::from(stripped.to_vec())) + } } /// removeprefix($self, prefix, /) diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index b3ef0452709..41742c196c9 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -372,10 +372,10 @@ impl PyBytes { vm: &VirtualMachine, ) -> PyRef { let stripped = zelf.inner.lstrip(chars); - if stripped == zelf.as_bytes().to_vec() { + if stripped == zelf.as_bytes() { zelf } else { - vm.ctx.new_bytes(stripped) + vm.ctx.new_bytes(stripped.to_vec()) } } @@ -389,7 +389,7 @@ impl PyBytes { if stripped == zelf.as_bytes().to_vec() { zelf } else { - vm.ctx.new_bytes(stripped) + vm.ctx.new_bytes(stripped.to_vec()) } } diff --git a/vm/src/bytesinner.rs b/vm/src/bytesinner.rs index 8bd4a4fe290..b160e9b9f03 100644 --- a/vm/src/bytesinner.rs +++ b/vm/src/bytesinner.rs @@ -578,24 +578,20 @@ impl PyBytesInner { .to_vec() } - pub fn lstrip(&self, chars: OptionalOption) -> Vec { - self.elements - .py_strip( - chars, - |s, chars| s.trim_start_with(|c| chars.contains(&(c as u8))), - |s| s.trim_start(), - ) - .to_vec() + pub fn lstrip(&self, chars: OptionalOption) -> &[u8] { + self.elements.py_strip( + chars, + |s, chars| s.trim_start_with(|c| chars.contains(&(c as u8))), + |s| s.trim_start(), + ) } - pub fn rstrip(&self, chars: OptionalOption) -> Vec { - self.elements - .py_strip( - chars, - |s, chars| s.trim_end_with(|c| chars.contains(&(c as u8))), - |s| s.trim_end(), - ) - .to_vec() + pub fn rstrip(&self, chars: OptionalOption) -> &[u8] { + self.elements.py_strip( + chars, + |s, chars| s.trim_end_with(|c| chars.contains(&(c as u8))), + |s| s.trim_end(), + ) } // new in Python 3.9