summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--crates/tinywasm/Cargo.toml5
-rw-r--r--crates/tinywasm/src/engine.rs7
-rw-r--r--crates/tinywasm/src/error.rs2
-rw-r--r--crates/tinywasm/src/func.rs5
-rw-r--r--crates/tinywasm/src/imports.rs5
-rw-r--r--crates/tinywasm/src/instance.rs5
-rw-r--r--crates/tinywasm/src/interpreter/mod.rs6
-rw-r--r--crates/tinywasm/src/interpreter/stack/call_stack.rs8
-rw-r--r--crates/tinywasm/src/interpreter/stack/mod.rs2
-rw-r--r--crates/tinywasm/src/interpreter/stack/value_stack.rs4
-rw-r--r--crates/tinywasm/src/module.rs3
-rw-r--r--crates/tinywasm/src/reference.rs4
-rw-r--r--crates/tinywasm/src/store/data.rs8
-rw-r--r--crates/tinywasm/src/store/element.rs7
-rw-r--r--crates/tinywasm/src/store/global.rs7
-rw-r--r--crates/tinywasm/src/store/memory.rs24
-rw-r--r--crates/tinywasm/src/store/mod.rs46
-rw-r--r--crates/tinywasm/src/store/table.rs18
-rw-r--r--crates/types/Cargo.toml3
-rw-r--r--crates/types/src/instructions.rs9
-rw-r--r--crates/types/src/lib.rs63
-rw-r--r--crates/types/src/value.rs3
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<T> {
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<Vec<WasmValue>> },
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<HostFunction>),
@@ -49,7 +50,7 @@ impl HostFunction {
pub(crate) type HostFuncInner = Box<dyn Fn(FuncContext<'_>, &[WasmValue]) -> Result<Vec<WasmValue>>>;
/// 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 <https://webassembly.github.io/spec/core/exec/runtime.html#module-instances>
-#[derive(Debug, Clone)]
+#[derive(Clone)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub struct ModuleInstance(pub(crate) Rc<ModuleInstanceInner>);
#[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<CallFrame>,
}
@@ -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<Value32>,
pub(crate) stack_64: Stack<Value64>,
@@ -14,7 +14,7 @@ pub(crate) struct ValueStack {
pub(crate) stack_ref: Stack<ValueRef>,
}
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct Stack<T: Copy + Default> {
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 <https://webassembly.github.io/spec/core/syntax/modules.html#syntax-module>
-#[derive(Debug, Clone)]
+#[derive(Clone)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub struct Module(pub(crate) alloc::sync::Arc<TinyWasmModule>);
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 <https://webassembly.github.io/spec/core/exec/runtime.html#data-instances>
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct DataInstance {
pub(crate) data: Option<Vec<u8>>,
- pub(crate) _owner: ModuleInstanceAddr, // index into store.module_instances
}
impl DataInstance {
- pub(crate) fn new(data: Option<Vec<u8>>, owner: ModuleInstanceAddr) -> Self {
- Self { data, _owner: owner }
+ pub(crate) fn new(data: Option<Vec<u8>>) -> 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 <https://webassembly.github.io/spec/core/exec/runtime.html#element-instances>
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct ElementInstance {
pub(crate) kind: ElementKind,
pub(crate) items: Option<Vec<TableElement>>, // 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<Vec<TableElement>>) -> Self {
- Self { kind, _owner: owner, items }
+ pub(crate) fn new(kind: ElementKind, items: Option<Vec<TableElement>>) -> 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 <https://webassembly.github.io/spec/core/exec/runtime.html#global-instances>
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct GlobalInstance {
pub(crate) value: Cell<TinyWasmValue>,
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 <https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances>
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct MemoryInstance {
pub(crate) kind: MemoryType,
pub(crate) data: Vec<u8>,
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<Vec<TableAddr>> {
+ pub(crate) fn init_tables(&mut self, tables: &[TableType], _idx: ModuleInstanceAddr) -> Result<Vec<TableAddr>> {
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<Vec<MemAddr>> {
+ pub(crate) fn init_memories(&mut self, memories: &[MemoryType], _idx: ModuleInstanceAddr) -> Result<Vec<MemAddr>> {
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<GlobalAddr>,
new_globals: &[Global],
func_addrs: &[FuncAddr],
- idx: ModuleInstanceAddr,
+ _idx: ModuleInstanceAddr,
) -> Result<Vec<Addr>> {
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<Trap>)> {
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<Trap>)> {
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<Addr> {
- self.state.globals.push(GlobalInstance::new(ty, value, idx));
+ pub(crate) fn add_global(
+ &mut self,
+ ty: GlobalType,
+ value: TinyWasmValue,
+ _idx: ModuleInstanceAddr,
+ ) -> Result<Addr> {
+ 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<TableAddr> {
- self.state.tables.push(TableInstance::new(table, idx));
+ pub(crate) fn add_table(&mut self, table: TableType, _idx: ModuleInstanceAddr) -> Result<TableAddr> {
+ 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<MemAddr> {
+ pub(crate) fn add_mem(&mut self, mem: MemoryType, _idx: ModuleInstanceAddr) -> Result<MemAddr> {
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 <https://webassembly.github.io/spec/core/exec/runtime.html#table-instances>
-#[derive(Debug)]
+#[cfg_attr(feature = "debug", derive(Debug))]
pub(crate) struct TableInstance {
pub(crate) elements: Vec<TableElement>,
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 <https://webassembly.github.io/spec/core/binary/instructions.html>
-#[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 <https://webassembly.github.io/spec/core/syntax/types.html#external-types>
-#[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 <https://webassembly.github.io/spec/core/exec/runtime.html#external-values>
-#[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 <https://webassembly.github.io/spec/core/syntax/types.html#function-types>
-#[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<Item = &'a ValType>> From<T> 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<Instruction>,
@@ -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<str>,
@@ -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.