From 1cf50a22104ed075a08781321486e1cbf19fb7c6 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 4 Apr 2026 21:08:27 +0200 Subject: fix: intruction enum size regression Signed-off-by: Henry --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 2 +- crates/parser/src/lib.rs | 8 +------- crates/parser/src/visit.rs | 9 +++++++++ crates/tinywasm/src/func.rs | 2 +- crates/tinywasm/src/interpreter/executor.rs | 12 ++++++++---- crates/tinywasm/src/interpreter/mod.rs | 2 +- crates/types/src/instructions.rs | 4 ++-- 8 files changed, 35 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31bf822..3595466 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,9 +89,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.58" +version = "1.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" dependencies = [ "find-msvc-tools", "shlex", @@ -539,9 +539,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -726,9 +726,9 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.246.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1929aad146499e47362c876fcbcbb0363f730951d93438f511178626e999a8" +checksum = "61fb705ce81adde29d2a8e99d87995e39a6e927358c91398f374474746070ef7" dependencies = [ "leb128fmt", "wasmparser", @@ -746,9 +746,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.246.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d991c35d79bf8336dc1cd632ed4aacf0dc5fac4bc466c670625b037b972bb9c" +checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" dependencies = [ "bitflags", "indexmap", @@ -757,9 +757,9 @@ dependencies = [ [[package]] name = "wast" -version = "246.0.1" +version = "246.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf2d50bc7478dcca61d00df4dadf922ef46c5924db20a97e6daaf09fe1cb09" +checksum = "fe3fe8e3bf88ad96d031b4181ddbd64634b17cb0d06dfc3de589ef43591a9a62" dependencies = [ "bumpalo", "leb128fmt", @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "wat" -version = "1.246.1" +version = "1.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723f2473b47f738c12fc11c8e0bb8b27ce7cf9c78cf1a29dadbc2d34a2513292" +checksum = "4bd7fda1199b94fff395c2d19a153f05dbe7807630316fa9673367666fd2ad8c" dependencies = [ "wast", ] diff --git a/Cargo.toml b/Cargo.toml index f7d6ccb..22e206b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ version="0.9.0-alpha.0" rust-version="1.90" edition="2024" license="MIT OR Apache-2.0" -authors=["Henry Gressmann "] +authors=["Henry Gressmann "] repository="https://github.com/explodingcamera/tinywasm" categories=["wasm", "no-std"] keywords=["tinywasm"] diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index eabeeab..364209c 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -41,7 +41,7 @@ pub use tinywasm_types::TinyWasmModule; /// Parser optimization and lowering options. #[non_exhaustive] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct ParserOptions { // /// Enable control-flow graph cleanup rewrites. // pub cfg_cleanup: bool, @@ -51,12 +51,6 @@ pub struct ParserOptions { // pub tailcall_rewrite: bool, } -impl Default for ParserOptions { - fn default() -> Self { - Self {} - } -} - /// A WebAssembly parser #[derive(Debug, Default)] pub struct Parser { diff --git a/crates/parser/src/visit.rs b/crates/parser/src/visit.rs index 6e87a04..7da2d99 100644 --- a/crates/parser/src/visit.rs +++ b/crates/parser/src/visit.rs @@ -431,6 +431,10 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild let addr = self.instructions[len - 2]; let value = self.instructions[len - 1]; if let (Instruction::LocalGet32(addr_local), Instruction::LocalGet32(value_local)) = (addr, value) { + let (Ok(addr_local), Ok(value_local)) = (u8::try_from(addr_local), u8::try_from(value_local)) else { + self.instructions.push(Instruction::I32Store(memarg)); + return; + }; self.instructions.pop(); self.instructions.pop(); self.instructions.push(Instruction::I32StoreLocalLocal(memarg, addr_local, value_local)); @@ -626,6 +630,11 @@ impl<'a, R: WasmModuleResources> wasmparser::VisitOperator<'a> for FunctionBuild if let (Instruction::LocalGet32(addr_local), Instruction::I32Load(memarg)) = (addr, load) { match self.validator.get_operand_type(0) { Some(Some(wasmparser::ValType::I32)) | Some(Some(wasmparser::ValType::F32)) => { + let (Ok(addr_local), Ok(resolved_idx)) = (u8::try_from(addr_local), u8::try_from(resolved_idx)) + else { + self.instructions.push(Instruction::LocalTee32(resolved_idx)); + return; + }; self.instructions.pop(); self.instructions.pop(); self.instructions.push(Instruction::I32LoadLocalTee(memarg, addr_local, resolved_idx)); diff --git a/crates/tinywasm/src/func.rs b/crates/tinywasm/src/func.rs index fd1279f..75a094a 100644 --- a/crates/tinywasm/src/func.rs +++ b/crates/tinywasm/src/func.rs @@ -13,7 +13,7 @@ pub enum ExecProgress { Suspended, } -#[derive(Clone, Copy)] +#[derive(Clone)] #[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct ExecutionState { pub(crate) callframe: CallFrame, diff --git a/crates/tinywasm/src/interpreter/executor.rs b/crates/tinywasm/src/interpreter/executor.rs index 2292a70..bd2e31e 100644 --- a/crates/tinywasm/src/interpreter/executor.rs +++ b/crates/tinywasm/src/interpreter/executor.rs @@ -174,13 +174,17 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> { I64AddConst(c) => stack_op!(unary i64, |v| v.wrapping_add(*c)), I32StoreLocalLocal(m, addr_local, value_local) => { let mem = self.store.state.get_mem_mut(self.module.resolve_mem_addr(m.mem_addr())); - let addr = u64::from(self.store.stack.values.local_get::(&self.cf, *addr_local)); - let value = self.store.stack.values.local_get::(&self.cf, *value_local).to_mem_bytes(); + let addr_local = u16::from(*addr_local); + let value_local = u16::from(*value_local); + let addr = u64::from(self.store.stack.values.local_get::(&self.cf, addr_local)); + let value = self.store.stack.values.local_get::(&self.cf, value_local).to_mem_bytes(); mem.store((m.offset() + addr) as usize, value.len(), &value)?; } I32LoadLocalTee(m, addr_local, dst_local) => { let mem = self.store.state.get_mem(self.module.resolve_mem_addr(m.mem_addr())); - let addr = u64::from(self.store.stack.values.local_get::(&self.cf, *addr_local)); + let addr_local = u16::from(*addr_local); + let dst_local = u16::from(*dst_local); + let addr = u64::from(self.store.stack.values.local_get::(&self.cf, addr_local)); let Some(Ok(addr)) = m.offset().checked_add(addr).map(|a| a.try_into()) else { return Err(Error::Trap(Trap::MemoryOutOfBounds { offset: addr as usize, @@ -189,7 +193,7 @@ impl<'store, const BUDGETED: bool> Executor<'store, BUDGETED> { })); }; let value = mem.load_as::<4, i32>(addr)?; - self.store.stack.values.local_set(&self.cf, *dst_local, value); + self.store.stack.values.local_set(&self.cf, dst_local, value); self.store.stack.values.push(value)?; } I64XorRotlConst(c) => stack_op!(binary i64, |lhs, rhs| (lhs ^ rhs).rotate_left(*c as u32)), diff --git a/crates/tinywasm/src/interpreter/mod.rs b/crates/tinywasm/src/interpreter/mod.rs index 1af7d2f..1748175 100644 --- a/crates/tinywasm/src/interpreter/mod.rs +++ b/crates/tinywasm/src/interpreter/mod.rs @@ -11,7 +11,7 @@ use crate::{Result, Store, interpreter::stack::CallFrame}; pub(crate) use value128::*; pub(crate) use values::*; -#[derive(Clone, Copy)] +#[derive(Clone)] #[cfg_attr(feature = "debug", derive(Debug))] pub(crate) enum ExecState { Completed, diff --git a/crates/types/src/instructions.rs b/crates/types/src/instructions.rs index d013734..5e88cfa 100644 --- a/crates/types/src/instructions.rs +++ b/crates/types/src/instructions.rs @@ -56,8 +56,8 @@ pub enum Instruction { LocalCopy32(LocalAddr, LocalAddr), LocalCopy64(LocalAddr, LocalAddr), LocalCopy128(LocalAddr, LocalAddr), LocalCopyRef(LocalAddr, LocalAddr), I32AddLocals(LocalAddr, LocalAddr), I64AddLocals(LocalAddr, LocalAddr), I32AddConst(i32), I64AddConst(i64), - I32StoreLocalLocal(MemoryArg, LocalAddr, LocalAddr), - I32LoadLocalTee(MemoryArg, LocalAddr, LocalAddr), + I32StoreLocalLocal(MemoryArg, u8, u8), + I32LoadLocalTee(MemoryArg, u8, u8), I64XorRotlConst(i64), I64XorRotlConstTee(i64, LocalAddr), // > Control Instructions (jump-oriented, lowered from structured control during parsing) -- cgit v1.3.1