little changes
This commit is contained in:
parent
8ba8b223af
commit
2d2c5e118a
2 changed files with 9 additions and 11 deletions
|
@ -2,7 +2,6 @@ use rustc_index::vec::{Idx, IndexVec};
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::Ty;
|
use rustc_middle::ty::Ty;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
use std::collections::VecDeque;
|
|
||||||
|
|
||||||
/// This struct represents a patch to MIR, which can add
|
/// This struct represents a patch to MIR, which can add
|
||||||
/// new statements and basic blocks and patch over block
|
/// new statements and basic blocks and patch over block
|
||||||
|
@ -143,8 +142,7 @@ impl<'tcx> MirPatch<'tcx> {
|
||||||
let mut delta = 0;
|
let mut delta = 0;
|
||||||
let mut last_bb = START_BLOCK;
|
let mut last_bb = START_BLOCK;
|
||||||
let mut terminator_targets = Vec::new();
|
let mut terminator_targets = Vec::new();
|
||||||
let mut inf_and_stmt: VecDeque<(SourceInfo, StatementKind<'_>)> = VecDeque::new();
|
let mut statements:Vec<Statement<'_>> = Vec::new();
|
||||||
|
|
||||||
for (mut loc, stmt) in new_statements {
|
for (mut loc, stmt) in new_statements {
|
||||||
if loc.block != last_bb {
|
if loc.block != last_bb {
|
||||||
delta = 0;
|
delta = 0;
|
||||||
|
@ -161,7 +159,7 @@ impl<'tcx> MirPatch<'tcx> {
|
||||||
let successors = term.successors().clone();
|
let successors = term.successors().clone();
|
||||||
|
|
||||||
for i in successors {
|
for i in successors {
|
||||||
inf_and_stmt.push_back((source_info, stmt.clone()));
|
statements.push(Statement{source_info,kind:stmt.clone()});
|
||||||
terminator_targets.push(i.clone());
|
terminator_targets.push(i.clone());
|
||||||
}
|
}
|
||||||
delta += 1;
|
delta += 1;
|
||||||
|
@ -174,11 +172,11 @@ impl<'tcx> MirPatch<'tcx> {
|
||||||
delta += 1;
|
delta += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for target in terminator_targets.iter() {
|
for target in terminator_targets.iter().rev() {
|
||||||
let inf_and_stmt = inf_and_stmt.pop_front().unwrap();
|
let stmt = statements.pop().unwrap();
|
||||||
body[*target]
|
body[*target]
|
||||||
.statements
|
.statements
|
||||||
.insert(0, Statement { source_info: inf_and_stmt.0, kind: inf_and_stmt.1 });
|
.insert(0, stmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,8 +59,8 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// We are destroying last temp since it's no longer used.
|
// We are destroying last temp since it's no longer used.
|
||||||
if prev_temp.is_some() {
|
if let Some(prev_temp) = prev_temp {
|
||||||
self.patcher.add_statement(loc, StatementKind::StorageDead(prev_temp.unwrap()));
|
self.patcher.add_statement(loc, StatementKind::StorageDead(prev_temp));
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_temp = Some(temp);
|
prev_temp = Some(temp);
|
||||||
|
@ -68,9 +68,9 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since we won't be able to reach final temp, we destroy it outside the loop.
|
// Since we won't be able to reach final temp, we destroy it outside the loop.
|
||||||
if prev_temp.is_some() {
|
if let Some(prev_temp) = prev_temp {
|
||||||
let last_loc = Location { block: loc.block, statement_index: loc.statement_index + 1 };
|
let last_loc = Location { block: loc.block, statement_index: loc.statement_index + 1 };
|
||||||
self.patcher.add_statement(last_loc, StatementKind::StorageDead(prev_temp.unwrap()));
|
self.patcher.add_statement(last_loc, StatementKind::StorageDead(prev_temp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue