Skip to content
This repository was archived by the owner on Oct 3, 2025. It is now read-only.

Commit b61e55c

Browse files
fix: table_init variable order
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
1 parent a953264 commit b61e55c

File tree

9 files changed

+23
-117
lines changed

9 files changed

+23
-117
lines changed

.github/workflows/test.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,14 @@ jobs:
121121
path: examples/rust/out
122122

123123
- name: Run all tests (for the default workspace members)
124-
uses: houseabsolute/actions-rust-cross@v0.0.12
124+
uses: houseabsolute/actions-rust-cross@v0.0.13
125125
with:
126126
command: test
127127
target: armv7-unknown-linux-gnueabihf
128128
toolchain: nightly
129129

130130
- name: Run MVP testsuite
131-
uses: houseabsolute/actions-rust-cross@v0.0.12
131+
uses: houseabsolute/actions-rust-cross@v0.0.13
132132
with:
133133
command: test
134134
args: "-p tinywasm --test test-mvp --release -- --enable"

Cargo.lock

Lines changed: 8 additions & 91 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

benchmarks/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ publish=false
44
edition.workspace=true
55

66
[dependencies]
7-
criterion={version="0.5", features=["html_reports"]}
7+
criterion={version="0.5"}
88
tinywasm={path="../crates/tinywasm"}
99
wat={version="1"}
1010
wasmi={version="0.32", features=["std"]}

crates/tinywasm/src/instance.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{Error, FuncHandle, FuncHandleTyped, Imports, MemoryRef, MemoryRefMut
1010
///
1111
/// See <https://webassembly.github.io/spec/core/exec/runtime.html#module-instances>
1212
#[derive(Debug, Clone)]
13-
pub struct ModuleInstance(Rc<ModuleInstanceInner>);
13+
pub struct ModuleInstance(pub(crate) Rc<ModuleInstanceInner>);
1414

1515
#[allow(dead_code)]
1616
#[derive(Debug)]

crates/tinywasm/src/runtime/interpreter/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ impl<'store, 'stack> Executor<'store, 'stack> {
273273
TableGet(table_idx) => self.exec_table_get(*table_idx)?,
274274
TableSet(table_idx) => self.exec_table_set(*table_idx)?,
275275
TableSize(table_idx) => self.exec_table_size(*table_idx)?,
276-
TableInit(table_idx, elem_idx) => self.exec_table_init(*elem_idx, *table_idx)?,
276+
TableInit(elem_idx, table_idx) => self.exec_table_init(*elem_idx, *table_idx)?,
277277
TableGrow(table_idx) => self.exec_table_grow(*table_idx)?,
278278
TableFill(table_idx) => self.exec_table_fill(*table_idx)?,
279279

@@ -715,9 +715,8 @@ impl<'store, 'stack> Executor<'store, 'stack> {
715715
return Ok(());
716716
}
717717

718-
// TODO, not sure how to handle passive elements, but this makes the test pass
719-
if let ElementKind::Passive = elem.kind {
720-
return Ok(());
718+
if let ElementKind::Active { .. } = elem.kind {
719+
return Err(Error::Other("table.init with active element".to_string()));
721720
}
722721

723722
let Some(items) = elem.items.as_ref() else {
@@ -727,7 +726,6 @@ impl<'store, 'stack> Executor<'store, 'stack> {
727726
table.borrow_mut().init(self.module.func_addrs(), dst, &items[offset as usize..(offset + size) as usize])?;
728727
Ok(())
729728
}
730-
// todo: this is just a placeholder, need to check the spec
731729
fn exec_table_grow(&mut self, table_index: u32) -> Result<()> {
732730
let table = self.store.get_table(self.module.resolve_table_addr(table_index)?)?;
733731
let sz = table.borrow().size();

crates/tinywasm/src/store/table.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ impl TableInstance {
105105
}
106106

107107
pub(crate) fn grow(&mut self, n: i32, init: TableElement) -> Result<()> {
108-
let len = n + self.elements.len() as i32;
109-
let max = self.kind.size_max.unwrap_or(MAX_TABLE_SIZE) as i32;
108+
if n < 0 {
109+
return Err(Error::Trap(crate::Trap::TableOutOfBounds { offset: 0, len: 1, max: self.elements.len() }));
110+
}
110111

112+
let len = n as usize + self.elements.len();
113+
let max = self.kind.size_max.unwrap_or(MAX_TABLE_SIZE) as usize;
111114
if len > max {
112115
return Err(Error::Trap(crate::Trap::TableOutOfBounds {
113116
offset: len as usize,
@@ -243,18 +246,6 @@ mod tests {
243246
);
244247
}
245248

246-
#[test]
247-
fn test_table_grow_and_fit() {
248-
let kind = dummy_table_type();
249-
let mut table_instance = TableInstance::new(kind, 0);
250-
251-
let result = table_instance.set(15, TableElement::Initialized(1));
252-
assert!(result.is_ok(), "Table grow on set failed");
253-
254-
let size = table_instance.size();
255-
assert!(size >= 16, "Table did not grow to expected size");
256-
}
257-
258249
#[test]
259250
fn test_table_init() {
260251
let kind = dummy_table_type();

0 commit comments

Comments
 (0)