diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index cac2105b6..1bad55113 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1693,8 +1693,6 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65) self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_bytearray_translate(self): x = bytearray(b"abc") self.assertRaises(ValueError, x.translate, b"1", 1) diff --git a/vm/src/bytesinner.rs b/vm/src/bytesinner.rs index 87b67a92a..8e9613747 100644 --- a/vm/src/bytesinner.rs +++ b/vm/src/bytesinner.rs @@ -202,9 +202,9 @@ impl ByteInnerPaddingOptions { #[derive(FromArgs)] pub struct ByteInnerTranslateOptions { #[pyarg(positional)] - table: Option, + table: Option, #[pyarg(any, optional)] - delete: OptionalArg, + delete: OptionalArg, } impl ByteInnerTranslateOptions { @@ -212,17 +212,24 @@ impl ByteInnerTranslateOptions { let table = self.table.map_or_else( || Ok((0..=255).collect::>()), |v| { - if v.elements.len() != 256 { - return Err(vm.new_value_error( - "translation table must be 256 characters long".to_owned(), - )); - } - Ok(v.elements.to_vec()) + let bytes = v + .try_into_value::(vm) + .ok() + .filter(|v| v.elements.len() == 256) + .ok_or_else(|| { + vm.new_value_error( + "translation table must be 256 characters long".to_owned(), + ) + })?; + Ok(bytes.elements.to_vec()) }, )?; let delete = match self.delete { - OptionalArg::Present(byte) => byte.elements, + OptionalArg::Present(byte) => { + let byte: PyBytesInner = byte.try_into_value(vm)?; + byte.elements + } _ => vec![], };