simplify add_extra_drop_facts
this is mostly to remove imports of the polonius legacy module also what is going on in this function, what the...
This commit is contained in:
parent
50c152f347
commit
fbf48c177b
3 changed files with 20 additions and 25 deletions
|
@ -246,6 +246,6 @@ impl FactCell for RegionVid {
|
|||
|
||||
impl FactCell for LocationIndex {
|
||||
fn to_string(&self, location_table: &LocationTable) -> String {
|
||||
format!("{:?}", location_table.to_location(*self))
|
||||
format!("{:?}", location_table.to_rich_location(*self))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ impl LocationTable {
|
|||
LocationIndex::from_usize(start_index + statement_index * 2 + 1)
|
||||
}
|
||||
|
||||
pub fn to_location(&self, index: LocationIndex) -> RichLocation {
|
||||
pub fn to_rich_location(&self, index: LocationIndex) -> RichLocation {
|
||||
let point_index = index.index();
|
||||
|
||||
// Find the basic block. We have a vector with the
|
||||
|
@ -97,6 +97,13 @@ impl LocationTable {
|
|||
RichLocation::Mid(Location { block, statement_index })
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_location(&self, index: LocationIndex) -> Location {
|
||||
match self.to_rich_location(index) {
|
||||
RichLocation::Start(location) => location,
|
||||
RichLocation::Mid(location) => location,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl LocationIndex {
|
||||
|
|
|
@ -16,7 +16,6 @@ use rustc_trait_selection::traits::query::type_op::{DropckOutlives, TypeOp, Type
|
|||
use tracing::debug;
|
||||
|
||||
use crate::polonius;
|
||||
use crate::polonius::legacy::RichLocation;
|
||||
use crate::region_infer::values::{self, LiveLoans};
|
||||
use crate::type_check::liveness::local_use_map::LocalUseMap;
|
||||
use crate::type_check::{NormalizeLocation, TypeChecker};
|
||||
|
@ -211,7 +210,7 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
|
|||
///
|
||||
/// Add facts for all locals with free regions, since regions may outlive
|
||||
/// the function body only at certain nodes in the CFG.
|
||||
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) -> Option<()> {
|
||||
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) {
|
||||
// This collect is more necessary than immediately apparent
|
||||
// because these facts go into `add_drop_live_facts_for()`,
|
||||
// which also writes to `all_facts`, and so this is genuinely
|
||||
|
@ -221,41 +220,30 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
|
|||
// and probably maybe plausibly does not need to go back in.
|
||||
// It may be necessary to just pick out the parts of
|
||||
// `add_drop_live_facts_for()` that make sense.
|
||||
let Some(facts) = self.cx.typeck.all_facts.as_ref() else { return };
|
||||
let facts_to_add: Vec<_> = {
|
||||
let drop_used = &self.cx.typeck.all_facts.as_ref()?.var_dropped_at;
|
||||
|
||||
let relevant_live_locals: FxIndexSet<_> =
|
||||
relevant_live_locals.iter().copied().collect();
|
||||
|
||||
drop_used
|
||||
facts
|
||||
.var_dropped_at
|
||||
.iter()
|
||||
.filter_map(|(local, location_index)| {
|
||||
let local_ty = self.cx.body.local_decls[*local].ty;
|
||||
if relevant_live_locals.contains(local) || !local_ty.has_free_regions() {
|
||||
.filter_map(|&(local, location_index)| {
|
||||
let local_ty = self.cx.body.local_decls[local].ty;
|
||||
if relevant_live_locals.contains(&local) || !local_ty.has_free_regions() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let location = match self.cx.typeck.location_table.to_location(*location_index)
|
||||
{
|
||||
RichLocation::Start(l) => l,
|
||||
RichLocation::Mid(l) => l,
|
||||
};
|
||||
|
||||
Some((*local, local_ty, location))
|
||||
let location = self.cx.typeck.location_table.to_location(location_index);
|
||||
Some((local, local_ty, location))
|
||||
})
|
||||
.collect()
|
||||
};
|
||||
|
||||
// FIXME: these locations seem to have a special meaning (e.g. everywhere, at the end,
|
||||
// ...), but I don't know which one. Please help me rename it to something descriptive!
|
||||
// Also, if this IntervalSet is used in many places, it maybe should have a newtype'd
|
||||
// name with a description of what it means for future mortals passing by.
|
||||
let locations = IntervalSet::new(self.cx.elements.num_points());
|
||||
|
||||
let live_at = IntervalSet::new(self.cx.elements.num_points());
|
||||
for (local, local_ty, location) in facts_to_add {
|
||||
self.cx.add_drop_live_facts_for(local, local_ty, &[location], &locations);
|
||||
self.cx.add_drop_live_facts_for(local, local_ty, &[location], &live_at);
|
||||
}
|
||||
Some(())
|
||||
}
|
||||
|
||||
/// Clear the value of fields that are "per local variable".
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue