MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / dynamic_val

Function dynamic_val

tests/all/component_model/resources.rs:557–677  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

555
556#[test]
557fn dynamic_val() -> Result<()> {
558 let engine = super::engine();
559 let c = Component::new(
560 &engine,
561 r#"
562 (component
563 (import "t1" (type $t1 (sub resource)))
564 (type $t2' (resource (rep i32)))
565 (export $t2 "t2" (type $t2'))
566 (core func $f (canon resource.new $t2))
567
568 (core module $m
569 (func (export "pass") (param i32) (result i32)
570 (local.get 0)))
571 (core instance $i (instantiate $m))
572
573 (func (export "a") (param "x" (own $t1)) (result (own $t1))
574 (canon lift (core func $i "pass")))
575 (func (export "b") (param "x" u32) (result (own $t2))
576 (canon lift (core func $f)))
577 )
578 "#,
579 )?;
580
581 struct MyType;
582
583 let mut store = Store::new(&engine, ());
584 let mut linker = Linker::new(&engine);
585 linker
586 .root()
587 .resource("t1", ResourceType::host::<MyType>(), |_, _| Ok(()))?;
588 let i_pre = linker.instantiate_pre(&c)?;
589 let i = i_pre.instantiate(&mut store)?;
590
591 let a = i.get_func(&mut store, "a").unwrap();
592 let a_typed = i.get_typed_func::<(Resource<MyType>,), (ResourceAny,)>(&mut store, "a")?;
593 let a_typed_result =
594 i.get_typed_func::<(Resource<MyType>,), (Resource<MyType>,)>(&mut store, "a")?;
595 let b = i.get_func(&mut store, "b").unwrap();
596 let t2 = i.get_resource(&mut store, "t2").unwrap();
597
598 let t1 = Resource::new_own(100);
599 let (t1,) = a_typed.call(&mut store, (t1,))?;
600 assert_eq!(t1.ty(), ResourceType::host::<MyType>());
601
602 let mut results = [Val::Bool(false)];
603 a.call(&mut store, &[Val::Resource(t1)], &mut results)?;
604 match &results[0] {
605 Val::Resource(resource) => {
606 assert_eq!(resource.ty(), ResourceType::host::<MyType>());
607 assert!(resource.owned());
608
609 let resource = resource.try_into_resource::<MyType>(&mut store)?;
610 assert_eq!(resource.rep(), 100);
611 assert!(resource.owned());
612
613 let resource = resource.try_into_resource_any(&mut store)?;
614 assert_eq!(resource.ty(), ResourceType::host::<MyType>());

Callers

nothing calls this directly

Calls 14

OkFunction · 0.85
get_resourceMethod · 0.80
try_into_resourceMethod · 0.80
engineFunction · 0.50
newFunction · 0.50
ResourceClass · 0.50
resourceMethod · 0.45
rootMethod · 0.45
instantiate_preMethod · 0.45
instantiateMethod · 0.45
unwrapMethod · 0.45
get_funcMethod · 0.45

Tested by

no test coverage detected