| 380 | |
| 381 | #[test] |
| 382 | fn drop_host_twice() -> Result<()> { |
| 383 | let engine = super::engine(); |
| 384 | let c = Component::new( |
| 385 | &engine, |
| 386 | r#" |
| 387 | (component |
| 388 | (import "t" (type $t (sub resource))) |
| 389 | |
| 390 | (core func $dtor (canon resource.drop $t)) |
| 391 | (func (export "dtor") (param "x" (own $t)) |
| 392 | (canon lift (core func $dtor))) |
| 393 | ) |
| 394 | "#, |
| 395 | )?; |
| 396 | |
| 397 | struct MyType; |
| 398 | |
| 399 | let mut store = Store::new(&engine, ()); |
| 400 | let mut linker = Linker::new(&engine); |
| 401 | linker |
| 402 | .root() |
| 403 | .resource("t", ResourceType::host::<MyType>(), |_, _| Ok(()))?; |
| 404 | let i = linker.instantiate(&mut store, &c)?; |
| 405 | let dtor = i.get_typed_func::<(&Resource<MyType>,), ()>(&mut store, "dtor")?; |
| 406 | |
| 407 | let t = Resource::new_own(100); |
| 408 | dtor.call(&mut store, (&t,))?; |
| 409 | |
| 410 | assert_eq!( |
| 411 | dtor.call(&mut store, (&t,)).unwrap_err().to_string(), |
| 412 | "host resource already consumed" |
| 413 | ); |
| 414 | |
| 415 | Ok(()) |
| 416 | } |
| 417 | |
| 418 | #[test] |
| 419 | fn manually_destroy() -> Result<()> { |