struct DropTree {
drops: IndexVec<DropIdx, DropNode>,
existing_drops_map: FxHashMap<DropNodeKey, 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 coroutine drop paths (when a suspended coroutine 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, DropNode>
Nodes in the drop tree, containing drop data and a link to the next node.
existing_drops_map: FxHashMap<DropNodeKey, DropIdx>
Map for finding the index of an existing node, given its contents.
entry_points: Vec<(DropIdx, BasicBlock)>
Edges into the DropTree
that need to be added once it’s lowered.
Implementations§
Source§impl DropTree
impl DropTree
fn new() -> Self
Sourcefn add_drop(&mut self, data: DropData, next: DropIdx) -> DropIdx
fn add_drop(&mut self, data: DropData, next: DropIdx) -> DropIdx
Adds a node to the drop tree, consisting of drop data and the index of
the “next” drop (in drop order), which could be the sentinel ROOT_NODE
.
If there is already an equivalent node in the tree, nothing is added, and that node’s index is returned. Otherwise, the new node’s index is returned.
Sourcefn add_entry_point(&mut self, from: BasicBlock, to: DropIdx)
fn add_entry_point(&mut self, from: BasicBlock, to: DropIdx)
Registers from
as an entry point to this drop tree, at to
.
During Self::build_mir
, from
will be linked to the corresponding
block within the drop tree.
Sourcefn build_mir<'tcx, T: DropTreeBuilder<'tcx>>(
&mut self,
cfg: &mut CFG<'tcx>,
blocks: &mut IndexVec<DropIdx, Option<BasicBlock>>,
)
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.
Sourcefn assign_blocks<'tcx, T: DropTreeBuilder<'tcx>>(
&mut self,
cfg: &mut CFG<'tcx>,
blocks: &mut IndexVec<DropIdx, Option<BasicBlock>>,
)
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.
fn link_blocks<'tcx>( &self, cfg: &mut CFG<'tcx>, blocks: &IndexSlice<DropIdx, Option<BasicBlock>>, )
Trait Implementations§
Auto Trait Implementations§
impl DynSend for DropTree
impl DynSync for DropTree
impl Freeze for DropTree
impl RefUnwindSafe for DropTree
impl Send for DropTree
impl Sync for DropTree
impl Unpin for DropTree
impl UnwindSafe for DropTree
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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