Skip to content

Commit d4de032

Browse files
committed
Add discriminant_for_variant to CoroutineDef
1 parent 94f7790 commit d4de032

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

compiler/rustc_smir/src/rustc_smir/context.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use rustc_middle::ty::layout::{
1212
};
1313
use rustc_middle::ty::print::{with_forced_trimmed_paths, with_no_trimmed_paths};
1414
use rustc_middle::ty::{
15-
GenericPredicates, Instance, List, ScalarInt, TyCtxt, TypeVisitableExt, ValTree,
15+
CoroutineArgsExt, GenericPredicates, Instance, List, ScalarInt, TyCtxt, TypeVisitableExt,
16+
ValTree,
1617
};
1718
use rustc_middle::{mir, ty};
1819
use rustc_span::def_id::LOCAL_CRATE;
@@ -22,9 +23,9 @@ use stable_mir::mir::mono::{InstanceDef, StaticDef};
2223
use stable_mir::mir::{BinOp, Body, Place, UnOp};
2324
use stable_mir::target::{MachineInfo, MachineSize};
2425
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,
2829
};
2930
use stable_mir::{Crate, CrateDef, CrateItem, CrateNum, DefId, Error, Filename, ItemKind, Symbol};
3031

@@ -459,6 +460,25 @@ impl<'tcx> SmirCtxt<'tcx> {
459460
Discr { val: discr.val, ty: discr.ty.stable(&mut *tables) }
460461
}
461462

463+
/// Discriminant for a given variand index and args of a coroutine
464+
pub fn coroutine_discr_for_variant(
465+
&self,
466+
coroutine: CoroutineDef,
467+
args: &GenericArgs,
468+
variant: VariantIdx,
469+
) -> Discr {
470+
let mut tables = self.0.borrow_mut();
471+
let tcx = tables.tcx;
472+
473+
let discr = args.internal(&mut *tables, tcx).as_coroutine().discriminant_for_variant(
474+
coroutine.def_id().internal(&mut *tables, tcx),
475+
tcx,
476+
variant.internal(&mut *tables, tcx),
477+
);
478+
479+
Discr { val: discr.val, ty: discr.ty.stable(&mut *tables) }
480+
}
481+
462482
/// The name of a variant.
463483
pub fn variant_name(&self, def: VariantDef) -> Symbol {
464484
let mut tables = self.0.borrow_mut();

compiler/rustc_smir/src/stable_mir/compiler_interface.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use stable_mir::mir::mono::{Instance, InstanceDef, StaticDef};
1313
use stable_mir::mir::{BinOp, Body, Place, UnOp};
1414
use stable_mir::target::MachineInfo;
1515
use stable_mir::ty::{
16-
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Discr, FieldDef, FnDef, ForeignDef,
17-
ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates, Generics,
18-
ImplDef, ImplTrait, IntrinsicDef, LineInfo, MirConst, PolyFnSig, RigidTy, Span, TraitDecl,
19-
TraitDef, Ty, TyConst, TyConstId, TyKind, UintTy, VariantDef, VariantIdx,
16+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, CoroutineDef, Discr, FieldDef, FnDef,
17+
ForeignDef, ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates,
18+
Generics, ImplDef, ImplTrait, IntrinsicDef, LineInfo, MirConst, PolyFnSig, RigidTy, Span,
19+
TraitDecl, TraitDef, Ty, TyConst, TyConstId, TyKind, UintTy, VariantDef, VariantIdx,
2020
};
2121
use stable_mir::{
2222
AssocItems, Crate, CrateItem, CrateItems, CrateNum, DefId, Error, Filename, ImplTraitDecls,
@@ -235,6 +235,16 @@ impl<'tcx> SmirInterface<'tcx> {
235235
self.cx.adt_discr_for_variant(adt, variant)
236236
}
237237

238+
/// Discriminant for a given variand index and args of a coroutine
239+
pub(crate) fn coroutine_discr_for_variant(
240+
&self,
241+
coroutine: CoroutineDef,
242+
args: &GenericArgs,
243+
variant: VariantIdx,
244+
) -> Discr {
245+
self.cx.coroutine_discr_for_variant(coroutine, args, variant)
246+
}
247+
238248
/// The name of a variant.
239249
pub(crate) fn variant_name(&self, def: VariantDef) -> Symbol {
240250
self.cx.variant_name(def)

compiler/rustc_smir/src/stable_mir/ty.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,12 @@ crate_def! {
756756
pub CoroutineDef;
757757
}
758758

759+
impl CoroutineDef {
760+
pub fn discriminant_for_variant(&self, args: &GenericArgs, idx: VariantIdx) -> Discr {
761+
with(|cx| cx.coroutine_discr_for_variant(*self, args, idx))
762+
}
763+
}
764+
759765
crate_def! {
760766
#[derive(Serialize)]
761767
pub CoroutineClosureDef;

0 commit comments

Comments
 (0)