@@ -749,11 +749,7 @@ impl ComponentInstance {
749749 bail ! ( "invalid waitable-set handle" ) ;
750750 }
751751
752- let ( set, HandleKind :: Set ) =
753- instance. guest_tables ( ) . 0 [ runtime_instance] . get_mut_handle_by_index ( handle) ?
754- else {
755- bail ! ( "invalid waitable-set handle" ) ;
756- } ;
752+ let set = instance. guest_tables ( ) . 0 [ runtime_instance] . waitable_set_rep ( handle) ?;
757753
758754 Ok ( TableId :: < WaitableSet > :: new ( set) )
759755 } ;
@@ -947,11 +943,8 @@ impl ComponentInstance {
947943 let set = if set_handle == 0 {
948944 None
949945 } else {
950- let ( set, HandleKind :: Set ) = self . as_mut ( ) . guest_tables ( ) . 0 [ caller_instance]
951- . get_mut_handle_by_index ( set_handle) ?
952- else {
953- bail ! ( "invalid waitable-set handle" ) ;
954- } ;
946+ let set =
947+ self . as_mut ( ) . guest_tables ( ) . 0 [ caller_instance] . waitable_set_rep ( set_handle) ?;
955948
956949 Some ( TableId :: < WaitableSet > :: new ( set) )
957950 } ;
@@ -2750,11 +2743,8 @@ impl Instance {
27502743 let opts = self . concurrent_state_mut ( store) . options ( options) ;
27512744 let async_ = opts. async_ ;
27522745 let caller_instance = opts. instance ;
2753- let ( rep, HandleKind :: Set ) = self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance]
2754- . get_mut_handle_by_index ( set) ?
2755- else {
2756- bail ! ( "invalid waitable-set handle" ) ;
2757- } ;
2746+ let rep =
2747+ self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance] . waitable_set_rep ( set) ?;
27582748
27592749 self . waitable_check (
27602750 store,
@@ -2779,11 +2769,8 @@ impl Instance {
27792769 let opts = self . concurrent_state_mut ( store) . options ( options) ;
27802770 let async_ = opts. async_ ;
27812771 let caller_instance = opts. instance ;
2782- let ( rep, HandleKind :: Set ) = self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance]
2783- . get_mut_handle_by_index ( set) ?
2784- else {
2785- bail ! ( "invalid waitable-set handle" ) ;
2786- } ;
2772+ let rep =
2773+ self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance] . waitable_set_rep ( set) ?;
27872774
27882775 self . waitable_check (
27892776 store,
@@ -2918,27 +2905,23 @@ impl Instance {
29182905 async_ : bool ,
29192906 task_id : u32 ,
29202907 ) -> Result < u32 > {
2921- let ( rep, state) = self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance]
2922- . get_mut_handle_by_index ( task_id) ?;
2923- let ( waitable, expected_caller_instance) = match state {
2924- HandleKind :: HostTask => {
2925- let id = TableId :: < HostTask > :: new ( rep) ;
2926- (
2927- Waitable :: Host ( id) ,
2928- self . concurrent_state_mut ( store) . get ( id) ?. caller_instance ,
2929- )
2930- }
2931- HandleKind :: GuestTask => {
2932- let id = TableId :: < GuestTask > :: new ( rep) ;
2933- if let Caller :: Guest { instance, .. } =
2934- & self . concurrent_state_mut ( store) . get ( id) ?. caller
2935- {
2936- ( Waitable :: Guest ( id) , * instance)
2937- } else {
2938- unreachable ! ( )
2939- }
2908+ let ( rep, is_host) =
2909+ self . id ( ) . get_mut ( store) . guest_tables ( ) . 0 [ caller_instance] . subtask_rep ( task_id) ?;
2910+ let ( waitable, expected_caller_instance) = if is_host {
2911+ let id = TableId :: < HostTask > :: new ( rep) ;
2912+ (
2913+ Waitable :: Host ( id) ,
2914+ self . concurrent_state_mut ( store) . get ( id) ?. caller_instance ,
2915+ )
2916+ } else {
2917+ let id = TableId :: < GuestTask > :: new ( rep) ;
2918+ if let Caller :: Guest { instance, .. } =
2919+ & self . concurrent_state_mut ( store) . get ( id) ?. caller
2920+ {
2921+ ( Waitable :: Guest ( id) , * instance)
2922+ } else {
2923+ unreachable ! ( )
29402924 }
2941- _ => bail ! ( "invalid task handle: {task_id}" ) ,
29422925 } ;
29432926 // Since waitables can neither be passed between instances nor forged,
29442927 // this should never fail unless there's a bug in Wasmtime, but we check
@@ -3768,16 +3751,14 @@ impl Waitable {
37683751 caller_instance : RuntimeComponentInstanceIndex ,
37693752 waitable : u32 ,
37703753 ) -> Result < Self > {
3771- let ( waitable, state) =
3772- state. guest_tables ( ) . 0 [ caller_instance] . get_mut_handle_by_index ( waitable) ?;
3773-
3774- Ok ( match state {
3775- HandleKind :: HostTask => Waitable :: Host ( TableId :: new ( waitable) ) ,
3776- HandleKind :: GuestTask => Waitable :: Guest ( TableId :: new ( waitable) ) ,
3777- HandleKind :: Stream ( ..) | HandleKind :: Future ( ..) => {
3778- Waitable :: Transmit ( TableId :: new ( waitable) )
3779- }
3780- _ => bail ! ( "invalid waitable handle" ) ,
3754+ use crate :: runtime:: vm:: component:: Waitable ;
3755+
3756+ let ( waitable, kind) = state. guest_tables ( ) . 0 [ caller_instance] . waitable_rep ( waitable) ?;
3757+
3758+ Ok ( match kind {
3759+ Waitable :: Subtask { is_host : true } => Self :: Host ( TableId :: new ( waitable) ) ,
3760+ Waitable :: Subtask { is_host : false } => Self :: Guest ( TableId :: new ( waitable) ) ,
3761+ Waitable :: Stream | Waitable :: Future => Self :: Transmit ( TableId :: new ( waitable) ) ,
37813762 } )
37823763 }
37833764
@@ -3890,14 +3871,9 @@ impl Waitable {
38903871 ..
38913872 } => {
38923873 let runtime_instance = instance. component ( ) . types ( ) [ ty] . instance ;
3893- let ( rep, HandleKind :: Future ( actual_ty, state) ) = instance. guest_tables ( ) . 0
3894- [ runtime_instance]
3895- . get_mut_handle_by_index ( handle)
3896- . unwrap ( )
3897- else {
3898- unreachable ! ( )
3899- } ;
3900- assert_eq ! ( * actual_ty, ty) ;
3874+ let ( rep, state) = instance. guest_tables ( ) . 0 [ runtime_instance]
3875+ . future_rep ( ty, handle)
3876+ . unwrap ( ) ;
39013877 assert_eq ! ( rep, self . rep( ) ) ;
39023878 assert_eq ! ( * state, TransmitLocalState :: Busy ) ;
39033879 * state = match event {
@@ -3915,14 +3891,9 @@ impl Waitable {
39153891 code,
39163892 } => {
39173893 let runtime_instance = instance. component ( ) . types ( ) [ ty] . instance ;
3918- let ( rep, HandleKind :: Stream ( actual_ty, state) ) = instance. guest_tables ( ) . 0
3919- [ runtime_instance]
3920- . get_mut_handle_by_index ( handle)
3921- . unwrap ( )
3922- else {
3923- unreachable ! ( )
3924- } ;
3925- assert_eq ! ( * actual_ty, ty) ;
3894+ let ( rep, state) = instance. guest_tables ( ) . 0 [ runtime_instance]
3895+ . stream_rep ( ty, handle)
3896+ . unwrap ( ) ;
39263897 assert_eq ! ( rep, self . rep( ) ) ;
39273898 assert_eq ! ( * state, TransmitLocalState :: Busy ) ;
39283899 let done = matches ! ( code, ReturnCode :: Dropped ( _) ) ;
0 commit comments