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