MCPcopy Index your code
hub / github.com/explodingcamera/tinywasm / exec_table_init

Method exec_table_init

crates/tinywasm/src/interpreter/executor.rs:1494–1527  ·  view source on GitHub ↗
(&mut self, elem_index: u32, table_index: u32)

Source from the content-addressed store, hash-verified

1492 }
1493
1494 fn exec_table_init(&mut self, elem_index: u32, table_index: u32) -> Result<(), Trap> {
1495 let size = i32::stack_pop(&mut self.store.value_stack); // n
1496 let offset = i32::stack_pop(&mut self.store.value_stack); // s
1497 let dst = i32::stack_pop(&mut self.store.value_stack); // d
1498 let elem_addr = self.module.resolve_elem_addr(elem_index) as usize;
1499 let elem = self.store.state.elements.get(elem_addr).ok_or_else(|| Trap::Other("element not found"))?;
1500
1501 let table_addr = self.module.resolve_table_addr(table_index) as usize;
1502 let table = self.store.state.tables.get_mut(table_addr).ok_or_else(|| Trap::Other("table not found"))?;
1503
1504 let elem_len = elem.items.as_ref().map_or(0, alloc::vec::Vec::len);
1505 let table_len = table.size();
1506
1507 if size < 0 || ((size + offset) as usize > elem_len) || ((dst + size) > table_len) {
1508 cold_path();
1509 return Err(Trap::TableOutOfBounds { offset: offset as usize, len: size as usize, max: elem_len });
1510 }
1511
1512 if size == 0 {
1513 return Ok(());
1514 }
1515
1516 if let ElementKind::Active { .. } = elem.kind {
1517 cold_path();
1518 return Err(Trap::Other("table.init with active element"));
1519 }
1520
1521 let Some(items) = elem.items.as_ref() else {
1522 cold_path();
1523 return Err(Trap::TableOutOfBounds { offset: 0, len: 0, max: 0 });
1524 };
1525
1526 table.init(i64::from(dst), &items[offset as usize..(offset + size) as usize])
1527 }
1528
1529 fn exec_table_grow(&mut self, table_index: u32) -> Result<(), Trap> {
1530 let table = self.store.state.get_table_mut(self.module.resolve_table_addr(table_index));

Callers 1

execMethod · 0.80

Calls 6

resolve_elem_addrMethod · 0.80
resolve_table_addrMethod · 0.80
as_refMethod · 0.80
initMethod · 0.80
getMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected