Middleware for singlepass.

This commit is contained in:
losfair
2020-06-16 00:56:56 +08:00
parent 1bbaafb819
commit 711ffb6692
2 changed files with 16 additions and 21 deletions

View File

@ -16,8 +16,7 @@ use wasmer_compiler::wasmparser::BinaryReaderError;
use wasmer_compiler::TrapInformation;
use wasmer_compiler::{Compilation, CompileError, CompiledFunction, Compiler, SectionIndex};
use wasmer_compiler::{
CompilerConfig, FunctionMiddleware, FunctionMiddlewareBuilder, MiddlewareBinaryReader,
MiddlewareBuilderGenerator, MiddlewareRegistry, ModuleTranslationState, Target,
CompilerConfig, GenerateMiddlewareChain, MiddlewareBinaryReader, ModuleTranslationState, Target,
};
use wasmer_compiler::{FunctionBody, FunctionBodyData};
use wasmer_runtime::ModuleInfo;
@ -28,7 +27,6 @@ use wasmer_runtime::{MemoryPlan, TablePlan, VMOffsets};
/// It does the compilation in one pass
pub struct SinglepassCompiler {
config: SinglepassConfig,
middleware_registry: Option<Arc<MiddlewareRegistry>>,
}
impl SinglepassCompiler {
@ -36,14 +34,9 @@ impl SinglepassCompiler {
pub fn new(config: &SinglepassConfig) -> Self {
Self {
config: config.clone(),
middleware_registry: None,
}
}
pub fn set_middleware_registry(&mut self, registry: Arc<MiddlewareRegistry>) {
self.middleware_registry = Some(registry);
}
/// Gets the WebAssembly features for this Compiler
fn config(&self) -> &SinglepassConfig {
&self.config
@ -82,25 +75,15 @@ impl Compiler for SinglepassCompiler {
.collect::<Vec<_>>()
.into_iter()
.collect();
let mut middleware_builder_chain: Vec<Box<dyn FunctionMiddlewareBuilder>> = Vec::new();
for (name, &(version, ref conf)) in &module.middleware_conf {
let middleware = if let Some(ref registry) = self.middleware_registry {
registry.instantiate_builder(name, version, &**conf)?
} else {
return Err(CompileError::Codegen(format!(
"trying to load middleware `{}` but no registry is provided",
name
)));
};
middleware_builder_chain.push(middleware);
}
let functions = function_body_inputs
.into_iter()
.collect::<Vec<(LocalFunctionIndex, &FunctionBodyData<'_>)>>()
.par_iter()
.map(|(i, input)| {
let middleware_chain = self.config.middlewares.generate_middleware_chain(*i);
let mut reader =
MiddlewareBinaryReader::new_with_offset(input.data, input.module_offset);
reader.set_middleware_chain(middleware_chain);
// This local list excludes arguments.
let mut locals = vec![];