From 065dc608ab25030d1719fef4dd55271c95245884 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 3 Apr 2026 17:24:38 +0200 Subject: chore: put debug impl behind feature flag, cleanup Signed-off-by: Henry --- README.md | 2 +- crates/tinywasm/Cargo.toml | 5 +- crates/tinywasm/src/engine.rs | 7 +-- crates/tinywasm/src/error.rs | 2 +- crates/tinywasm/src/func.rs | 5 +- crates/tinywasm/src/imports.rs | 5 +- crates/tinywasm/src/instance.rs | 5 +- crates/tinywasm/src/interpreter/mod.rs | 6 ++- .../tinywasm/src/interpreter/stack/call_stack.rs | 8 +-- crates/tinywasm/src/interpreter/stack/mod.rs | 2 +- .../tinywasm/src/interpreter/stack/value_stack.rs | 4 +- crates/tinywasm/src/module.rs | 3 +- crates/tinywasm/src/reference.rs | 4 +- crates/tinywasm/src/store/data.rs | 8 ++- crates/tinywasm/src/store/element.rs | 7 ++- crates/tinywasm/src/store/global.rs | 7 ++- crates/tinywasm/src/store/memory.rs | 24 +++------ crates/tinywasm/src/store/mod.rs | 46 ++++++++-------- crates/tinywasm/src/store/table.rs | 18 +++---- crates/types/Cargo.toml | 3 +- crates/types/src/instructions.rs | 9 ++-- crates/types/src/lib.rs | 63 ++++++++++++++-------- crates/types/src/value.rs | 3 +- 23 files changed, 136 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index 29b019f..66f0c5d 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Safety wise, TinyWasm doesn't use any unsafe code and is designed to be complete | [**Custom Page Sizes**](https://github.com/WebAssembly/custom-page-sizes/blob/main/proposals/custom-page-sizes/Overview.md) | 🟢 | `next` | | [**Tail Call**](https://github.com/WebAssembly/tail-call/blob/main/proposals/tail-call/Overview.md) | 🟢 | `next` | | [**Memory64**](https://github.com/WebAssembly/memory64/blob/master/proposals/memory64/Overview.md) | 🟢 | `next` | -| [**Fixed-Width SIMD**](https://github.com/webassembly/simd) | 🚧 | N/A | +| [**Fixed-Width SIMD**](https://github.com/webassembly/simd) | 🟢 | `next` | ## Usage diff --git a/crates/tinywasm/Cargo.toml b/crates/tinywasm/Cargo.toml index f0f8ab0..b89c907 100644 --- a/crates/tinywasm/Cargo.toml +++ b/crates/tinywasm/Cargo.toml @@ -34,7 +34,7 @@ serde_json.workspace=true serde.workspace=true [features] -default=["std", "parser", "log", "archive", "canonicalize_nans"] +default=["std", "parser", "log", "archive", "canonicalize_nans", "debug"] log=["dep:log", "tinywasm-parser?/log", "tinywasm-types/log"] std=["tinywasm-parser?/std", "tinywasm-types/std"] @@ -48,6 +48,9 @@ archive=["tinywasm-types/archive"] # canonicalize all NaN values to a single representation canonicalize_nans=[] +# derive Debug for runtime/types structs +debug=["tinywasm-types/debug"] + [[test]] name="test-wasm-1" harness=false diff --git a/crates/tinywasm/src/engine.rs b/crates/tinywasm/src/engine.rs index 80936bf..8b938c5 100644 --- a/crates/tinywasm/src/engine.rs +++ b/crates/tinywasm/src/engine.rs @@ -40,9 +40,9 @@ pub(crate) struct EngineInner { } /// Fuel accounting policy for budgeted execution. -#[derive(Debug, Clone, Copy)] #[non_exhaustive] -#[derive(Default)] +#[derive(Default, Clone, Copy)] +#[cfg_attr(feature = "debug", derive(Debug))] pub enum FuelPolicy { /// Charge one fuel unit per retired instruction. #[default] @@ -67,7 +67,8 @@ pub const DEFAULT_VALUE_STACK_REF_SIZE: usize = 4 * 1024; // 4k slots pub const DEFAULT_CALL_STACK_SIZE: usize = 2048; // 1024 frames /// Configuration for the WebAssembly interpreter -#[derive(Debug, Clone)] +#[derive(Clone)] +#[cfg_attr(feature = "debug", derive(Debug))] #[non_exhaustive] pub struct Config { /// Initial size of the 32-bit value stack (i32, f32 values). diff --git a/crates/tinywasm/src/error.rs b/crates/tinywasm/src/error.rs index 24912e3..4844e48 100644 --- a/crates/tinywasm/src/error.rs +++ b/crates/tinywasm/src/error.rs @@ -8,7 +8,7 @@ use tinywasm_types::archive::TwasmError; pub use tinywasm_parser::ParseError; /// Errors that can occur for `TinyWasm` operations -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] #[non_exhaustive] pub enum Error { /// A WebAssembly trap occurred diff --git a/crates/tinywasm/src/func.rs b/crates/tinywasm/src/func.rs index 74610f5..b75a6de 100644 --- a/crates/tinywasm/src/func.rs +++ b/crates/tinywasm/src/func.rs @@ -13,7 +13,8 @@ pub enum ExecProgress { Suspended, } -#[derive(Debug, Clone, Copy)] +#[derive(Clone, Copy)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct ExecutionState { pub(crate) callframe: CallFrame, } @@ -33,7 +34,7 @@ pub struct FuncExecution<'store> { state: FuncExecutionState, } -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] enum FuncExecutionState { Running { exec_state: ExecutionState, root_func_addr: u32 }, Completed { result: Option> }, diff --git a/crates/tinywasm/src/imports.rs b/crates/tinywasm/src/imports.rs index 7ce9f40..fc5bf37 100644 --- a/crates/tinywasm/src/imports.rs +++ b/crates/tinywasm/src/imports.rs @@ -10,7 +10,8 @@ use crate::{LinkingError, MemoryRef, MemoryRefMut, Result, log}; use tinywasm_types::*; /// The internal representation of a function -#[derive(Debug, Clone)] +#[derive(Clone)] +#[cfg_attr(feature = "debug", derive(Debug))] pub enum Function { /// A host function Host(Rc), @@ -49,7 +50,7 @@ impl HostFunction { pub(crate) type HostFuncInner = Box, &[WasmValue]) -> Result>>; /// The context of a host-function call -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub struct FuncContext<'a> { pub(crate) store: &'a mut crate::Store, pub(crate) module_addr: ModuleInstanceAddr, diff --git a/crates/tinywasm/src/instance.rs b/crates/tinywasm/src/instance.rs index 340bfd6..2782402 100644 --- a/crates/tinywasm/src/instance.rs +++ b/crates/tinywasm/src/instance.rs @@ -10,11 +10,12 @@ use crate::{Error, FuncHandle, FuncHandleTyped, Imports, MemoryRef, MemoryRefMut /// Backed by an Rc, so cloning is cheap /// /// See -#[derive(Debug, Clone)] +#[derive(Clone)] +#[cfg_attr(feature = "debug", derive(Debug))] pub struct ModuleInstance(pub(crate) Rc); #[expect(dead_code)] -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct ModuleInstanceInner { pub(crate) failed_to_instantiate: bool, diff --git a/crates/tinywasm/src/interpreter/mod.rs b/crates/tinywasm/src/interpreter/mod.rs index 8c3a840..933e782 100644 --- a/crates/tinywasm/src/interpreter/mod.rs +++ b/crates/tinywasm/src/interpreter/mod.rs @@ -11,7 +11,8 @@ use crate::{Result, Store, interpreter::stack::CallFrame}; pub(crate) use value128::*; pub(crate) use values::*; -#[derive(Debug, Clone, Copy)] +#[derive(Clone, Copy)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) enum ExecState { Completed, Suspended(CallFrame), @@ -20,7 +21,8 @@ pub(crate) enum ExecState { /// The main `TinyWasm` runtime. /// /// This is the default runtime used by `TinyWasm`. -#[derive(Debug, Default)] +#[derive(Default)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct InterpreterRuntime; impl InterpreterRuntime { diff --git a/crates/tinywasm/src/interpreter/stack/call_stack.rs b/crates/tinywasm/src/interpreter/stack/call_stack.rs index 133f910..4f3ace1 100644 --- a/crates/tinywasm/src/interpreter/stack/call_stack.rs +++ b/crates/tinywasm/src/interpreter/stack/call_stack.rs @@ -3,7 +3,7 @@ use crate::{Result, Trap, unlikely}; use alloc::vec::Vec; use tinywasm_types::{FuncAddr, ModuleInstanceAddr, ValueCountsSmall}; -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct CallStack { stack: Vec, } @@ -32,7 +32,8 @@ impl CallStack { } } -#[derive(Debug, Clone, Copy, Default)] +#[derive(Clone, Copy, Default)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct CallFrame { pub(crate) instr_ptr: u32, pub(crate) module_addr: ModuleInstanceAddr, @@ -41,7 +42,8 @@ pub(crate) struct CallFrame { pub(crate) stack_offset: ValueCountsSmall, } -#[derive(Debug, Clone, Copy, Default)] +#[derive(Clone, Copy, Default)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct StackBase { pub(crate) s32: u32, pub(crate) s64: u32, diff --git a/crates/tinywasm/src/interpreter/stack/mod.rs b/crates/tinywasm/src/interpreter/stack/mod.rs index 59456d3..bb18fd3 100644 --- a/crates/tinywasm/src/interpreter/stack/mod.rs +++ b/crates/tinywasm/src/interpreter/stack/mod.rs @@ -7,7 +7,7 @@ pub(crate) use value_stack::ValueStack; use crate::engine::Config; /// A WebAssembly Stack -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct Stack { pub(crate) values: ValueStack, pub(crate) call_stack: CallStack, diff --git a/crates/tinywasm/src/interpreter/stack/value_stack.rs b/crates/tinywasm/src/interpreter/stack/value_stack.rs index 7fa0502..395f0a4 100644 --- a/crates/tinywasm/src/interpreter/stack/value_stack.rs +++ b/crates/tinywasm/src/interpreter/stack/value_stack.rs @@ -6,7 +6,7 @@ use crate::{Result, Trap, engine::Config, interpreter::*, unlikely}; use super::{CallFrame, StackBase}; -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct ValueStack { pub(crate) stack_32: Stack, pub(crate) stack_64: Stack, @@ -14,7 +14,7 @@ pub(crate) struct ValueStack { pub(crate) stack_ref: Stack, } -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct Stack { data: Box<[T]>, len: usize, diff --git a/crates/tinywasm/src/module.rs b/crates/tinywasm/src/module.rs index e0685eb..d6c5210 100644 --- a/crates/tinywasm/src/module.rs +++ b/crates/tinywasm/src/module.rs @@ -4,7 +4,8 @@ use tinywasm_types::TinyWasmModule; /// A WebAssembly Module /// /// See -#[derive(Debug, Clone)] +#[derive(Clone)] +#[cfg_attr(feature = "debug", derive(Debug))] pub struct Module(pub(crate) alloc::sync::Arc); impl From<&TinyWasmModule> for Module { diff --git a/crates/tinywasm/src/reference.rs b/crates/tinywasm/src/reference.rs index 790c313..7901e57 100644 --- a/crates/tinywasm/src/reference.rs +++ b/crates/tinywasm/src/reference.rs @@ -8,11 +8,11 @@ use crate::{MemoryInstance, Result}; // This module essentially contains the public APIs to interact with the data stored in the store /// A reference to a memory instance -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub struct MemoryRef<'a>(pub(crate) &'a MemoryInstance); /// A borrowed reference to a memory instance -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub struct MemoryRefMut<'a>(pub(crate) &'a mut MemoryInstance); impl MemoryRefLoad for MemoryRef<'_> { diff --git a/crates/tinywasm/src/store/data.rs b/crates/tinywasm/src/store/data.rs index 935e761..fe6c4e7 100644 --- a/crates/tinywasm/src/store/data.rs +++ b/crates/tinywasm/src/store/data.rs @@ -1,18 +1,16 @@ use alloc::vec::Vec; -use tinywasm_types::*; /// A WebAssembly Data Instance /// /// See -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct DataInstance { pub(crate) data: Option>, - pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances } impl DataInstance { - pub(crate) fn new(data: Option>, owner: ModuleInstanceAddr) -> Self { - Self { data, _owner: owner } + pub(crate) fn new(data: Option>) -> Self { + Self { data } } pub(crate) fn drop(&mut self) { diff --git a/crates/tinywasm/src/store/element.rs b/crates/tinywasm/src/store/element.rs index 40301a5..c643f80 100644 --- a/crates/tinywasm/src/store/element.rs +++ b/crates/tinywasm/src/store/element.rs @@ -5,16 +5,15 @@ use tinywasm_types::*; /// A WebAssembly Element Instance /// /// See -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct ElementInstance { pub(crate) kind: ElementKind, pub(crate) items: Option>, // none is the element was dropped - pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances } impl ElementInstance { - pub(crate) fn new(kind: ElementKind, owner: ModuleInstanceAddr, items: Option>) -> Self { - Self { kind, _owner: owner, items } + pub(crate) fn new(kind: ElementKind, items: Option>) -> Self { + Self { kind, items } } pub(crate) fn drop(&mut self) { diff --git a/crates/tinywasm/src/store/global.rs b/crates/tinywasm/src/store/global.rs index b7a47d6..95af73f 100644 --- a/crates/tinywasm/src/store/global.rs +++ b/crates/tinywasm/src/store/global.rs @@ -5,15 +5,14 @@ use tinywasm_types::*; /// A WebAssembly Global Instance /// /// See -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct GlobalInstance { pub(crate) value: Cell, pub(crate) ty: GlobalType, - pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances } impl GlobalInstance { - pub(crate) fn new(ty: GlobalType, value: TinyWasmValue, owner: ModuleInstanceAddr) -> Self { - Self { ty, value: value.into(), _owner: owner } + pub(crate) fn new(ty: GlobalType, value: TinyWasmValue) -> Self { + Self { ty, value: value.into() } } } diff --git a/crates/tinywasm/src/store/memory.rs b/crates/tinywasm/src/store/memory.rs index a0c5c69..d20fac0 100644 --- a/crates/tinywasm/src/store/memory.rs +++ b/crates/tinywasm/src/store/memory.rs @@ -1,31 +1,24 @@ use alloc::vec; use alloc::vec::Vec; -use tinywasm_types::{MemoryArch, MemoryType, ModuleInstanceAddr}; +use tinywasm_types::{MemoryArch, MemoryType}; use crate::{Error, Result, cold, interpreter::Value128, log}; /// A WebAssembly Memory Instance /// /// See -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct MemoryInstance { pub(crate) kind: MemoryType, pub(crate) data: Vec, pub(crate) page_count: usize, - pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances } impl MemoryInstance { - pub(crate) fn new(kind: MemoryType, owner: ModuleInstanceAddr) -> Self { + pub(crate) fn new(kind: MemoryType) -> Self { assert!(kind.page_count_initial() <= kind.page_count_max()); log::debug!("initializing memory with {} pages of {} bytes", kind.page_count_initial(), kind.page_size()); - - Self { - kind, - data: vec![0; kind.initial_size() as usize], - page_count: kind.page_count_initial() as usize, - _owner: owner, - } + Self { kind, data: vec![0; kind.initial_size() as usize], page_count: kind.page_count_initial() as usize } } pub(crate) const fn is_64bit(&self) -> bool { @@ -189,8 +182,7 @@ mod memory_instance_tests { fn create_test_memory() -> MemoryInstance { let kind = MemoryType::new(MemoryArch::I32, 1, Some(2), None); - let owner = ModuleInstanceAddr::default(); - MemoryInstance::new(kind, owner) + MemoryInstance::new(kind) } #[test] @@ -269,8 +261,7 @@ mod memory_instance_tests { #[test] fn test_memory_custom_page_size_out_of_bounds() { let kind = MemoryType::new(MemoryArch::I32, 1, Some(2), Some(1)); - let owner = ModuleInstanceAddr::default(); - let mut memory = MemoryInstance::new(kind, owner); + let mut memory = MemoryInstance::new(kind); let data_to_store = [1, 2]; assert!(memory.store(0, data_to_store.len(), &data_to_store).is_err()); @@ -279,8 +270,7 @@ mod memory_instance_tests { #[test] fn test_memory_custom_page_size_grow() { let kind = MemoryType::new(MemoryArch::I32, 1, Some(2), Some(1)); - let owner = ModuleInstanceAddr::default(); - let mut memory = MemoryInstance::new(kind, owner); + let mut memory = MemoryInstance::new(kind); assert_eq!(memory.grow(1), Some(1)); diff --git a/crates/tinywasm/src/store/mod.rs b/crates/tinywasm/src/store/mod.rs index b409a0c..8100faf 100644 --- a/crates/tinywasm/src/store/mod.rs +++ b/crates/tinywasm/src/store/mod.rs @@ -266,22 +266,22 @@ impl Store { } /// Add tables to the store, returning their addresses in the store - pub(crate) fn init_tables(&mut self, tables: &[TableType], idx: ModuleInstanceAddr) -> Result> { + pub(crate) fn init_tables(&mut self, tables: &[TableType], _idx: ModuleInstanceAddr) -> Result> { let table_count = self.state.tables.len(); let mut table_addrs = Vec::with_capacity(table_count); for (i, table) in tables.iter().enumerate() { - self.state.tables.push(TableInstance::new(table.clone(), idx)); + self.state.tables.push(TableInstance::new(table.clone())); table_addrs.push((i + table_count) as TableAddr); } Ok(table_addrs) } /// Add memories to the store, returning their addresses in the store - pub(crate) fn init_memories(&mut self, memories: &[MemoryType], idx: ModuleInstanceAddr) -> Result> { + pub(crate) fn init_memories(&mut self, memories: &[MemoryType], _idx: ModuleInstanceAddr) -> Result> { let mem_count = self.state.memories.len(); let mut mem_addrs = Vec::with_capacity(mem_count); for (i, mem) in memories.iter().enumerate() { - self.state.memories.push(MemoryInstance::new(*mem, idx)); + self.state.memories.push(MemoryInstance::new(*mem)); mem_addrs.push((i + mem_count) as MemAddr); } Ok(mem_addrs) @@ -293,18 +293,15 @@ impl Store { mut imported_globals: Vec, new_globals: &[Global], func_addrs: &[FuncAddr], - idx: ModuleInstanceAddr, + _idx: ModuleInstanceAddr, ) -> Result> { let global_count = self.state.globals.len(); imported_globals.reserve_exact(new_globals.len()); let mut global_addrs = imported_globals; for (i, global) in new_globals.iter().enumerate() { - self.state.globals.push(GlobalInstance::new( - global.ty, - self.eval_const(&global.init, &global_addrs, func_addrs)?, - idx, - )); + let value = self.eval_const(&global.init, &global_addrs, func_addrs)?; + self.state.globals.push(GlobalInstance::new(global.ty, value)); global_addrs.push((i + global_count) as Addr); } @@ -342,7 +339,7 @@ impl Store { func_addrs: &[FuncAddr], global_addrs: &[Addr], elements: &[Element], - idx: ModuleInstanceAddr, + _idx: ModuleInstanceAddr, ) -> Result<(Box<[Addr]>, Option)> { let elem_count = self.state.elements.len(); let mut elem_addrs = Vec::with_capacity(elem_count); @@ -386,7 +383,7 @@ impl Store { } }; - self.state.elements.push(ElementInstance::new(element.kind, idx, items)); + self.state.elements.push(ElementInstance::new(element.kind, items)); elem_addrs.push((i + elem_count) as Addr); } @@ -399,7 +396,7 @@ impl Store { &mut self, mem_addrs: &[MemAddr], data: &[Data], - idx: ModuleInstanceAddr, + _idx: ModuleInstanceAddr, ) -> Result<(Box<[Addr]>, Option)> { let data_count = self.state.data.len(); let mut data_addrs = Vec::with_capacity(data_count); @@ -424,7 +421,7 @@ impl Store { tinywasm_types::DataKind::Passive => Some(data.data.to_vec()), }; - self.state.data.push(DataInstance::new(data_val, idx)); + self.state.data.push(DataInstance::new(data_val)); data_addrs.push((i + data_count) as Addr); } @@ -432,21 +429,26 @@ impl Store { Ok((data_addrs.into_boxed_slice(), None)) } - pub(crate) fn add_global(&mut self, ty: GlobalType, value: TinyWasmValue, idx: ModuleInstanceAddr) -> Result { - self.state.globals.push(GlobalInstance::new(ty, value, idx)); + pub(crate) fn add_global( + &mut self, + ty: GlobalType, + value: TinyWasmValue, + _idx: ModuleInstanceAddr, + ) -> Result { + self.state.globals.push(GlobalInstance::new(ty, value)); Ok(self.state.globals.len() as Addr - 1) } - pub(crate) fn add_table(&mut self, table: TableType, idx: ModuleInstanceAddr) -> Result { - self.state.tables.push(TableInstance::new(table, idx)); + pub(crate) fn add_table(&mut self, table: TableType, _idx: ModuleInstanceAddr) -> Result { + self.state.tables.push(TableInstance::new(table)); Ok(self.state.tables.len() as TableAddr - 1) } - pub(crate) fn add_mem(&mut self, mem: MemoryType, idx: ModuleInstanceAddr) -> Result { + pub(crate) fn add_mem(&mut self, mem: MemoryType, _idx: ModuleInstanceAddr) -> Result { if let MemoryArch::I64 = mem.arch() { return Err(Error::UnsupportedFeature("64-bit memories".to_string())); } - self.state.memories.push(MemoryInstance::new(mem, idx)); + self.state.memories.push(MemoryInstance::new(mem)); Ok(self.state.memories.len() as MemAddr - 1) } @@ -463,9 +465,9 @@ impl Store { ConstInstruction::GlobalGet(addr) => match self.state.globals[addr as usize].value.get() { TinyWasmValue::Value32(i) => i64::from(i), TinyWasmValue::Value64(i) => i as i64, - o => return Err(Error::Other(format!("expected i32 or i64, got {o:?}"))), + other => return Err(Error::Other(format!("expected i32 or i64, got {other:?}"))), }, - o => return Err(Error::Other(format!("expected i32, got {o:?}"))), + other => return Err(Error::Other(format!("expected i32, got {other:?}"))), }) } diff --git a/crates/tinywasm/src/store/table.rs b/crates/tinywasm/src/store/table.rs index bc4429d..627e886 100644 --- a/crates/tinywasm/src/store/table.rs +++ b/crates/tinywasm/src/store/table.rs @@ -8,16 +8,15 @@ const MAX_TABLE_SIZE: u32 = 10_000_000; /// A WebAssembly Table Instance /// /// See -#[derive(Debug)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) struct TableInstance { pub(crate) elements: Vec, pub(crate) kind: TableType, - pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances } impl TableInstance { - pub(crate) fn new(kind: TableType, owner: ModuleInstanceAddr) -> Self { - Self { elements: vec![TableElement::Uninitialized; kind.size_initial as usize], kind, _owner: owner } + pub(crate) fn new(kind: TableType) -> Self { + Self { elements: vec![TableElement::Uninitialized; kind.size_initial as usize], kind } } #[inline(never)] @@ -150,7 +149,8 @@ impl TableInstance { } } -#[derive(Debug, Clone, Copy)] +#[derive(Clone, Copy)] +#[cfg_attr(feature = "debug", derive(Debug))] pub(crate) enum TableElement { Uninitialized, Initialized(TableAddr), @@ -193,14 +193,14 @@ mod tests { #[test] fn test_table_instance_creation() { let kind = dummy_table_type(); - let table_instance = TableInstance::new(kind.clone(), 0); + let table_instance = TableInstance::new(kind.clone()); assert_eq!(table_instance.size(), kind.size_initial as i32, "Table instance creation failed: size mismatch"); } #[test] fn test_get_wasm_val() { let kind = dummy_table_type(); - let mut table_instance = TableInstance::new(kind, 0); + let mut table_instance = TableInstance::new(kind); table_instance.set(0, TableElement::Initialized(0)).expect("Setting table element failed"); table_instance.set(1, TableElement::Uninitialized).expect("Setting table element failed"); @@ -224,7 +224,7 @@ mod tests { #[test] fn test_set_and_get() { let kind = dummy_table_type(); - let mut table_instance = TableInstance::new(kind, 0); + let mut table_instance = TableInstance::new(kind); let result = table_instance.set(0, TableElement::Initialized(1)); assert!(result.is_ok(), "Setting table element failed"); @@ -239,7 +239,7 @@ mod tests { #[test] fn test_table_init() { let kind = dummy_table_type(); - let mut table_instance = TableInstance::new(kind, 0); + let mut table_instance = TableInstance::new(kind); let init_elements = vec![TableElement::Initialized(0); 5]; let result = table_instance.init(0, &init_elements); diff --git a/crates/types/Cargo.toml b/crates/types/Cargo.toml index 5efcb8b..94832c1 100644 --- a/crates/types/Cargo.toml +++ b/crates/types/Cargo.toml @@ -16,8 +16,9 @@ postcard={version="1.1", optional=true, default-features=false, features=["alloc serde={version="1.0", optional=true, default-features=false, features=["alloc"]} [features] -default=["std", "log", "archive"] +default=["std", "log", "archive", "debug"] std=["serde?/std"] archive=["dep:postcard", "dep:serde"] log=["dep:log"] +debug=[] diff --git a/crates/types/src/instructions.rs b/crates/types/src/instructions.rs index 29c9cab..1165c06 100644 --- a/crates/types/src/instructions.rs +++ b/crates/types/src/instructions.rs @@ -2,7 +2,8 @@ use super::{FuncAddr, GlobalAddr, LocalAddr, TableAddr, TypeAddr, ValType, Value use crate::{ConstIdx, DataAddr, ElemAddr, ExternAddr, MemAddr}; /// Represents a memory immediate in a WebAssembly memory instruction. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] #[repr(Rust, packed)] pub struct MemoryArg { @@ -27,7 +28,8 @@ impl MemoryArg { } } -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ConstInstruction { I32Const(i32), @@ -46,7 +48,8 @@ pub enum ConstInstruction { /// Wasm Bytecode can map to multiple of these instructions. /// /// See -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] #[rustfmt::skip] pub enum Instruction { diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs index 7112834..78b83d0 100644 --- a/crates/types/src/lib.rs +++ b/crates/types/src/lib.rs @@ -65,7 +65,8 @@ pub mod archive { /// This is the internal representation of a WebAssembly module in `TinyWasm`. /// `TinyWasmModules` are validated before being created, so they are guaranteed to be valid (as long as they were created by `TinyWasm`). /// This means you should not trust a `TinyWasmModule` created by a third party to be valid. -#[derive(Debug, Clone, Default, PartialEq)] +#[derive(Clone, Default, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct TinyWasmModule { /// Optional address of the start function @@ -122,7 +123,8 @@ pub struct TinyWasmModule { /// A WebAssembly External Kind. /// /// See -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ExternalKind { /// A WebAssembly Function. @@ -160,7 +162,8 @@ pub type ModuleInstanceAddr = Addr; /// A WebAssembly External Value. /// /// See -#[derive(Debug, Clone)] +#[derive(Clone)] +#[cfg_attr(feature = "debug", derive(Debug))] pub enum ExternVal { Func(FuncAddr), Table(TableAddr), @@ -193,14 +196,16 @@ impl ExternVal { /// The type of a WebAssembly Function. /// /// See -#[derive(Debug, Clone, PartialEq, Eq, Default)] +#[derive(Clone, PartialEq, Eq, Default)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct FuncType { pub params: Box<[ValType]>, pub results: Box<[ValType]>, } -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +#[derive(Default, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct ValueCounts { pub c32: u32, @@ -209,7 +214,8 @@ pub struct ValueCounts { pub cref: u32, } -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +#[derive(Default, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct ValueCountsSmall { pub c32: u16, @@ -250,7 +256,8 @@ impl<'a, T: IntoIterator> From for ValueCountsSmall { } } -#[derive(Debug, Clone, PartialEq, Default)] +#[derive(Clone, PartialEq, Default)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct WasmFunction { pub instructions: ArcSlice, @@ -306,14 +313,16 @@ impl<'de, T: serde::Deserialize<'de> + Debug> serde::Deserialize<'de> for ArcSli } } -#[derive(Debug, Clone, PartialEq, Eq, Default)] +#[derive(Clone, PartialEq, Eq, Default)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct WasmFunctionData { pub v128_constants: Box<[i128]>, } /// A WebAssembly Module Export -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct Export { /// The name of the export. @@ -324,21 +333,24 @@ pub struct Export { pub index: u32, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct Global { pub ty: GlobalType, pub init: ConstInstruction, } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct GlobalType { pub mutable: bool, pub ty: ValType, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct TableType { pub element_type: ValType, @@ -357,7 +369,8 @@ impl TableType { } /// Represents a memory's type. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Copy, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct MemoryType { arch: MemoryArch, @@ -407,14 +420,16 @@ impl MemoryType { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +#[derive(Copy, Clone, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum MemoryArch { I32, I64, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct Import { pub module: Box, @@ -422,7 +437,8 @@ pub struct Import { pub kind: ImportKind, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ImportKind { Function(TypeAddr), @@ -442,7 +458,8 @@ impl From<&ImportKind> for ExternalKind { } } -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct Data { pub data: Box<[u8]>, @@ -450,14 +467,16 @@ pub struct Data { pub kind: DataKind, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum DataKind { Active { mem: MemAddr, offset: ConstInstruction }, Passive, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub struct Element { pub kind: ElementKind, @@ -466,7 +485,8 @@ pub struct Element { pub ty: ValType, } -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ElementKind { Passive, @@ -474,7 +494,8 @@ pub enum ElementKind { Declared, } -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ElementItem { Func(FuncAddr), diff --git a/crates/types/src/value.rs b/crates/types/src/value.rs index 7b58948..afaa0d3 100644 --- a/crates/types/src/value.rs +++ b/crates/types/src/value.rs @@ -299,7 +299,8 @@ impl WasmValue { } /// Type of a WebAssembly value. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "debug", derive(Debug))] #[cfg_attr(feature = "archive", derive(serde::Serialize, serde::Deserialize))] pub enum ValType { /// A 32-bit integer. -- cgit v1.3.1