MCPcopy Create free account
hub / github.com/explodingcamera/tinywasm / grow

Method grow

crates/tinywasm/src/store/memory/instance.rs:243–289  ·  view source on GitHub ↗
(&mut self, pages_delta: i64, trap_on_oom: bool)

Source from the content-addressed store, hash-verified

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}

Callers

nothing calls this directly

Calls 5

page_count_maxMethod · 0.80
page_sizeMethod · 0.80
max_sizeMethod · 0.80
lenMethod · 0.45
grow_toMethod · 0.45

Tested by

no test coverage detected