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 --- 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 ++-- 6 files changed, 22 insertions(+), 15 deletions(-) (limited to 'crates') 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