xref: /wasmtime-44.0.1/examples/externref.rs (revision 331b0dee)
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