| use super::*; |
| |
| impl From<&ProtoStr> for PtrAndLen { |
| fn from(s: &ProtoStr) -> Self { |
| let bytes = s.as_bytes(); |
| Self { ptr: bytes.as_ptr(), len: bytes.len() } |
| } |
| } |
| |
| /// Kernel-specific owned `string` and `bytes` field type. |
| #[doc(hidden)] |
| pub struct InnerProtoString(OwnedArenaBox<[u8]>); |
| |
| impl InnerProtoString { |
| pub(crate) fn as_bytes(&self) -> &[u8] { |
| &self.0 |
| } |
| |
| #[doc(hidden)] |
| pub fn into_raw_parts(self) -> (PtrAndLen, Arena) { |
| let (data_ptr, arena) = self.0.into_parts(); |
| (unsafe { data_ptr.as_ref().into() }, arena) |
| } |
| } |
| |
| impl From<&[u8]> for InnerProtoString { |
| fn from(val: &[u8]) -> InnerProtoString { |
| let arena = Arena::new(); |
| let in_arena_copy = arena.copy_slice_in(val).unwrap(); |
| // SAFETY: |
| // - `in_arena_copy` is valid slice that will live for `arena`'s lifetime and |
| // this is the only reference in the program to it. |
| // - `in_arena_copy` is a pointer into an allocation on `arena` |
| InnerProtoString(unsafe { OwnedArenaBox::new(Into::into(in_arena_copy), arena) }) |
| } |
| } |