1 //! Small example of how to use `externref`s. 2 3 // You can execute this example with `cargo run --example externref` 4 5 use wasmtime::*; 6 7 fn main() -> Result<()> { 8 println!("Initializing..."); 9 let mut config = Config::new(); 10 config.wasm_reference_types(true); 11 let engine = Engine::new(&config)?; 12 let mut store = Store::new(&engine, ()); 13 14 println!("Compiling module..."); 15 let module = Module::from_file(&engine, "examples/externref.wat")?; 16 17 println!("Instantiating module..."); 18 let instance = Instance::new(&mut store, &module, &[])?; 19 20 println!("Creating new `externref`..."); 21 let externref = ExternRef::new(&mut store, "Hello, World!"); 22 assert!(externref.data(&store)?.is::<&'static str>()); 23 assert_eq!( 24 *externref 25 .data(&store)? 26 .downcast_ref::<&'static str>() 27 .unwrap(), 28 "Hello, World!" 29 ); 30 31 println!("Touching `externref` table..."); 32 let table = instance.get_table(&mut store, "table").unwrap(); 33 table.set(&mut store, 3, Some(externref.clone()).into())?; 34 let elem = table 35 .get(&mut store, 3) 36 .unwrap() // assert in bounds 37 .unwrap_extern() // assert it's an externref table 38 .copied() 39 .unwrap(); // assert the externref isn't null 40 assert!(Rooted::ref_eq(&store, &elem, &externref)?); 41 42 println!("Touching `externref` global..."); 43 let global = instance.get_global(&mut store, "global").unwrap(); 44 global.set(&mut store, Some(externref.clone()).into())?; 45 let global_val = global.get(&mut store).unwrap_externref().copied().unwrap(); 46 assert!(Rooted::ref_eq(&store, &global_val, &externref)?); 47 48 println!("Calling `externref` func..."); 49 let func = instance.get_typed_func::<Option<Rooted<ExternRef>>, Option<Rooted<ExternRef>>>( 50 &mut store, "func", 51 )?; 52 let ret = func.call(&mut store, Some(externref))?; 53 assert!(ret.is_some()); 54 assert!(Rooted::ref_eq(&store, &ret.unwrap(), &externref)?); 55 56 println!("GCing within the store..."); 57 store.gc(); 58 59 println!("Done."); 60 Ok(()) 61 } 62