mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-12 05:18:43 +00:00
78 lines
2.7 KiB
Rust
78 lines
2.7 KiB
Rust
use crate::export::Export;
|
|
use wasmer_types::entity::{BoxedSlice, EntityRef, PrimaryMap};
|
|
use wasmer_types::{ExternType, FunctionIndex, ImportIndex, MemoryIndex, TableIndex};
|
|
|
|
/// Import resolver connects imports with available exported values.
|
|
pub trait Resolver: Sized {
|
|
/// Resolves an import a WebAssembly module to an export it's hooked up to.
|
|
///
|
|
/// The `index` provided is the index of the import in the wasm module
|
|
/// that's being resolved. For example 1 means that it's the second import
|
|
/// listed in the wasm module.
|
|
///
|
|
/// The `module` and `field` arguments provided are the module/field names
|
|
/// listed on the import itself.
|
|
///
|
|
/// # Notes:
|
|
///
|
|
/// The index is useful because some WebAssembly modules may rely on that
|
|
/// for resolving ambiguity in their imports. Such as:
|
|
/// ```ignore
|
|
/// (module
|
|
/// (import "" "" (func))
|
|
/// (import "" "" (func (param i32) (result i32)))
|
|
/// )
|
|
/// ```
|
|
fn resolve(&self, _index: u32, module: &str, field: &str) -> Option<Export>;
|
|
}
|
|
|
|
/// Import resolver connects imports with available exported values.
|
|
///
|
|
/// This is a specific subtrait for [`Resolver`] for those users who don't
|
|
/// care about the `index`, but only about the `module` and `field` for
|
|
/// the resolution.
|
|
pub trait NamedResolver {
|
|
/// Resolves an import a WebAssembly module to an export it's hooked up to.
|
|
///
|
|
/// It receives the `module` and `field` names and return the [`Export`] in
|
|
/// case it's found.
|
|
fn resolve_by_name(&self, module: &str, field: &str) -> Option<Export>;
|
|
}
|
|
|
|
// All NamedResolvers should extend `Resolver`.
|
|
impl<T: NamedResolver> Resolver for T {
|
|
/// By default this method will be calling [`NamedResolver::resolve_by_name`],
|
|
/// dismissing the provided `index`.
|
|
fn resolve(&self, _index: u32, module: &str, field: &str) -> Option<Export> {
|
|
self.resolve_by_name(module, field)
|
|
}
|
|
}
|
|
|
|
impl<T: NamedResolver> NamedResolver for &T {
|
|
fn resolve_by_name(&self, module: &str, field: &str) -> Option<Export> {
|
|
(**self).resolve_by_name(module, field)
|
|
}
|
|
}
|
|
|
|
impl NamedResolver for Box<dyn NamedResolver> {
|
|
fn resolve_by_name(&self, module: &str, field: &str) -> Option<Export> {
|
|
(**self).resolve_by_name(module, field)
|
|
}
|
|
}
|
|
|
|
impl NamedResolver for () {
|
|
/// Always returns `None`.
|
|
fn resolve_by_name(&self, _module: &str, _field: &str) -> Option<Export> {
|
|
None
|
|
}
|
|
}
|
|
|
|
/// `Resolver` implementation that always resolves to `None`. Equivalent to `()`.
|
|
pub struct NullResolver {}
|
|
|
|
impl Resolver for NullResolver {
|
|
fn resolve(&self, _idx: u32, _module: &str, _field: &str) -> Option<Export> {
|
|
None
|
|
}
|
|
}
|