summaryrefslogtreecommitdiff
path: root/crates/parser/src/module.rs
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2024-05-15 13:38:13 +0200
committerGitHub <noreply@github.com>2024-05-15 13:38:13 +0200
commitd9cdd0b53c870bf7d9d69b854b8da2692d152871 (patch)
tree0ba0bf6a38ce391495ef42e4f22954aafe3fbbc1 /crates/parser/src/module.rs
parente771c6df456f6c6655a7850defffdbb5cc574461 (diff)
feat: v0.7.0 (#13)
* Remove all unsafe code * Refactor interpreter loop * Optimize Call-frames * Remove unnecessary reference counter data from store --------- Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/parser/src/module.rs')
-rw-r--r--crates/parser/src/module.rs9
1 files changed, 6 insertions, 3 deletions
diff --git a/crates/parser/src/module.rs b/crates/parser/src/module.rs
index 8414c17..1cd5ed5 100644
--- a/crates/parser/src/module.rs
+++ b/crates/parser/src/module.rs
@@ -2,12 +2,14 @@ use crate::log::debug;
use crate::{conversion, ParseError, Result};
use alloc::{boxed::Box, format, vec::Vec};
use tinywasm_types::{Data, Element, Export, FuncType, Global, Import, Instruction, MemoryType, TableType, ValType};
-use wasmparser::{Payload, Validator};
+use wasmparser::{FuncValidatorAllocations, Payload, Validator};
pub(crate) type Code = (Box<[Instruction]>, Box<[ValType]>);
#[derive(Default)]
pub(crate) struct ModuleReader {
+ func_validator_allocations: Option<FuncValidatorAllocations>,
+
pub(crate) version: Option<u16>,
pub(crate) start_func: Option<u32>,
pub(crate) func_types: Vec<FuncType>,
@@ -129,8 +131,9 @@ impl ModuleReader {
CodeSectionEntry(function) => {
debug!("Found code section entry");
let v = validator.code_section_entry(&function)?;
- let func_validator = v.into_validator(Default::default());
- self.code.push(conversion::convert_module_code(function, func_validator)?);
+ let mut func_validator = v.into_validator(self.func_validator_allocations.take().unwrap_or_default());
+ self.code.push(conversion::convert_module_code(function, &mut func_validator)?);
+ self.func_validator_allocations = Some(func_validator.into_allocations());
}
ImportSection(reader) => {
if !self.imports.is_empty() {