struct DropTree {
    drops: IndexVec<DropIdx, (DropData, DropIdx)>,
    previous_drops: FxHashMap<(DropIdx, Local, DropKind), DropIdx>,
    entry_points: Vec<(DropIdx, BasicBlock)>,
}
Expand description

A tree of drops that we have deferred lowering. It’s used for:

  • Drops on unwind paths
  • Drops on generator drop paths (when a suspended generator is dropped)
  • Drops on return and loop exit paths
  • Drops on the else path in an if let chain

Once no more nodes could be added to the tree, we lower it to MIR in one go in build_mir.

Fields§

§drops: IndexVec<DropIdx, (DropData, DropIdx)>

Drops in the tree.

§previous_drops: FxHashMap<(DropIdx, Local, DropKind), DropIdx>

Map for finding the inverse of the next_drop relation:

previous_drops[(drops[i].1, drops[i].0.local, drops[i].0.kind)] == i

§entry_points: Vec<(DropIdx, BasicBlock)>

Edges into the DropTree that need to be added once it’s lowered.

Implementations§

source§

impl DropTree

source

fn new() -> Self

source

fn add_drop(&mut self, drop: DropData, next: DropIdx) -> DropIdx

source

fn add_entry(&mut self, from: BasicBlock, to: DropIdx)

source

fn build_mir<'tcx, T: DropTreeBuilder<'tcx>>( &mut self, cfg: &mut CFG<'tcx>, blocks: &mut IndexVec<DropIdx, Option<BasicBlock>> )

Builds the MIR for a given drop tree.

blocks should have the same length as self.drops, and may have its first value set to some already existing block.

source

fn assign_blocks<'tcx, T: DropTreeBuilder<'tcx>>( &mut self, cfg: &mut CFG<'tcx>, blocks: &mut IndexVec<DropIdx, Option<BasicBlock>> )

Assign blocks for all of the drops in the drop tree that need them.

Trait Implementations§

source§

impl Debug for DropTree

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 80 bytes