condense duplicate code into seperate functions
This commit is contained in:
parent
dff1f9f6bb
commit
6003c2501c
2 changed files with 45 additions and 22 deletions
|
@ -9,7 +9,35 @@ use rustc_middle::mir::patch::MirPatch;
|
||||||
use rustc_middle::mir::visit::MutVisitor;
|
use rustc_middle::mir::visit::MutVisitor;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::subst::Subst;
|
use rustc_middle::ty::subst::Subst;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::{Ty, TyCtxt};
|
||||||
|
|
||||||
|
/// Constructs the types used when accessing a Box's pointer
|
||||||
|
pub fn build_ptr_tys<'tcx>(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
pointee: Ty<'tcx>,
|
||||||
|
unique_did: DefId,
|
||||||
|
nonnull_did: DefId,
|
||||||
|
) -> (Ty<'tcx>, Ty<'tcx>, Ty<'tcx>) {
|
||||||
|
let substs = tcx.intern_substs(&[pointee.into()]);
|
||||||
|
let unique_ty = tcx.bound_type_of(unique_did).subst(tcx, substs);
|
||||||
|
let nonnull_ty = tcx.bound_type_of(nonnull_did).subst(tcx, substs);
|
||||||
|
let ptr_ty = tcx.mk_imm_ptr(pointee);
|
||||||
|
|
||||||
|
(unique_ty, nonnull_ty, ptr_ty)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructs the projection needed to access a Box's pointer
|
||||||
|
pub fn build_projection<'tcx>(
|
||||||
|
unique_ty: Ty<'tcx>,
|
||||||
|
nonnull_ty: Ty<'tcx>,
|
||||||
|
ptr_ty: Ty<'tcx>,
|
||||||
|
) -> [PlaceElem<'tcx>; 3] {
|
||||||
|
[
|
||||||
|
PlaceElem::Field(Field::new(0), unique_ty),
|
||||||
|
PlaceElem::Field(Field::new(0), nonnull_ty),
|
||||||
|
PlaceElem::Field(Field::new(0), ptr_ty),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
struct ElaborateBoxDerefVisitor<'tcx, 'a> {
|
struct ElaborateBoxDerefVisitor<'tcx, 'a> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
|
@ -38,10 +66,8 @@ impl<'tcx, 'a> MutVisitor<'tcx> for ElaborateBoxDerefVisitor<'tcx, 'a> {
|
||||||
if place.projection.first() == Some(&PlaceElem::Deref) && base_ty.is_box() {
|
if place.projection.first() == Some(&PlaceElem::Deref) && base_ty.is_box() {
|
||||||
let source_info = self.local_decls[place.local].source_info;
|
let source_info = self.local_decls[place.local].source_info;
|
||||||
|
|
||||||
let substs = tcx.intern_substs(&[base_ty.boxed_ty().into()]);
|
let (unique_ty, nonnull_ty, ptr_ty) =
|
||||||
let unique_ty = tcx.bound_type_of(self.unique_did).subst(tcx, substs);
|
build_ptr_tys(tcx, base_ty.boxed_ty(), self.unique_did, self.nonnull_did);
|
||||||
let nonnull_ty = tcx.bound_type_of(self.nonnull_did).subst(tcx, substs);
|
|
||||||
let ptr_ty = tcx.mk_imm_ptr(base_ty.boxed_ty());
|
|
||||||
|
|
||||||
let ptr_local = self.patch.new_temp(ptr_ty, source_info.span);
|
let ptr_local = self.patch.new_temp(ptr_ty, source_info.span);
|
||||||
self.local_decls.push(LocalDecl::new(ptr_ty, source_info.span));
|
self.local_decls.push(LocalDecl::new(ptr_ty, source_info.span));
|
||||||
|
@ -51,14 +77,10 @@ impl<'tcx, 'a> MutVisitor<'tcx> for ElaborateBoxDerefVisitor<'tcx, 'a> {
|
||||||
self.patch.add_assign(
|
self.patch.add_assign(
|
||||||
location,
|
location,
|
||||||
Place::from(ptr_local),
|
Place::from(ptr_local),
|
||||||
Rvalue::Use(Operand::Copy(Place::from(place.local).project_deeper(
|
Rvalue::Use(Operand::Copy(
|
||||||
&[
|
Place::from(place.local)
|
||||||
PlaceElem::Field(Field::new(0), unique_ty),
|
.project_deeper(&build_projection(unique_ty, nonnull_ty, ptr_ty), tcx),
|
||||||
PlaceElem::Field(Field::new(0), nonnull_ty),
|
)),
|
||||||
PlaceElem::Field(Field::new(0), ptr_ty),
|
|
||||||
],
|
|
||||||
tcx,
|
|
||||||
))),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
place.local = ptr_local;
|
place.local = ptr_local;
|
||||||
|
|
|
@ -1240,10 +1240,13 @@ fn create_cases<'tcx>(
|
||||||
|
|
||||||
let nonnull_did = nonnull_def.non_enum_variant().fields[0].did;
|
let nonnull_did = nonnull_def.non_enum_variant().fields[0].did;
|
||||||
|
|
||||||
let substs = tcx.intern_substs(&[box_ty.boxed_ty().into()]);
|
let (unique_ty, nonnull_ty, ptr_ty) =
|
||||||
let unique_ty = tcx.bound_type_of(unique_did).subst(tcx, substs);
|
crate::elaborate_box_derefs::build_ptr_tys(
|
||||||
let nonnull_ty = tcx.bound_type_of(nonnull_did).subst(tcx, substs);
|
tcx,
|
||||||
let ptr_ty = tcx.mk_imm_ptr(box_ty.boxed_ty());
|
box_ty.boxed_ty(),
|
||||||
|
unique_did,
|
||||||
|
nonnull_did,
|
||||||
|
);
|
||||||
|
|
||||||
let ptr_local = body.local_decls.push(LocalDecl::new(ptr_ty, body.span));
|
let ptr_local = body.local_decls.push(LocalDecl::new(ptr_ty, body.span));
|
||||||
|
|
||||||
|
@ -1257,11 +1260,9 @@ fn create_cases<'tcx>(
|
||||||
kind: StatementKind::Assign(Box::new((
|
kind: StatementKind::Assign(Box::new((
|
||||||
Place::from(ptr_local),
|
Place::from(ptr_local),
|
||||||
Rvalue::Use(Operand::Copy(box_place.project_deeper(
|
Rvalue::Use(Operand::Copy(box_place.project_deeper(
|
||||||
&[
|
&crate::elaborate_box_derefs::build_projection(
|
||||||
PlaceElem::Field(Field::new(0), unique_ty),
|
unique_ty, nonnull_ty, ptr_ty,
|
||||||
PlaceElem::Field(Field::new(0), nonnull_ty),
|
),
|
||||||
PlaceElem::Field(Field::new(0), ptr_ty),
|
|
||||||
],
|
|
||||||
tcx,
|
tcx,
|
||||||
))),
|
))),
|
||||||
))),
|
))),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue