| 288 | return Ok(()); |
| 289 | |
| 290 | fn test_engine(engine: &Engine) -> Result<()> { |
| 291 | let mut store = Store::new(&engine, ()); |
| 292 | let flag = Arc::new(AtomicBool::new(false)); |
| 293 | let externref = ExternRef::new(&mut store, SetFlagOnDrop(flag.clone()))?; |
| 294 | Global::new( |
| 295 | &mut store, |
| 296 | GlobalType::new(ValType::EXTERNREF, Mutability::Const), |
| 297 | externref.into(), |
| 298 | )?; |
| 299 | drop(store); |
| 300 | assert!(flag.load(SeqCst)); |
| 301 | |
| 302 | let mut store = Store::new(&engine, ()); |
| 303 | let module = Module::new( |
| 304 | &engine, |
| 305 | r#" |
| 306 | (module |
| 307 | (global (mut externref) (ref.null extern)) |
| 308 | |
| 309 | (func (export "run") (param externref) |
| 310 | local.get 0 |
| 311 | global.set 0 |
| 312 | ) |
| 313 | ) |
| 314 | "#, |
| 315 | )?; |
| 316 | let instance = Instance::new(&mut store, &module, &[])?; |
| 317 | let run = instance.get_typed_func::<Option<Rooted<ExternRef>>, ()>(&mut store, "run")?; |
| 318 | let flag = Arc::new(AtomicBool::new(false)); |
| 319 | let externref = ExternRef::new(&mut store, SetFlagOnDrop(flag.clone()))?; |
| 320 | run.call(&mut store, Some(externref))?; |
| 321 | drop(store); |
| 322 | assert!(flag.load(SeqCst)); |
| 323 | Ok(()) |
| 324 | } |
| 325 | } |
| 326 | |
| 327 | #[test] |