Skip to content

Commit

Permalink
Remove vec_linked_list.
Browse files Browse the repository at this point in the history
It provides a way to effectively embed a linked list within an
`IndexVec` and also iterate over that list. It's written in a very
generic way, involving two traits `Links` and `LinkElem`. But the
`Links` trait is only impl'd for `IndexVec` and `&IndexVec`, and the
whole thing is only used in one module within `rustc_borrowck`. So I
think it's over-engineered and hard to read. Plus it has no comments.

This commit removes it, and adds a (non-generic) local iterator for the
use within `rustc_borrowck`. Much simpler.
  • Loading branch information
nnethercote committed May 8, 2024
1 parent f5d7d34 commit d3d01e1
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 81 deletions.
42 changes: 32 additions & 10 deletions compiler/rustc_borrowck/src/type_check/liveness/local_use_map.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use rustc_data_structures::vec_linked_list as vll;
use rustc_index::IndexVec;
use rustc_middle::mir::visit::{PlaceContext, Visitor};
use rustc_middle::mir::{Body, Local, Location};
Expand Down Expand Up @@ -37,9 +36,12 @@ pub(crate) struct LocalUseMap {
/// we add for each local variable.
first_drop_at: IndexVec<Local, Option<AppearanceIndex>>,

appearances: IndexVec<AppearanceIndex, Appearance>,
appearances: Appearances,
}

// The `Appearance::next` field effectively embeds a linked list within `Appearances`.
type Appearances = IndexVec<AppearanceIndex, Appearance>;

struct Appearance {
point_index: PointIndex,
next: Option<AppearanceIndex>,
Expand All @@ -49,14 +51,34 @@ rustc_index::newtype_index! {
pub struct AppearanceIndex {}
}

impl vll::LinkElem for Appearance {
type LinkIndex = AppearanceIndex;
fn appearances_iter(
first: Option<AppearanceIndex>,
appearances: &Appearances,
) -> impl Iterator<Item = AppearanceIndex> + '_ {
AppearancesIter { appearances, current: first }
}

// Iterates over `Appearances` by following `next` fields.
struct AppearancesIter<'a> {
appearances: &'a Appearances,
current: Option<AppearanceIndex>,
}

fn next(elem: &Self) -> Option<AppearanceIndex> {
elem.next
impl<'a> Iterator for AppearancesIter<'a> {
type Item = AppearanceIndex;

fn next(&mut self) -> Option<AppearanceIndex> {
if let Some(c) = self.current {
self.current = self.appearances[c].next;
Some(c)
} else {
None
}
}
}

//-----------------------------------------------------------------------------

impl LocalUseMap {
pub(crate) fn build(
live_locals: &[Local],
Expand Down Expand Up @@ -86,17 +108,17 @@ impl LocalUseMap {
}

pub(crate) fn defs(&self, local: Local) -> impl Iterator<Item = PointIndex> + '_ {
vll::iter(self.first_def_at[local], &self.appearances)
appearances_iter(self.first_def_at[local], &self.appearances)
.map(move |aa| self.appearances[aa].point_index)
}

pub(crate) fn uses(&self, local: Local) -> impl Iterator<Item = PointIndex> + '_ {
vll::iter(self.first_use_at[local], &self.appearances)
appearances_iter(self.first_use_at[local], &self.appearances)
.map(move |aa| self.appearances[aa].point_index)
}

pub(crate) fn drops(&self, local: Local) -> impl Iterator<Item = PointIndex> + '_ {
vll::iter(self.first_drop_at[local], &self.appearances)
appearances_iter(self.first_drop_at[local], &self.appearances)
.map(move |aa| self.appearances[aa].point_index)
}
}
Expand Down Expand Up @@ -146,7 +168,7 @@ impl LocalUseMapBuild<'_> {
fn insert(
elements: &DenseLocationMap,
first_appearance: &mut Option<AppearanceIndex>,
appearances: &mut IndexVec<AppearanceIndex, Appearance>,
appearances: &mut Appearances,
location: Location,
) {
let point_index = elements.point_from_location(location);
Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_data_structures/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ pub mod temp_dir;
pub mod transitive_relation;
pub mod unhash;
pub mod unord;
pub mod vec_linked_list;
pub mod work_queue;

mod atomic_ref;
Expand Down
70 changes: 0 additions & 70 deletions compiler/rustc_data_structures/src/vec_linked_list.rs

This file was deleted.

0 comments on commit d3d01e1

Please sign in to comment.