Cleanups
This commit is contained in:
parent
1897657ef0
commit
d2ac11ce5f
@ -100,7 +100,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
.collect();
|
||||
|
||||
// create binding start block for link them by false edges
|
||||
let candidate_count = arms.iter().fold(0, |ac, c| ac + c.patterns.len());
|
||||
let candidate_count = arms.iter().map(|c| c.patterns.len()).sum::<usize>();
|
||||
let pre_binding_blocks: Vec<_> = (0..=candidate_count)
|
||||
.map(|_| self.cfg.start_new_block())
|
||||
.collect();
|
||||
@ -337,7 +337,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
|
||||
pub fn place_into_pattern(
|
||||
&mut self,
|
||||
mut block: BasicBlock,
|
||||
block: BasicBlock,
|
||||
irrefutable_pat: Pattern<'tcx>,
|
||||
initializer: &Place<'tcx>,
|
||||
set_match_place: bool,
|
||||
@ -359,7 +359,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
|
||||
// Simplify the candidate. Since the pattern is irrefutable, this should
|
||||
// always convert all match-pairs into bindings.
|
||||
unpack!(block = self.simplify_candidate(block, &mut candidate));
|
||||
self.simplify_candidate(&mut candidate);
|
||||
|
||||
if !candidate.match_pairs.is_empty() {
|
||||
span_bug!(
|
||||
@ -745,7 +745,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
// complete, all the match pairs which remain require some
|
||||
// form of test, whether it be a switch or pattern comparison.
|
||||
for candidate in &mut candidates {
|
||||
unpack!(block = self.simplify_candidate(block, candidate));
|
||||
self.simplify_candidate(candidate);
|
||||
}
|
||||
|
||||
// The candidates are sorted by priority. Check to see
|
||||
@ -1035,7 +1035,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
test, match_pair
|
||||
);
|
||||
let target_blocks = self.perform_test(block, &match_pair.place, &test);
|
||||
let mut target_candidates: Vec<_> = (0..target_blocks.len()).map(|_| vec![]).collect();
|
||||
let mut target_candidates = vec![vec![]; target_blocks.len()];
|
||||
|
||||
// Sort the candidates into the appropriate vector in
|
||||
// `target_candidates`. Note that at some point we may
|
||||
|
@ -22,10 +22,9 @@
|
||||
//! sort of test: for example, testing which variant an enum is, or
|
||||
//! testing a value against a constant.
|
||||
|
||||
use build::{BlockAnd, BlockAndExtension, Builder};
|
||||
use build::Builder;
|
||||
use build::matches::{Ascription, Binding, MatchPair, Candidate};
|
||||
use hair::*;
|
||||
use rustc::mir::*;
|
||||
use rustc::ty;
|
||||
use rustc::ty::layout::{Integer, IntegerExt, Size};
|
||||
use syntax::attr::{SignedInt, UnsignedInt};
|
||||
@ -35,24 +34,23 @@ use std::mem;
|
||||
|
||||
impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
pub fn simplify_candidate<'pat>(&mut self,
|
||||
block: BasicBlock,
|
||||
candidate: &mut Candidate<'pat, 'tcx>)
|
||||
-> BlockAnd<()> {
|
||||
candidate: &mut Candidate<'pat, 'tcx>) {
|
||||
// repeatedly simplify match pairs until fixed point is reached
|
||||
loop {
|
||||
let match_pairs = mem::replace(&mut candidate.match_pairs, vec![]);
|
||||
let mut progress = match_pairs.len(); // count how many were simplified
|
||||
let mut changed = false;
|
||||
for match_pair in match_pairs {
|
||||
match self.simplify_match_pair(match_pair, candidate) {
|
||||
Ok(()) => {}
|
||||
Ok(()) => {
|
||||
changed = true;
|
||||
}
|
||||
Err(match_pair) => {
|
||||
candidate.match_pairs.push(match_pair);
|
||||
progress -= 1; // this one was not simplified
|
||||
}
|
||||
}
|
||||
}
|
||||
if progress == 0 {
|
||||
return block.unit(); // if we were not able to simplify any, done.
|
||||
if !changed {
|
||||
return; // if we were not able to simplify any, done.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -200,20 +200,18 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
for (idx, discr) in adt_def.discriminants(tcx) {
|
||||
target_blocks.push(if variants.contains(idx) {
|
||||
values.push(discr.val);
|
||||
targets.push(self.cfg.start_new_block());
|
||||
*targets.last().unwrap()
|
||||
let block = self.cfg.start_new_block();
|
||||
targets.push(block);
|
||||
block
|
||||
} else {
|
||||
if otherwise_block.is_none() {
|
||||
otherwise_block = Some(self.cfg.start_new_block());
|
||||
}
|
||||
otherwise_block.unwrap()
|
||||
*otherwise_block
|
||||
.get_or_insert_with(|| self.cfg.start_new_block())
|
||||
});
|
||||
}
|
||||
if let Some(otherwise_block) = otherwise_block {
|
||||
targets.push(otherwise_block);
|
||||
} else {
|
||||
targets.push(self.unreachable_block());
|
||||
}
|
||||
targets.push(
|
||||
otherwise_block
|
||||
.unwrap_or_else(|| self.unreachable_block()),
|
||||
);
|
||||
debug!("num_enum_variants: {}, tested variants: {:?}, variants: {:?}",
|
||||
num_enum_variants, values, variants);
|
||||
let discr_ty = adt_def.repr.discr_type().to_ty(tcx);
|
||||
@ -490,8 +488,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
||||
// away.)
|
||||
let tested_match_pair = candidate.match_pairs.iter()
|
||||
.enumerate()
|
||||
.filter(|&(_, mp)| mp.place == *test_place)
|
||||
.next();
|
||||
.find(|&(_, mp)| mp.place == *test_place);
|
||||
let (match_pair_index, match_pair) = match tested_match_pair {
|
||||
Some(pair) => pair,
|
||||
None => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user