From e9f99ca0805cbb648ce5b3feee04c1b9be87ed6d Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Thu, 24 Sep 2020 08:20:11 +0900 Subject: [PATCH] try_bytes_like --- vm/src/byteslike.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/vm/src/byteslike.rs b/vm/src/byteslike.rs index ed887b04b..be93298b8 100644 --- a/vm/src/byteslike.rs +++ b/vm/src/byteslike.rs @@ -22,7 +22,7 @@ impl TryFromObject for PyBytesLike { array @ PyArray => Ok(PyBytesLike::Array(array)), obj => Err(vm.new_type_error(format!( "a bytes-like object is required, not {}", - obj.class() + obj.lease_class().name ))), }) } @@ -72,6 +72,24 @@ impl PyBytesLike { } } +pub(crate) fn try_bytes_like( + vm: &VirtualMachine, + obj: &PyObjectRef, + f: impl FnOnce(&[u8]) -> R, +) -> PyResult { + let r = match_class!(match obj { + ref b @ PyBytes => f(b.borrow_value()), + ref b @ PyByteArray => f(&b.borrow_value().elements), + ref array @ PyArray => f(&*array.get_bytes()), + obj => + return Err(vm.new_type_error(format!( + "a bytes-like object is required, not {}", + obj.lease_class().name + ))), + }); + Ok(r) +} + pub enum PyRwBytesLike { Bytearray(PyByteArrayRef), Array(PyArrayRef),