mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Implement bytearray.__str__ && bytes.__str__ (#7477)
* Implement bytearray.__str__ * Implement bytes.__str__ * Turn __str__ method into slot
This commit is contained in:
@@ -215,6 +215,15 @@ impl PyByteArray {
|
||||
size_of::<Self>() + self.borrow_buf().len() * size_of::<u8>()
|
||||
}
|
||||
|
||||
#[pyslot]
|
||||
fn slot_str(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<PyStrRef> {
|
||||
let zelf = zelf.downcast_ref::<Self>().expect("expected bytearray");
|
||||
PyBytesInner::warn_on_str("str() on a bytearray instance", vm)?;
|
||||
let class_name = zelf.class().name();
|
||||
let repr = zelf.inner().repr_with_name(&class_name, vm)?;
|
||||
Ok(vm.ctx.new_str(repr))
|
||||
}
|
||||
|
||||
fn __add__(&self, other: ArgBytesLike) -> Self {
|
||||
self.inner().add(&other.borrow_buf()).into()
|
||||
}
|
||||
|
||||
@@ -224,6 +224,13 @@ impl PyBytes {
|
||||
size_of::<Self>() + self.len() * size_of::<u8>()
|
||||
}
|
||||
|
||||
#[pyslot]
|
||||
fn slot_str(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<PyStrRef> {
|
||||
let zelf = zelf.downcast_ref::<Self>().expect("expected bytes");
|
||||
PyBytesInner::warn_on_str("str() on a bytes instance", vm)?;
|
||||
Ok(vm.ctx.new_str(zelf.inner.repr_bytes(vm)?))
|
||||
}
|
||||
|
||||
fn __add__(&self, other: ArgBytesLike) -> Vec<u8> {
|
||||
self.inner.add(&other.borrow_buf())
|
||||
}
|
||||
|
||||
@@ -237,6 +237,18 @@ impl PyBytesInner {
|
||||
vm.new_overflow_error("bytes object is too large to make repr")
|
||||
}
|
||||
|
||||
pub(crate) fn warn_on_str(message: &'static str, vm: &VirtualMachine) -> PyResult<()> {
|
||||
if vm.state.config.settings.bytes_warning > 0 {
|
||||
crate::stdlib::_warnings::warn(
|
||||
vm.ctx.exceptions.bytes_warning,
|
||||
message.to_owned(),
|
||||
1,
|
||||
vm,
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn repr_with_name(&self, class_name: &str, vm: &VirtualMachine) -> PyResult<String> {
|
||||
const DECORATION_LEN: isize = 2 + 3; // 2 for (), 3 for b"" => bytearray(b"")
|
||||
let escape = crate::literal::escape::AsciiEscape::new_repr(&self.elements);
|
||||
|
||||
Reference in New Issue
Block a user