Skip to content

Commit a2d5942

Browse files
committed
Add discriminant_for_variant to CoroutineDef
1 parent b2bfa10 commit a2d5942

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

@@ -452,6 +453,25 @@ impl<'tcx> SmirCtxt<'tcx> {
452453
Discr { val: discr.val, ty: discr.ty.stable(&mut *tables) }
453454
}
454455

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+
455475
/// The name of a variant.
456476
pub fn variant_name(&self, def: VariantDef) -> Symbol {
457477
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,
@@ -230,6 +230,16 @@ impl<'tcx> SmirInterface<'tcx> {
230230
self.cx.adt_discr_for_variant(adt, variant)
231231
}
232232

233+
/// Discriminant for a given variand index and args of a coroutine
234+
pub(crate) fn coroutine_discr_for_variant(
235+
&self,
236+
coroutine: CoroutineDef,
237+
args: &GenericArgs,
238+
variant: VariantIdx,
239+
) -> Discr {
240+
self.cx.coroutine_discr_for_variant(coroutine, args, variant)
241+
}
242+
233243
/// The name of a variant.
234244
pub(crate) fn variant_name(&self, def: VariantDef) -> Symbol {
235245
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
@@ -747,6 +747,12 @@ crate_def! {
747747
pub CoroutineDef;
748748
}
749749

750+
impl CoroutineDef {
751+
pub fn discriminant_for_variant(&self, args: &GenericArgs, idx: VariantIdx) -> Discr {
752+
with(|cx| cx.coroutine_discr_for_variant(*self, args, idx))
753+
}
754+
}
755+
750756
crate_def! {
751757
#[derive(Serialize)]
752758
pub CoroutineClosureDef;

0 commit comments

Comments
 (0)