diff options
| author | Henry Gressmann <mail@henrygressmann.de> | 2024-05-29 01:22:31 +0200 |
|---|---|---|
| committer | Henry Gressmann <mail@henrygressmann.de> | 2024-05-29 01:22:31 +0200 |
| commit | 9d7c1924f1d0e9f79e31da4b84d9da12c3d37945 (patch) | |
| tree | f3a98df3fdb4a87a1ecd321cb96aa8255b95d615 /crates/parser/src/module.rs | |
| parent | dce86f8f9ad919fa2dc1db043209fe1b1c9f08de (diff) | |
chore: improve parser, clean up interpreter loop
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser/src/module.rs')
| -rw-r--r-- | crates/parser/src/module.rs | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/crates/parser/src/module.rs b/crates/parser/src/module.rs index 1cd5ed5..a4bdba4 100644 --- a/crates/parser/src/module.rs +++ b/crates/parser/src/module.rs @@ -1,7 +1,11 @@ use crate::log::debug; use crate::{conversion, ParseError, Result}; +use alloc::string::ToString; use alloc::{boxed::Box, format, vec::Vec}; -use tinywasm_types::{Data, Element, Export, FuncType, Global, Import, Instruction, MemoryType, TableType, ValType}; +use tinywasm_types::{ + Data, Element, Export, FuncType, Global, Import, Instruction, MemoryType, TableType, TinyWasmModule, ValType, + WasmFunction, +}; use wasmparser::{FuncValidatorAllocations, Payload, Validator}; pub(crate) type Code = (Box<[Instruction]>, Box<[ValType]>); @@ -173,4 +177,44 @@ impl ModuleReader { Ok(()) } + + #[inline] + pub(crate) fn to_module(self) -> Result<TinyWasmModule> { + if !self.end_reached { + return Err(ParseError::EndNotReached); + } + + let local_function_count = self.code.len(); + + if self.code_type_addrs.len() != local_function_count { + return Err(ParseError::Other("Code and code type address count mismatch".to_string())); + } + + let funcs = self + .code + .into_iter() + .zip(self.code_type_addrs) + .map(|((instructions, locals), ty_idx)| WasmFunction { + instructions, + locals, + ty: self.func_types.get(ty_idx as usize).expect("No func type for func, this is a bug").clone(), + }) + .collect::<Vec<_>>(); + + let globals = self.globals; + let table_types = self.table_types; + + Ok(TinyWasmModule { + funcs: funcs.into_boxed_slice(), + func_types: self.func_types.into_boxed_slice(), + globals: globals.into_boxed_slice(), + table_types: table_types.into_boxed_slice(), + imports: self.imports.into_boxed_slice(), + start_func: self.start_func, + data: self.data.into_boxed_slice(), + exports: self.exports.into_boxed_slice(), + elements: self.elements.into_boxed_slice(), + memory_types: self.memory_types.into_boxed_slice(), + }) + } } |
