Skip to content

Commit 634db10

Browse files
committed
Implement Stable for ty::Ty
1 parent 17b8977 commit 634db10

File tree

1 file changed

+84
-80
lines changed
  • compiler/rustc_smir/src/rustc_smir

1 file changed

+84
-80
lines changed

compiler/rustc_smir/src/rustc_smir/mod.rs

+84-80
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ impl<'tcx> Context for Tables<'tcx> {
6464
}
6565

6666
fn ty_kind(&mut self, ty: crate::stable_mir::ty::Ty) -> TyKind {
67-
self.rustc_ty_to_ty(self.types[ty.0])
67+
let ty = self.types[ty.0];
68+
ty.stable(self)
6869
}
6970
}
7071

@@ -75,85 +76,6 @@ pub struct Tables<'tcx> {
7576
}
7677

7778
impl<'tcx> Tables<'tcx> {
78-
fn rustc_ty_to_ty(&mut self, ty: Ty<'tcx>) -> TyKind {
79-
match ty.kind() {
80-
ty::Bool => TyKind::RigidTy(RigidTy::Bool),
81-
ty::Char => TyKind::RigidTy(RigidTy::Char),
82-
ty::Int(int_ty) => match int_ty {
83-
ty::IntTy::Isize => TyKind::RigidTy(RigidTy::Int(IntTy::Isize)),
84-
ty::IntTy::I8 => TyKind::RigidTy(RigidTy::Int(IntTy::I8)),
85-
ty::IntTy::I16 => TyKind::RigidTy(RigidTy::Int(IntTy::I16)),
86-
ty::IntTy::I32 => TyKind::RigidTy(RigidTy::Int(IntTy::I32)),
87-
ty::IntTy::I64 => TyKind::RigidTy(RigidTy::Int(IntTy::I64)),
88-
ty::IntTy::I128 => TyKind::RigidTy(RigidTy::Int(IntTy::I128)),
89-
},
90-
ty::Uint(uint_ty) => match uint_ty {
91-
ty::UintTy::Usize => TyKind::RigidTy(RigidTy::Uint(UintTy::Usize)),
92-
ty::UintTy::U8 => TyKind::RigidTy(RigidTy::Uint(UintTy::U8)),
93-
ty::UintTy::U16 => TyKind::RigidTy(RigidTy::Uint(UintTy::U16)),
94-
ty::UintTy::U32 => TyKind::RigidTy(RigidTy::Uint(UintTy::U32)),
95-
ty::UintTy::U64 => TyKind::RigidTy(RigidTy::Uint(UintTy::U64)),
96-
ty::UintTy::U128 => TyKind::RigidTy(RigidTy::Uint(UintTy::U128)),
97-
},
98-
ty::Float(float_ty) => match float_ty {
99-
ty::FloatTy::F32 => TyKind::RigidTy(RigidTy::Float(FloatTy::F32)),
100-
ty::FloatTy::F64 => TyKind::RigidTy(RigidTy::Float(FloatTy::F64)),
101-
},
102-
ty::Adt(adt_def, generic_args) => TyKind::RigidTy(RigidTy::Adt(
103-
rustc_internal::adt_def(adt_def.did()),
104-
generic_args.stable(self),
105-
)),
106-
ty::Foreign(def_id) => {
107-
TyKind::RigidTy(RigidTy::Foreign(rustc_internal::foreign_def(*def_id)))
108-
}
109-
ty::Str => TyKind::RigidTy(RigidTy::Str),
110-
ty::Array(ty, constant) => {
111-
TyKind::RigidTy(RigidTy::Array(self.intern_ty(*ty), opaque(constant)))
112-
}
113-
ty::Slice(ty) => TyKind::RigidTy(RigidTy::Slice(self.intern_ty(*ty))),
114-
ty::RawPtr(ty::TypeAndMut { ty, mutbl }) => {
115-
TyKind::RigidTy(RigidTy::RawPtr(self.intern_ty(*ty), mutbl.stable(self)))
116-
}
117-
ty::Ref(region, ty, mutbl) => TyKind::RigidTy(RigidTy::Ref(
118-
opaque(region),
119-
self.intern_ty(*ty),
120-
mutbl.stable(self),
121-
)),
122-
ty::FnDef(def_id, generic_args) => TyKind::RigidTy(RigidTy::FnDef(
123-
rustc_internal::fn_def(*def_id),
124-
generic_args.stable(self),
125-
)),
126-
ty::FnPtr(poly_fn_sig) => TyKind::RigidTy(RigidTy::FnPtr(poly_fn_sig.stable(self))),
127-
ty::Dynamic(_, _, _) => todo!(),
128-
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
129-
rustc_internal::closure_def(*def_id),
130-
generic_args.stable(self),
131-
)),
132-
ty::Generator(def_id, generic_args, movability) => TyKind::RigidTy(RigidTy::Generator(
133-
rustc_internal::generator_def(*def_id),
134-
generic_args.stable(self),
135-
match movability {
136-
hir::Movability::Static => Movability::Static,
137-
hir::Movability::Movable => Movability::Movable,
138-
},
139-
)),
140-
ty::Never => TyKind::RigidTy(RigidTy::Never),
141-
ty::Tuple(fields) => TyKind::RigidTy(RigidTy::Tuple(
142-
fields.iter().map(|ty| self.intern_ty(ty)).collect(),
143-
)),
144-
ty::Alias(_, _) => todo!(),
145-
ty::Param(_) => todo!(),
146-
ty::Bound(_, _) => todo!(),
147-
ty::Placeholder(..)
148-
| ty::GeneratorWitness(_)
149-
| ty::GeneratorWitnessMIR(_, _)
150-
| ty::Infer(_)
151-
| ty::Error(_) => {
152-
unreachable!();
153-
}
154-
}
155-
}
156-
15779
fn intern_ty(&mut self, ty: Ty<'tcx>) -> stable_mir::ty::Ty {
15880
if let Some(id) = self.types.iter().position(|&t| t == ty) {
15981
return stable_mir::ty::Ty(id);
@@ -676,3 +598,85 @@ impl<'tcx> Stable<'tcx> for ty::BoundVariableKind {
676598
}
677599
}
678600
}
601+
602+
impl<'tcx> Stable<'tcx> for Ty<'tcx> {
603+
type T = stable_mir::ty::TyKind;
604+
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
605+
match self.kind() {
606+
ty::Bool => TyKind::RigidTy(RigidTy::Bool),
607+
ty::Char => TyKind::RigidTy(RigidTy::Char),
608+
ty::Int(int_ty) => match int_ty {
609+
ty::IntTy::Isize => TyKind::RigidTy(RigidTy::Int(IntTy::Isize)),
610+
ty::IntTy::I8 => TyKind::RigidTy(RigidTy::Int(IntTy::I8)),
611+
ty::IntTy::I16 => TyKind::RigidTy(RigidTy::Int(IntTy::I16)),
612+
ty::IntTy::I32 => TyKind::RigidTy(RigidTy::Int(IntTy::I32)),
613+
ty::IntTy::I64 => TyKind::RigidTy(RigidTy::Int(IntTy::I64)),
614+
ty::IntTy::I128 => TyKind::RigidTy(RigidTy::Int(IntTy::I128)),
615+
},
616+
ty::Uint(uint_ty) => match uint_ty {
617+
ty::UintTy::Usize => TyKind::RigidTy(RigidTy::Uint(UintTy::Usize)),
618+
ty::UintTy::U8 => TyKind::RigidTy(RigidTy::Uint(UintTy::U8)),
619+
ty::UintTy::U16 => TyKind::RigidTy(RigidTy::Uint(UintTy::U16)),
620+
ty::UintTy::U32 => TyKind::RigidTy(RigidTy::Uint(UintTy::U32)),
621+
ty::UintTy::U64 => TyKind::RigidTy(RigidTy::Uint(UintTy::U64)),
622+
ty::UintTy::U128 => TyKind::RigidTy(RigidTy::Uint(UintTy::U128)),
623+
},
624+
ty::Float(float_ty) => match float_ty {
625+
ty::FloatTy::F32 => TyKind::RigidTy(RigidTy::Float(FloatTy::F32)),
626+
ty::FloatTy::F64 => TyKind::RigidTy(RigidTy::Float(FloatTy::F64)),
627+
},
628+
ty::Adt(adt_def, generic_args) => TyKind::RigidTy(RigidTy::Adt(
629+
rustc_internal::adt_def(adt_def.did()),
630+
generic_args.stable(tables),
631+
)),
632+
ty::Foreign(def_id) => {
633+
TyKind::RigidTy(RigidTy::Foreign(rustc_internal::foreign_def(*def_id)))
634+
}
635+
ty::Str => TyKind::RigidTy(RigidTy::Str),
636+
ty::Array(ty, constant) => {
637+
TyKind::RigidTy(RigidTy::Array(tables.intern_ty(*ty), opaque(constant)))
638+
}
639+
ty::Slice(ty) => TyKind::RigidTy(RigidTy::Slice(tables.intern_ty(*ty))),
640+
ty::RawPtr(ty::TypeAndMut { ty, mutbl }) => {
641+
TyKind::RigidTy(RigidTy::RawPtr(tables.intern_ty(*ty), mutbl.stable(tables)))
642+
}
643+
ty::Ref(region, ty, mutbl) => TyKind::RigidTy(RigidTy::Ref(
644+
opaque(region),
645+
tables.intern_ty(*ty),
646+
mutbl.stable(tables),
647+
)),
648+
ty::FnDef(def_id, generic_args) => TyKind::RigidTy(RigidTy::FnDef(
649+
rustc_internal::fn_def(*def_id),
650+
generic_args.stable(tables),
651+
)),
652+
ty::FnPtr(poly_fn_sig) => TyKind::RigidTy(RigidTy::FnPtr(poly_fn_sig.stable(tables))),
653+
ty::Dynamic(_, _, _) => todo!(),
654+
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
655+
rustc_internal::closure_def(*def_id),
656+
generic_args.stable(tables),
657+
)),
658+
ty::Generator(def_id, generic_args, movability) => TyKind::RigidTy(RigidTy::Generator(
659+
rustc_internal::generator_def(*def_id),
660+
generic_args.stable(tables),
661+
match movability {
662+
hir::Movability::Static => Movability::Static,
663+
hir::Movability::Movable => Movability::Movable,
664+
},
665+
)),
666+
ty::Never => TyKind::RigidTy(RigidTy::Never),
667+
ty::Tuple(fields) => TyKind::RigidTy(RigidTy::Tuple(
668+
fields.iter().map(|ty| tables.intern_ty(ty)).collect(),
669+
)),
670+
ty::Alias(_, _) => todo!(),
671+
ty::Param(_) => todo!(),
672+
ty::Bound(_, _) => todo!(),
673+
ty::Placeholder(..)
674+
| ty::GeneratorWitness(_)
675+
| ty::GeneratorWitnessMIR(_, _)
676+
| ty::Infer(_)
677+
| ty::Error(_) => {
678+
unreachable!();
679+
}
680+
}
681+
}
682+
}

0 commit comments

Comments
 (0)