From f99b3a90827406b48657d63d7c1f0188ddd68c8f Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 15 Jul 2026 15:20:00 +0200 Subject: feat: decouple validation from parsing Signed-off-by: Henry --- crates/parser/src/parallel.rs | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) (limited to 'crates/parser/src/parallel.rs') diff --git a/crates/parser/src/parallel.rs b/crates/parser/src/parallel.rs index 8833970..137eb2f 100644 --- a/crates/parser/src/parallel.rs +++ b/crates/parser/src/parallel.rs @@ -3,7 +3,7 @@ use crate::{ParseError, ParserOptions, Result, conversion}; use alloc::sync::Arc; use alloc::vec::Vec; use core::ops::Range; -use tinywasm_types::{FuncType, ValueCounts}; +use tinywasm_types::ValueCounts; use wasmparser::{FuncValidatorAllocations, ValidatorResources}; pub(crate) enum FunctionBodyInput<'a> { @@ -21,8 +21,9 @@ pub(crate) struct OwnedFunctionBody { pub(crate) struct PendingFunction<'a> { pub ordinal: usize, + pub results: ValueCounts, pub ty_idx: u32, - pub func_to_validate: wasmparser::FuncToValidate, + pub func_to_validate: Option>, pub body: FunctionBodyInput<'a>, } @@ -60,37 +61,38 @@ fn body_len(body: &FunctionBodyInput<'_>) -> usize { fn process_function_job( job: PendingFunction<'_>, + metadata: &crate::visit::ModuleMetadata, options: &ParserOptions, - func_types: &[Arc], imported_func_count: usize, imported_memory_count: u32, ) -> Result<(usize, FunctionCode)> { - let validator = job.func_to_validate.into_validator(FuncValidatorAllocations::default()); + let validator = job.func_to_validate.map(|func| func.into_validator(FuncValidatorAllocations::default())); let (code, _, _) = match job.body { - FunctionBodyInput::Borrowed(func) => conversion::convert_module_code(func, validator, Default::default())?, + FunctionBodyInput::Borrowed(func) => { + conversion::convert_module_code(func, validator, Default::default(), metadata, job.ty_idx)? + } FunctionBodyInput::Owned(body) => { let reader = wasmparser::BinaryReader::new(&body.section_bytes[body.body_range], body.body_offset); let func = wasmparser::FunctionBody::new(reader); - conversion::convert_module_code(func, validator, Default::default())? + conversion::convert_module_code(func, validator, Default::default(), metadata, job.ty_idx)? } }; - let ty = func_types.get(job.ty_idx as usize).expect("No func type for func, this is a bug"); let code = optimize_function_code( code, options, - ValueCounts::from_iter(ty.results()), + job.results, (imported_func_count + job.ordinal) as u32, imported_memory_count, - ); + )?; Ok((job.ordinal, code)) } pub(crate) fn process_pending( pending: Vec>, + metadata: &crate::visit::ModuleMetadata, options: &ParserOptions, - func_types: &[Arc], imported_func_count: usize, imported_memory_count: u32, ) -> Result> { @@ -99,7 +101,7 @@ pub(crate) fn process_pending( let mut codes = small_jobs .into_iter() - .map(|job| process_function_job(job, options, func_types, imported_func_count, imported_memory_count)) + .map(|job| process_function_job(job, metadata, options, imported_func_count, imported_memory_count)) .collect::>>()?; let num_workers = worker_count(options, large_jobs.len()); @@ -107,7 +109,7 @@ pub(crate) fn process_pending( codes.extend( large_jobs .into_iter() - .map(|job| process_function_job(job, options, func_types, imported_func_count, imported_memory_count)) + .map(|job| process_function_job(job, metadata, options, imported_func_count, imported_memory_count)) .collect::>>()?, ); } else { @@ -136,13 +138,7 @@ pub(crate) fn process_pending( chunk .into_iter() .map(|job| { - process_function_job( - job, - options, - func_types, - imported_func_count, - imported_memory_count, - ) + process_function_job(job, metadata, options, imported_func_count, imported_memory_count) }) .collect::>() }) -- cgit v1.3.1