(&mut self, elem_index: u32, table_index: u32)
| 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)); |
no test coverage detected