1*c7d25dfdSNick Fitzgerald #![cfg(arc_try_new)]
2*c7d25dfdSNick Fitzgerald 
3*c7d25dfdSNick Fitzgerald use wasmtime::{Config, Engine, Linker, Module, Result, Store};
4*c7d25dfdSNick Fitzgerald use wasmtime_fuzzing::oom::OomTest;
5*c7d25dfdSNick Fitzgerald 
6*c7d25dfdSNick Fitzgerald #[test]
instance_pre_instantiate() -> Result<()>7*c7d25dfdSNick Fitzgerald fn instance_pre_instantiate() -> Result<()> {
8*c7d25dfdSNick Fitzgerald     let module_bytes = {
9*c7d25dfdSNick Fitzgerald         let mut config = Config::new();
10*c7d25dfdSNick Fitzgerald         config.concurrency_support(false);
11*c7d25dfdSNick Fitzgerald         let engine = Engine::new(&config)?;
12*c7d25dfdSNick Fitzgerald         let module = Module::new(
13*c7d25dfdSNick Fitzgerald             &engine,
14*c7d25dfdSNick Fitzgerald             r#"
15*c7d25dfdSNick Fitzgerald                 (module
16*c7d25dfdSNick Fitzgerald                     (import "module" "func" (func (param i32) (result i32)))
17*c7d25dfdSNick Fitzgerald 
18*c7d25dfdSNick Fitzgerald                     (memory (export "memory") 1)
19*c7d25dfdSNick Fitzgerald                     (data (i32.const 0) "a")
20*c7d25dfdSNick Fitzgerald 
21*c7d25dfdSNick Fitzgerald                     (table (export "table") 1 funcref)
22*c7d25dfdSNick Fitzgerald                     (elem (i32.const 0) func 1)
23*c7d25dfdSNick Fitzgerald 
24*c7d25dfdSNick Fitzgerald                     (func (export "func") (param i32) (result i32)
25*c7d25dfdSNick Fitzgerald                         (call 0 (local.get 0))
26*c7d25dfdSNick Fitzgerald                     )
27*c7d25dfdSNick Fitzgerald                 )
28*c7d25dfdSNick Fitzgerald             "#,
29*c7d25dfdSNick Fitzgerald         )?;
30*c7d25dfdSNick Fitzgerald         module.serialize()?
31*c7d25dfdSNick Fitzgerald     };
32*c7d25dfdSNick Fitzgerald 
33*c7d25dfdSNick Fitzgerald     let mut config = Config::new();
34*c7d25dfdSNick Fitzgerald     config.enable_compiler(false);
35*c7d25dfdSNick Fitzgerald     config.concurrency_support(false);
36*c7d25dfdSNick Fitzgerald 
37*c7d25dfdSNick Fitzgerald     let engine = Engine::new(&config)?;
38*c7d25dfdSNick Fitzgerald 
39*c7d25dfdSNick Fitzgerald     let mut linker = Linker::<()>::new(&engine);
40*c7d25dfdSNick Fitzgerald     linker.func_wrap("module", "func", |x: i32| x * 2)?;
41*c7d25dfdSNick Fitzgerald 
42*c7d25dfdSNick Fitzgerald     let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
43*c7d25dfdSNick Fitzgerald     let instance_pre = linker.instantiate_pre(&module)?;
44*c7d25dfdSNick Fitzgerald 
45*c7d25dfdSNick Fitzgerald     OomTest::new().test(|| {
46*c7d25dfdSNick Fitzgerald         let mut store = Store::try_new(&engine, ())?;
47*c7d25dfdSNick Fitzgerald         let _ = instance_pre.instantiate(&mut store)?;
48*c7d25dfdSNick Fitzgerald         Ok(())
49*c7d25dfdSNick Fitzgerald     })
50*c7d25dfdSNick Fitzgerald }
51