| 129 | |
| 130 | #[inline(always)] |
| 131 | fn grow_to(&mut self, new_len: usize) -> Result<(), crate::Trap> { |
| 132 | if new_len < self.len { |
| 133 | return Err(crate::Trap::MemoryOutOfBounds { offset: new_len, len: 0, max: self.len }); |
| 134 | } |
| 135 | |
| 136 | let new_chunk_count = if new_len == 0 { 0 } else { new_len.div_ceil(self.chunk_size) }; |
| 137 | if new_chunk_count > self.chunks.len() { |
| 138 | match self.chunks.try_reserve_exact(new_chunk_count - self.chunks.len()) { |
| 139 | Ok(()) => {} |
| 140 | Err(_) => { |
| 141 | cold_path(); |
| 142 | return Err(crate::Trap::OutOfMemory); |
| 143 | } |
| 144 | } |
| 145 | self.chunks.resize_with(new_chunk_count, || None); |
| 146 | } else { |
| 147 | self.chunks.truncate(new_chunk_count); |
| 148 | } |
| 149 | |
| 150 | self.len = new_len; |
| 151 | Ok(()) |
| 152 | } |
| 153 | |
| 154 | #[inline(always)] |
| 155 | fn read(&self, addr: usize, dst: &mut [u8]) -> usize { |