1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
use crate::{ Bytes, FromValue, OwnedMut, OwnedRef, RawOwnedMut, RawOwnedRef, UnsafeFromValue, Value, VmError, }; value_types!(crate::BYTES_TYPE, Bytes => Bytes, &Bytes, &mut Bytes, &[u8]); impl FromValue for Bytes { fn from_value(value: Value) -> Result<Self, VmError> { let bytes = value.into_bytes()?; Ok(bytes.borrow_ref()?.clone()) } } impl<'a> UnsafeFromValue for &'a Bytes { type Output = *const Bytes; type Guard = RawOwnedRef; unsafe fn unsafe_from_value(value: Value) -> Result<(Self::Output, Self::Guard), VmError> { let bytes = value.into_bytes()?; let bytes = bytes.owned_ref()?; Ok(OwnedRef::into_raw(bytes)) } unsafe fn to_arg(output: Self::Output) -> Self { &*output } } impl<'a> UnsafeFromValue for &'a mut Bytes { type Output = *mut Bytes; type Guard = RawOwnedMut; unsafe fn unsafe_from_value(value: Value) -> Result<(Self::Output, Self::Guard), VmError> { let bytes = value.into_bytes()?; let bytes = bytes.owned_mut()?; Ok(OwnedMut::into_raw(bytes)) } unsafe fn to_arg(output: Self::Output) -> Self { &mut *output } } impl<'a> UnsafeFromValue for &'a [u8] { type Output = *const [u8]; type Guard = RawOwnedRef; unsafe fn unsafe_from_value(value: Value) -> Result<(Self::Output, Self::Guard), VmError> { let bytes = value.into_bytes()?; let bytes = bytes.owned_ref()?; let (value, guard) = OwnedRef::into_raw(bytes); Ok(((*value).bytes.as_slice(), guard)) } unsafe fn to_arg(output: Self::Output) -> Self { &*output } }