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 23 .data(&store)? 24 .expect("should have host data") 25 .is::<&'static str>()); 26 assert_eq!( 27 *externref 28 .data(&store)? 29 .expect("should have host data") 30 .downcast_ref::<&'static str>() 31 .unwrap(), 32 "Hello, World!" 33 ); 34 35 println!("Touching `externref` table..."); 36 let table = instance.get_table(&mut store, "table").unwrap(); 37 table.set(&mut store, 3, Some(externref).into())?; 38 let elem = table 39 .get(&mut store, 3) 40 .unwrap() // assert in bounds 41 .unwrap_extern() // assert it's an externref table 42 .copied() 43 .unwrap(); // assert the externref isn't null 44 assert!(Rooted::ref_eq(&store, &elem, &externref)?); 45 46 println!("Touching `externref` global..."); 47 let global = instance.get_global(&mut store, "global").unwrap(); 48 global.set(&mut store, Some(externref).into())?; 49 let global_val = global.get(&mut store).unwrap_externref().copied().unwrap(); 50 assert!(Rooted::ref_eq(&store, &global_val, &externref)?); 51 52 println!("Calling `externref` func..."); 53 let func = instance.get_typed_func::<Option<Rooted<ExternRef>>, Option<Rooted<ExternRef>>>( 54 &mut store, "func", 55 )?; 56 let ret = func.call(&mut store, Some(externref))?; 57 assert!(ret.is_some()); 58 assert!(Rooted::ref_eq(&store, &ret.unwrap(), &externref)?); 59 60 println!("GCing within the store..."); 61 store.gc(); 62 63 println!("Done."); 64 Ok(()) 65 } 66