1 use wasmtime::*;
2
3 #[test]
4 #[cfg_attr(miri, ignore)]
wasm_export_tags() -> Result<()>5 fn wasm_export_tags() -> Result<()> {
6 let source = r#"
7 (module
8 (tag (export "t1") (param i32) (result i32))
9 (tag (export "t2") (param i32) (result i32))
10 (tag (export "t3") (param i64) (result i32))
11 )
12 "#;
13 let _ = env_logger::try_init();
14 let mut config = Config::new();
15 config.wasm_exceptions(true).wasm_stack_switching(true);
16 let engine = Engine::new(&config)?;
17 let mut store = Store::new(&engine, ());
18 let module = Module::new(&engine, source)?;
19
20 let instance = Instance::new(&mut store, &module, &[])?;
21 let t1 = instance.get_tag(&mut store, "t1");
22 assert!(t1.is_some());
23 let t1 = t1.unwrap();
24
25 let t2 = instance.get_tag(&mut store, "t2");
26 assert!(t2.is_some());
27 let t2 = t2.unwrap();
28
29 let t1_ty = t1.ty(&store);
30 let t2_ty = t2.ty(&store);
31 assert!(Tag::eq(&t1, &t1, &store));
32 assert!(!Tag::eq(&t1, &t2, &store));
33 assert!(FuncType::eq(t1_ty.ty(), t2_ty.ty()));
34
35 let t3 = instance.get_tag(&mut store, "t3");
36 assert!(t3.is_some());
37 let t3 = t3.unwrap();
38 let t3_ty = t3.ty(&store);
39 assert!(Tag::eq(&t3, &t3, &store));
40 assert!(!Tag::eq(&t3, &t1, &store));
41 assert!(!Tag::eq(&t3, &t2, &store));
42 assert!(!FuncType::eq(t1_ty.ty(), t3_ty.ty()));
43
44 return Ok(());
45 }
46
47 #[test]
48 #[cfg_attr(miri, ignore)]
wasm_import_tags() -> Result<()>49 fn wasm_import_tags() -> Result<()> {
50 let m1_src = r#"
51 (module
52 (tag (export "t1") (param i32) (result i32))
53 )
54 "#;
55 let m2_src = r#"
56 (module
57 (tag (export "t1_2") (import "" "") (param i32) (result i32))
58 (tag (export "t1_22") (import "" "") (param i32) (result i32))
59 (tag (export "t2") (param i32) (result i32))
60 )
61 "#;
62 let _ = env_logger::try_init();
63 let mut config = Config::new();
64 config.wasm_exceptions(true).wasm_stack_switching(true);
65 let engine = Engine::new(&config)?;
66 let mut store = Store::new(&engine, ());
67 let m1 = Module::new(&engine, m1_src)?;
68 let m2 = Module::new(&engine, m2_src)?;
69
70 let m1_instance = Instance::new(&mut store, &m1, &[])?;
71 let t1 = m1_instance.get_tag(&mut store, "t1").unwrap();
72 let m2_instance = Instance::new(&mut store, &m2, &[t1.into(), t1.into()])?;
73 let t1_2 = m2_instance.get_tag(&mut store, "t1_2").unwrap();
74 assert!(Tag::eq(&t1, &t1_2, &store));
75 let t1_22 = m2_instance.get_tag(&mut store, "t1_22").unwrap();
76 assert!(Tag::eq(&t1, &t1_22, &store));
77 assert!(Tag::eq(&t1_2, &t1_22, &store));
78
79 return Ok(());
80 }
81