summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock24
-rw-r--r--Cargo.toml2
-rw-r--r--crates/parser/src/lib.rs8
-rw-r--r--crates/parser/src/visit.rs9
-rw-r--r--crates/tinywasm/src/func.rs2
-rw-r--r--crates/tinywasm/src/interpreter/executor.rs12
-rw-r--r--crates/tinywasm/src/interpreter/mod.rs2
-rw-r--r--crates/types/src/instructions.rs4
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 <mail@henrygressmann.de>"]
+authors=["Henry Gressmann <crates@henrygressmann.de>"]
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<T> {
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::<u32>(&self.cf, *addr_local));
- let value = self.store.stack.values.local_get::<u32>(&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::<u32>(&self.cf, addr_local));
+ let value = self.store.stack.values.local_get::<u32>(&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::<u32>(&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::<u32>(&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)