(
&self,
memory: &mut GuestMemory<'_>,
buffer: GuestPtr<u8>,
element_heads: GuestPtr<GuestPtr<u8>>,
)
| 46 | } |
| 47 | |
| 48 | pub fn write_to_guest( |
| 49 | &self, |
| 50 | memory: &mut GuestMemory<'_>, |
| 51 | buffer: GuestPtr<u8>, |
| 52 | element_heads: GuestPtr<GuestPtr<u8>>, |
| 53 | ) -> Result<(), Error> { |
| 54 | let element_heads = element_heads.as_array(self.number_elements()); |
| 55 | let buffer = buffer.as_array(self.cumulative_size()); |
| 56 | let mut cursor = 0; |
| 57 | for (elem, head) in self.elems.iter().zip(element_heads.iter()) { |
| 58 | let bytes = elem.as_bytes(); |
| 59 | let len = bytes.len() as u32; |
| 60 | { |
| 61 | let elem_buffer = buffer |
| 62 | .get_range(cursor..(cursor + len)) |
| 63 | .ok_or(Error::invalid_argument())?; // Elements don't fit in buffer provided |
| 64 | memory.copy_from_slice(bytes, elem_buffer)?; |
| 65 | } |
| 66 | memory.write( |
| 67 | buffer.get(cursor + len).ok_or(Error::invalid_argument())?, |
| 68 | 0, |
| 69 | )?; // 0 terminate |
| 70 | memory.write(head?, buffer.get(cursor).expect("already validated"))?; |
| 71 | cursor += len + 1; |
| 72 | } |
| 73 | Ok(()) |
| 74 | } |
| 75 | } |
no test coverage detected