(&mut self, pages_delta: i64, trap_on_oom: bool)
| 241 | } |
| 242 | |
| 243 | pub(crate) fn grow(&mut self, pages_delta: i64, trap_on_oom: bool) -> Result<Option<i64>, Trap> { |
| 244 | if pages_delta < 0 { |
| 245 | cold_path(); |
| 246 | crate::log::debug!("memory.grow failed: negative delta {}", pages_delta); |
| 247 | return Ok(None); |
| 248 | } |
| 249 | |
| 250 | let current_pages = self.page_count; |
| 251 | let Some(pages_delta) = usize::try_from(pages_delta).ok() else { |
| 252 | return Ok(None); |
| 253 | }; |
| 254 | let Some(new_pages) = current_pages.checked_add(pages_delta) else { |
| 255 | return Ok(None); |
| 256 | }; |
| 257 | let max_pages = self.kind.page_count_max().try_into().unwrap_or(usize::MAX); |
| 258 | |
| 259 | if new_pages > max_pages { |
| 260 | cold_path(); |
| 261 | crate::log::debug!("memory.grow failed: new_pages={}, max_pages={}", new_pages, max_pages); |
| 262 | return Ok(None); |
| 263 | } |
| 264 | |
| 265 | let Some(new_size) = (new_pages as u64).checked_mul(self.kind.page_size()) else { |
| 266 | return Ok(None); |
| 267 | }; |
| 268 | if new_size > self.kind.max_size() { |
| 269 | cold_path(); |
| 270 | crate::log::debug!("memory.grow failed: new_size={}, max_size={}", new_size, self.kind.max_size()); |
| 271 | return Ok(None); |
| 272 | } |
| 273 | |
| 274 | let Some(new_size) = usize::try_from(new_size).ok() else { |
| 275 | return Ok(None); |
| 276 | }; |
| 277 | if new_size == self.inner.len() { |
| 278 | return Ok(i64::try_from(current_pages).ok()); |
| 279 | } |
| 280 | |
| 281 | if let Err(err) = self.inner.grow_to(new_size) { |
| 282 | if trap_on_oom { |
| 283 | return Err(err); |
| 284 | } |
| 285 | return Ok(None); |
| 286 | } |
| 287 | self.page_count = new_pages; |
| 288 | Ok(i64::try_from(current_pages).ok()) |
| 289 | } |
| 290 | } |
nothing calls this directly
no test coverage detected