diff options
| author | Henry <mail@henrygressmann.de> | 2026-04-05 18:39:48 +0200 |
|---|---|---|
| committer | Henry <mail@henrygressmann.de> | 2026-04-05 18:39:48 +0200 |
| commit | 786152d4ac0751cb130e7a138c5d47394927965a (patch) | |
| tree | b6033963f3e9f7d1a03ed9c7a4e5842bd33501cf /crates/parser/src/module.rs | |
| parent | e8f3d33c7f2b08806bfe14699a936e518fd3630b (diff) | |
chore: refactor optimizer/add more superinstructions
Signed-off-by: Henry <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser/src/module.rs')
| -rw-r--r-- | crates/parser/src/module.rs | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/crates/parser/src/module.rs b/crates/parser/src/module.rs index 27fcb1b..fdc02ab 100644 --- a/crates/parser/src/module.rs +++ b/crates/parser/src/module.rs @@ -1,7 +1,6 @@ use crate::log::debug; -use crate::{ParseError, Result, conversion}; +use crate::{ParseError, ParserOptions, Result, conversion, optimize}; use alloc::string::ToString; -use alloc::sync::Arc; use alloc::{format, vec::Vec}; use tinywasm_types::{ ArcSlice, Data, Element, Export, FuncType, Global, Import, ImportKind, Instruction, MemoryType, TableType, @@ -9,7 +8,7 @@ use tinywasm_types::{ }; use wasmparser::{FuncValidatorAllocations, Payload, Validator}; -pub(crate) type Code = (Arc<[Instruction]>, WasmFunctionData, ValueCounts); +pub(crate) type Code = (Vec<Instruction>, WasmFunctionData, ValueCounts); #[derive(Default)] pub(crate) struct ModuleReader { @@ -31,16 +30,6 @@ pub(crate) struct ModuleReader { } impl ModuleReader { - fn apply_instruction_rewrites(instructions: &mut [Instruction], self_func_addr: u32) { - for instr in instructions.iter_mut() { - if matches!(instr, Instruction::Call(addr) if *addr == self_func_addr) { - *instr = Instruction::CallSelf; - } else if matches!(instr, Instruction::ReturnCall(addr) if *addr == self_func_addr) { - *instr = Instruction::ReturnCallSelf; - } - } - } - pub(crate) fn new() -> Self { Self::default() } @@ -190,7 +179,7 @@ impl ModuleReader { Ok(()) } - pub(crate) fn into_module(self) -> Result<TinyWasmModule> { + pub(crate) fn into_module(self, options: &ParserOptions) -> Result<TinyWasmModule> { if !self.end_reached { return Err(ParseError::EndNotReached); } @@ -217,8 +206,7 @@ impl ModuleReader { cref: u16::try_from(locals.cref).unwrap_or_else(|_| unreachable!("local count exceeds u16")), }; let self_func_addr = imported_func_count + func_idx as u32; - let mut instructions = instructions.to_vec(); - Self::apply_instruction_rewrites(&mut instructions, self_func_addr); + let instructions = optimize::optimize_instructions(instructions, self_func_addr, options); WasmFunction { instructions: ArcSlice::from(instructions), data, locals, params, ty } }) |
