Avoid cloning levels

This commit is contained in:
Morgan Phillips
2016-07-26 17:13:11 -07:00
parent b67d07e87a
commit 1027fc7472

View File

@@ -142,7 +142,7 @@ impl ControlFlowGraph {
} }
/// A helper for iteratively walking a CFG in postorder. /// A helper for iteratively walking a CFG in postorder.
pub struct CFGPostorderWalker<'a> { struct CFGPostorderWalker<'a> {
cfg: &'a ControlFlowGraph, cfg: &'a ControlFlowGraph,
start: Ebb, start: Ebb,
// Ebbs are mapped to a tuple of booleans where the first bool // Ebbs are mapped to a tuple of booleans where the first bool
@@ -194,15 +194,14 @@ impl<'a> CFGPostorderWalker<'a> {
self.levels.push(vec![self.start.clone()]); self.levels.push(vec![self.start.clone()]);
while self.levels.len() > 0 { while self.levels.len() > 0 {
let level = &self.levels[self.levels.len() - 1].clone(); let level_len = self.levels[self.levels.len() - 1].len();
if self.level_index >= level_len {
if self.level_index >= level.len() {
self.levels.pop(); self.levels.pop();
self.level_index = 0; self.level_index = 0;
continue; continue;
} }
let node = level[self.level_index].clone(); let node = self.levels[self.levels.len() - 1][self.level_index].clone();
if !self.visited(node) { if !self.visited(node) {
if self.children_visited(node) { if self.children_visited(node) {
self.mark_visited(node); self.mark_visited(node);