MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / cross_store

Function cross_store

tests/all/externals.rs:58–153  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

56#[test]
57#[cfg_attr(miri, ignore)]
58fn cross_store() -> wasmtime::Result<()> {
59 let mut cfg = Config::new();
60 cfg.wasm_reference_types(true);
61 let engine = Engine::new(&cfg)?;
62 let mut store1 = Store::new(&engine, ());
63 let mut store2 = Store::new(&engine, ());
64
65 eprintln!("============ Cross-store instantiation ==============");
66
67 let func = Func::wrap(&mut store2, || {});
68 let ty = GlobalType::new(ValType::I32, Mutability::Const);
69 let global = Global::new(&mut store2, ty, Val::I32(0))?;
70 let ty = MemoryType::new(1, None);
71 let memory = Memory::new(&mut store2, ty)?;
72 let ty = TableType::new(RefType::FUNCREF, 1, None);
73 let table = Table::new(&mut store2, ty, Ref::Func(None))?;
74
75 let need_func = Module::new(&engine, r#"(module (import "" "" (func)))"#)?;
76 assert!(Instance::new(&mut store1, &need_func, &[func.into()]).is_err());
77
78 let need_global = Module::new(&engine, r#"(module (import "" "" (global i32)))"#)?;
79 assert!(Instance::new(&mut store1, &need_global, &[global.into()]).is_err());
80
81 let need_table = Module::new(&engine, r#"(module (import "" "" (table 1 funcref)))"#)?;
82 assert!(Instance::new(&mut store1, &need_table, &[table.into()]).is_err());
83
84 let need_memory = Module::new(&engine, r#"(module (import "" "" (memory 1)))"#)?;
85 assert!(Instance::new(&mut store1, &need_memory, &[memory.into()]).is_err());
86
87 eprintln!("============ Cross-store globals ==============");
88
89 let store1val = Val::FuncRef(Some(Func::wrap(&mut store1, || {})));
90 let store1ref = store1val.ref_().unwrap();
91 let store2val = Val::FuncRef(Some(Func::wrap(&mut store2, || {})));
92 let store2ref = store2val.ref_().unwrap();
93
94 let ty = GlobalType::new(ValType::FUNCREF, Mutability::Var);
95 assert!(Global::new(&mut store2, ty.clone(), store1val).is_err());
96 if let Ok(g) = Global::new(&mut store2, ty.clone(), store2val) {
97 assert!(g.set(&mut store2, store1val).is_err());
98 }
99
100 eprintln!("============ Cross-store tables ==============");
101
102 let ty = TableType::new(RefType::FUNCREF, 1, None);
103 assert!(Table::new(&mut store2, ty.clone(), store1ref.clone()).is_err());
104 let t1 = Table::new(&mut store2, ty.clone(), store2ref.clone())?;
105 assert!(t1.set(&mut store2, 0, store1ref.clone()).is_err());
106 assert!(t1.grow(&mut store2, 0, store1ref.clone()).is_err());
107 assert!(t1.fill(&mut store2, 0, store1ref.clone(), 1).is_err());
108
109 eprintln!("============ Cross-store funcs ==============");
110
111 let module = Module::new(&engine, r#"(module (func (export "f") (param funcref)))"#)?;
112 let s1_inst = Instance::new(&mut store1, &module, &[])?;
113 let s2_inst = Instance::new(&mut store2, &module, &[])?;
114 let s1_f = s1_inst.get_func(&mut store1, "f").unwrap();
115 let s2_f = s2_inst.get_func(&mut store2, "f").unwrap();

Callers

nothing calls this directly

Calls 9

FuncRefClass · 0.85
OkFunction · 0.85
ref_Method · 0.80
newFunction · 0.50
FuncEnum · 0.50
wasm_reference_typesMethod · 0.45
unwrapMethod · 0.45
cloneMethod · 0.45
get_funcMethod · 0.45

Tested by

no test coverage detected