@@ -12,7 +12,8 @@ use rustc_middle::ty::layout::{
12
12
} ;
13
13
use rustc_middle:: ty:: print:: { with_forced_trimmed_paths, with_no_trimmed_paths} ;
14
14
use rustc_middle:: ty:: {
15
- GenericPredicates , Instance , List , ScalarInt , TyCtxt , TypeVisitableExt , ValTree ,
15
+ CoroutineArgsExt , GenericPredicates , Instance , List , ScalarInt , TyCtxt , TypeVisitableExt ,
16
+ ValTree ,
16
17
} ;
17
18
use rustc_middle:: { mir, ty} ;
18
19
use rustc_span:: def_id:: LOCAL_CRATE ;
@@ -22,9 +23,9 @@ use stable_mir::mir::mono::{InstanceDef, StaticDef};
22
23
use stable_mir:: mir:: { BinOp , Body , Place , UnOp } ;
23
24
use stable_mir:: target:: { MachineInfo , MachineSize } ;
24
25
use stable_mir:: ty:: {
25
- AdtDef , AdtKind , Allocation , ClosureDef , ClosureKind , Discr , FieldDef , FnDef , ForeignDef ,
26
- ForeignItemKind , GenericArgs , IntrinsicDef , LineInfo , MirConst , PolyFnSig , RigidTy , Span , Ty ,
27
- TyConst , TyKind , UintTy , VariantDef , VariantIdx ,
26
+ AdtDef , AdtKind , Allocation , ClosureDef , ClosureKind , CoroutineDef , Discr , FieldDef , FnDef ,
27
+ ForeignDef , ForeignItemKind , GenericArgs , IntrinsicDef , LineInfo , MirConst , PolyFnSig , RigidTy ,
28
+ Span , Ty , TyConst , TyKind , UintTy , VariantDef , VariantIdx ,
28
29
} ;
29
30
use stable_mir:: { Crate , CrateDef , CrateItem , CrateNum , DefId , Error , Filename , ItemKind , Symbol } ;
30
31
@@ -452,6 +453,25 @@ impl<'tcx> SmirCtxt<'tcx> {
452
453
Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
453
454
}
454
455
456
+ /// Discriminant for a given variand index and args of a coroutine
457
+ pub fn coroutine_discr_for_variant (
458
+ & self ,
459
+ coroutine : CoroutineDef ,
460
+ args : & GenericArgs ,
461
+ variant : VariantIdx ,
462
+ ) -> Discr {
463
+ let mut tables = self . 0 . borrow_mut ( ) ;
464
+ let tcx = tables. tcx ;
465
+
466
+ let discr = args. internal ( & mut * tables, tcx) . as_coroutine ( ) . discriminant_for_variant (
467
+ coroutine. def_id ( ) . internal ( & mut * tables, tcx) ,
468
+ tcx,
469
+ variant. internal ( & mut * tables, tcx) ,
470
+ ) ;
471
+
472
+ Discr { val : discr. val , ty : discr. ty . stable ( & mut * tables) }
473
+ }
474
+
455
475
/// The name of a variant.
456
476
pub fn variant_name ( & self , def : VariantDef ) -> Symbol {
457
477
let mut tables = self . 0 . borrow_mut ( ) ;
0 commit comments