Linker refactoring (#1773)
* Minor code tidying. * Document that `Linker::iter`'s iteration order is arbitrary. * Add a few more tests for `wasmtime::Linker`. * Refactor `Linker::compute_imports`. - Extract the error message generation into a separate function. - In the error message, sort the candidates. * Fix a typo in a comment. * Add `__rtti_base` to the list of allowed but deprecated exports. * Don't print an Error message when a program exits normally. * Update comments to reflect the current code. * Also allow "table" as an exported table, which is used by AssemblyScript.
This commit is contained in:
@@ -66,7 +66,40 @@ fn link_twice_bad() -> Result<()> {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn interposition() -> Result<()> {
|
||||
fn function_interposition() -> Result<()> {
|
||||
let store = Store::default();
|
||||
let mut linker = Linker::new(&store);
|
||||
linker.allow_shadowing(true);
|
||||
let mut module = Module::new(
|
||||
&store,
|
||||
r#"(module (func (export "green") (result i32) (i32.const 7)))"#,
|
||||
)?;
|
||||
for _ in 0..4 {
|
||||
let instance = linker.instantiate(&module)?;
|
||||
linker.define(
|
||||
"red",
|
||||
"green",
|
||||
instance.get_export("green").unwrap().clone(),
|
||||
)?;
|
||||
module = Module::new(
|
||||
&store,
|
||||
r#"(module
|
||||
(import "red" "green" (func (result i32)))
|
||||
(func (export "green") (result i32) (i32.mul (call 0) (i32.const 2)))
|
||||
)"#,
|
||||
)?;
|
||||
}
|
||||
let instance = linker.instantiate(&module)?;
|
||||
let func = instance.get_export("green").unwrap().into_func().unwrap();
|
||||
let func = func.get0::<i32>()?;
|
||||
assert_eq!(func()?, 112);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Same as `function_interposition`, but the linker's name for the function
|
||||
// differs from the module's name.
|
||||
#[test]
|
||||
fn function_interposition_renamed() -> Result<()> {
|
||||
let store = Store::default();
|
||||
let mut linker = Linker::new(&store);
|
||||
linker.allow_shadowing(true);
|
||||
@@ -95,3 +128,32 @@ fn interposition() -> Result<()> {
|
||||
assert_eq!(func()?, 112);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Similar to `function_interposition`, but use `Linker::instance` instead of
|
||||
// `Linker::define`.
|
||||
#[test]
|
||||
fn module_interposition() -> Result<()> {
|
||||
let store = Store::default();
|
||||
let mut linker = Linker::new(&store);
|
||||
linker.allow_shadowing(true);
|
||||
let mut module = Module::new(
|
||||
&store,
|
||||
r#"(module (func (export "export") (result i32) (i32.const 7)))"#,
|
||||
)?;
|
||||
for _ in 0..4 {
|
||||
let instance = linker.instantiate(&module)?;
|
||||
linker.instance("instance", &instance)?;
|
||||
module = Module::new(
|
||||
&store,
|
||||
r#"(module
|
||||
(import "instance" "export" (func (result i32)))
|
||||
(func (export "export") (result i32) (i32.mul (call 0) (i32.const 2)))
|
||||
)"#,
|
||||
)?;
|
||||
}
|
||||
let instance = linker.instantiate(&module)?;
|
||||
let func = instance.get_export("export").unwrap().into_func().unwrap();
|
||||
let func = func.get0::<i32>()?;
|
||||
assert_eq!(func()?, 112);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user