Skip to content

Commit

Permalink
Add process_* place hooks to improve code reutilization
Browse files Browse the repository at this point in the history
  • Loading branch information
spastorino committed Oct 9, 2019
1 parent 040ef45 commit 6ec12a0
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 97 deletions.
28 changes: 25 additions & 3 deletions src/librustc/mir/visit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -786,10 +786,32 @@ macro_rules! visit_place_fns {
(mut) => (
fn super_place(
&mut self,
_place: &mut Place<'tcx>,
_context: PlaceContext,
_location: Location,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location,
) {
self.visit_place_base(&mut place.base, context, location);

place.projection = self.process_projection(&place.projection);
}

fn process_projection(
&mut self,
projection: &Box<[PlaceElem<'tcx>]>,
) -> Box<[PlaceElem<'tcx>]> {
let new_projection: Vec<_> = projection.iter().map(|elem|
self.process_projection_elem(elem)
).collect();

new_projection.into_boxed_slice()
}

fn process_projection_elem(
&mut self,
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
// FIXME: avoid cloning here
elem.clone()
}
);

Expand Down
28 changes: 10 additions & 18 deletions src/librustc_mir/borrow_check/nll/renumber.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use rustc::ty::subst::SubstsRef;
use rustc::ty::{self, Ty, TypeFoldable};
use rustc::mir::{Body, Location, Place, PlaceElem, Promoted};
use rustc::mir::visit::{MutVisitor, PlaceContext, TyContext};
use rustc::mir::{Body, Location, PlaceElem, Promoted};
use rustc::mir::visit::{MutVisitor, TyContext};
use rustc::infer::{InferCtxt, NLLRegionVariableOrigin};
use rustc_index::vec::IndexVec;

Expand Down Expand Up @@ -62,23 +62,15 @@ impl<'a, 'tcx> MutVisitor<'tcx> for NLLVisitor<'a, 'tcx> {
debug!("visit_ty: ty={:?}", ty);
}

fn visit_place(
fn process_projection_elem(
&mut self,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location,
) {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
if let PlaceElem::Field(field, ty) = elem {
PlaceElem::Field(*field, self.renumber_regions(ty))
} else {
elem.clone()
}
).collect();

place.projection = new_projection.into_boxed_slice();
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
if let PlaceElem::Field(field, ty) = elem {
PlaceElem::Field(*field, self.renumber_regions(ty))
} else {
elem.clone()
}
}

fn visit_substs(&mut self, substs: &mut SubstsRef<'tcx>, location: Location) {
Expand Down
26 changes: 9 additions & 17 deletions src/librustc_mir/transform/erase_regions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use rustc::ty::subst::SubstsRef;
use rustc::ty::{self, Ty, TyCtxt};
use rustc::mir::*;
use rustc::mir::visit::{MutVisitor, PlaceContext, TyContext};
use rustc::mir::visit::{MutVisitor, TyContext};
use crate::transform::{MirPass, MirSource};

struct EraseRegionsVisitor<'tcx> {
Expand Down Expand Up @@ -39,23 +39,15 @@ impl MutVisitor<'tcx> for EraseRegionsVisitor<'tcx> {
*substs = self.tcx.erase_regions(substs);
}

fn visit_place(
fn process_projection_elem(
&mut self,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location,
) {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
if let PlaceElem::Field(field, ty) = elem {
PlaceElem::Field(*field, self.tcx.erase_regions(ty))
} else {
elem.clone()
}
).collect();

place.projection = new_projection.into_boxed_slice();
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
if let PlaceElem::Field(field, ty) = elem {
PlaceElem::Field(*field, self.tcx.erase_regions(ty))
} else {
elem.clone()
}
}
}

Expand Down
23 changes: 12 additions & 11 deletions src/librustc_mir/transform/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -695,21 +695,22 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> {
*place = self.destination.clone();
},
_ => {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
if let PlaceElem::Index(local) = elem {
PlaceElem::Index(self.make_integrate_local(local))
} else {
elem.clone()
}
).collect();

place.projection = new_projection.into_boxed_slice();
self.super_place(place, context, location);
}
}
}

fn process_projection_elem(
&mut self,
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
if let PlaceElem::Index(local) = elem {
PlaceElem::Index(self.make_integrate_local(local))
} else {
elem.clone()
}
}

fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) {
self.in_cleanup_block = data.is_cleanup;
self.super_basic_block_data(block, data);
Expand Down
24 changes: 8 additions & 16 deletions src/librustc_mir/transform/promote_consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,24 +405,16 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Promoter<'a, 'tcx> {
}
}

fn visit_place(
fn process_projection_elem(
&mut self,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location,
) {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
match elem {
PlaceElem::Index(local) if self.is_temp_kind(*local) => {
PlaceElem::Index(self.promote_temp(*local))
}
_ => elem.clone(),
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
match elem {
PlaceElem::Index(local) if self.is_temp_kind(*local) => {
PlaceElem::Index(self.promote_temp(*local))
}
).collect();

place.projection = new_projection.into_boxed_slice();
_ => elem.clone(),
}
}
}

Expand Down
24 changes: 8 additions & 16 deletions src/librustc_mir/transform/simplify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,22 +371,14 @@ impl<'tcx> MutVisitor<'tcx> for LocalUpdater {
*l = self.map[*l].unwrap();
}

fn visit_place(
fn process_projection_elem(
&mut self,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location,
) {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
if let PlaceElem::Index(local) = elem {
PlaceElem::Index(self.map[*local].unwrap())
} else {
elem.clone()
}
).collect();

place.projection = new_projection.into_boxed_slice();
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
if let PlaceElem::Index(local) = elem {
PlaceElem::Index(self.map[*local].unwrap())
} else {
elem.clone()
}
}
}
26 changes: 10 additions & 16 deletions src/librustc_mir/util/def_use.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Def-use analysis.

use rustc::mir::{Body, Local, Location, Place, PlaceElem};
use rustc::mir::{Body, Local, Location, PlaceElem};
use rustc::mir::visit::{PlaceContext, MutVisitor, Visitor};
use rustc_index::vec::IndexVec;
use std::mem;
Expand Down Expand Up @@ -138,21 +138,15 @@ impl MutVisitor<'_> for MutateUseVisitor {
}
}

fn visit_place(&mut self,
place: &mut Place<'tcx>,
context: PlaceContext,
location: Location) {
self.visit_place_base(&mut place.base, context, location);

let new_projection: Vec<_> = place.projection.iter().map(|elem|
match elem {
PlaceElem::Index(local) if *local == self.query => {
PlaceElem::Index(self.new_local)
}
_ => elem.clone(),
fn process_projection_elem(
&mut self,
elem: &PlaceElem<'tcx>,
) -> PlaceElem<'tcx> {
match elem {
PlaceElem::Index(local) if *local == self.query => {
PlaceElem::Index(self.new_local)
}
).collect();

place.projection = new_projection.into_boxed_slice();
_ => elem.clone(),
}
}
}

0 comments on commit 6ec12a0

Please sign in to comment.