diff --git a/extra_tests/snippets/bytes.py b/extra_tests/snippets/bytes.py index d9489a613..7cbd38010 100644 --- a/extra_tests/snippets/bytes.py +++ b/extra_tests/snippets/bytes.py @@ -615,6 +615,16 @@ assert b'\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97'.decode('utf-8') == '中文字' assert b'rust%bpython%b' % (b' ', b'!') == b'rust python!' assert b'x=%i y=%f' % (1, 2.5) == b'x=1 y=2.500000' +# __bytes__ +foo = b'foo\x00bar' +assert foo.__bytes__() == foo +assert type(foo.__bytes__()) == bytes +class bytes_subclass(bytes): + pass +bar = bytes_subclass(b'bar\x00foo') +assert bar.__bytes__() == bar +assert type(bar.__bytes__()) == bytes + class A: def __bytes__(self): return b"bytess" diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index f8d35eb0d..7e91719fd 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -128,6 +128,15 @@ impl PyBytes { &self.inner.elements } + #[pymethod(magic)] + fn bytes(zelf: PyRef, vm: &VirtualMachine) -> PyRef { + if zelf.is(&vm.ctx.types.bytes_type) { + zelf + } else { + PyBytes::from(zelf.inner.clone()).into_ref(vm) + } + } + #[pymethod(magic)] fn sizeof(&self) -> usize { size_of::() + self.inner.elements.len() * size_of::()