summaryrefslogtreecommitdiff
path: root/crates/parser/src/module.rs
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2024-05-29 01:22:31 +0200
committerHenry Gressmann <mail@henrygressmann.de>2024-05-29 01:22:31 +0200
commit9d7c1924f1d0e9f79e31da4b84d9da12c3d37945 (patch)
treef3a98df3fdb4a87a1ecd321cb96aa8255b95d615 /crates/parser/src/module.rs
parentdce86f8f9ad919fa2dc1db043209fe1b1c9f08de (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.rs46
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(),
+ })
+ }
}