use alloc::borrow::ToOwned;
use alloc::boxed::Box;
use alloc::format;
use alloc::string::{String, ToString};
use alloc::vec;
use alloc::vec::Vec;
mod constraints;
pub(crate) mod legacy;
mod liveness_constraints;
use alloc::collections::BTreeMap;
use crate::rustc_data_structures::fx::FxHashSet;
use crate::rustc_index::bit_set::SparseBitMatrix;
use crate::rustc_middle::mir::{Body, Local};
use crate::rustc_middle::ty::RegionVid;
use crate::rustc_mir_dataflow::points::PointIndex;
pub(self) use self::constraints::*;
use crate::rustc_borrowck::dataflow::BorrowIndex;
use crate::rustc_borrowck::region_infer::values::LivenessValues;
use crate::rustc_borrowck::{BorrowSet, RegionInferenceContext};
pub(crate) type LiveLoans = SparseBitMatrix<PointIndex, BorrowIndex>;
#[derive(Default)]
pub(crate) struct PoloniusContext {
graph: Option<LocalizedConstraintGraph>,
live_region_variances: BTreeMap<RegionVid, ConstraintDirection>,
pub(crate) boring_nll_locals: FxHashSet<Local>,
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
enum ConstraintDirection {
Forward,
Backward,
Bidirectional,
}
impl PoloniusContext {
pub(crate) fn compute_loan_liveness<'tcx>(
&mut self,
regioncx: &mut RegionInferenceContext<'tcx>,
body: &Body<'tcx>,
borrow_set: &BorrowSet<'tcx>,
) {
let liveness = regioncx.liveness_constraints();
if borrow_set.len() > 0 {
let graph = LocalizedConstraintGraph::new(liveness, regioncx.outlives_constraints());
let mut live_loans = LiveLoans::new(borrow_set.len());
let mut visitor = LoanLivenessVisitor { liveness, live_loans: &mut live_loans };
graph.traverse(
body,
liveness,
&self.live_region_variances,
regioncx.universal_regions(),
borrow_set,
&mut visitor,
);
regioncx.record_live_loans(live_loans);
self.graph = Some(graph);
}
}
}
struct LoanLivenessVisitor<'a> {
liveness: &'a LivenessValues,
live_loans: &'a mut LiveLoans,
}
impl LocalizedConstraintGraphVisitor for LoanLivenessVisitor<'_> {
fn on_node_traversed(&mut self, loan: BorrowIndex, node: LocalizedNode) {
if self.liveness.is_live_at_point(node.region, node.point) {
self.live_loans.insert(node.point, loan);
}
}
}