Optimize bytes-like (l|r)strip (#4500)

This commit is contained in:
Dan Näsman
2023-02-17 14:31:12 +02:00
committed by GitHub
parent 1d815464f6
commit a0c34dab54
3 changed files with 62 additions and 24 deletions

View File

@@ -507,13 +507,37 @@ impl PyByteArray {
}
#[pymethod]
fn lstrip(&self, chars: OptionalOption<PyBytesInner>) -> Self {
self.inner().lstrip(chars).into()
fn lstrip(
zelf: PyRef<Self>,
chars: OptionalOption<PyBytesInner>,
vm: &VirtualMachine,
) -> PyRef<Self> {
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<PyBytesInner>) -> Self {
self.inner().rstrip(chars).into()
fn rstrip(
zelf: PyRef<Self>,
chars: OptionalOption<PyBytesInner>,
vm: &VirtualMachine,
) -> PyRef<Self> {
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, /)

View File

@@ -366,13 +366,31 @@ impl PyBytes {
}
#[pymethod]
fn lstrip(&self, chars: OptionalOption<PyBytesInner>) -> Self {
self.inner.lstrip(chars).into()
fn lstrip(
zelf: PyRef<Self>,
chars: OptionalOption<PyBytesInner>,
vm: &VirtualMachine,
) -> PyRef<Self> {
let stripped = zelf.inner.lstrip(chars);
if stripped == zelf.as_bytes() {
zelf
} else {
vm.ctx.new_bytes(stripped.to_vec())
}
}
#[pymethod]
fn rstrip(&self, chars: OptionalOption<PyBytesInner>) -> Self {
self.inner.rstrip(chars).into()
fn rstrip(
zelf: PyRef<Self>,
chars: OptionalOption<PyBytesInner>,
vm: &VirtualMachine,
) -> PyRef<Self> {
let stripped = zelf.inner.rstrip(chars);
if stripped == zelf.as_bytes().to_vec() {
zelf
} else {
vm.ctx.new_bytes(stripped.to_vec())
}
}
/// removeprefix($self, prefix, /)

View File

@@ -576,24 +576,20 @@ impl PyBytesInner {
.to_vec()
}
pub fn lstrip(&self, chars: OptionalOption<PyBytesInner>) -> Vec<u8> {
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<PyBytesInner>) -> &[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<PyBytesInner>) -> Vec<u8> {
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<PyBytesInner>) -> &[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