pub struct ResultsCursor<'mir, 'tcx, A>where
A: Analysis<'tcx>,{
body: &'mir Body<'tcx>,
results: ResultsHandle<'mir, 'tcx, A>,
state: A::Domain,
pos: CursorPosition,
state_needs_reset: bool,
reachable_blocks: BitSet<BasicBlock>,
}
Expand description
Allows random access inspection of the results of a dataflow analysis. Use this when you want
to inspect domain values only in certain locations; use ResultsVisitor
if you want to inspect
domain values in many or all locations.
Because Results
only has domain values for the entry of each basic block, these inspections
involve some amount of domain value recomputations. This cursor only has linear performance
within a basic block when its statements are visited in the same order as the DIRECTION
of
the analysis. In the worst case—when statements are visited in reverse order—performance will
be quadratic in the number of statements in the block. The order in which basic blocks are
inspected has no impact on performance.
Fields§
§body: &'mir Body<'tcx>
§results: ResultsHandle<'mir, 'tcx, A>
§state: A::Domain
§pos: CursorPosition
§state_needs_reset: bool
Indicates that state
has been modified with a custom effect.
When this flag is set, we need to reset to an entry set before doing a seek.
reachable_blocks: BitSet<BasicBlock>
Implementations§
Source§impl<'mir, 'tcx, A> ResultsCursor<'mir, 'tcx, A>where
A: Analysis<'tcx>,
impl<'mir, 'tcx, A> ResultsCursor<'mir, 'tcx, A>where
A: Analysis<'tcx>,
Sourcepub fn new(
body: &'mir Body<'tcx>,
results: ResultsHandle<'mir, 'tcx, A>,
) -> Self
pub fn new( body: &'mir Body<'tcx>, results: ResultsHandle<'mir, 'tcx, A>, ) -> Self
Returns a new cursor that can inspect results
.
Sourcepub fn mut_results(&mut self) -> &mut Results<'tcx, A>
pub fn mut_results(&mut self) -> &mut Results<'tcx, A>
Returns the underlying Results
.
Sourcepub fn mut_analysis(&mut self) -> &mut A
pub fn mut_analysis(&mut self) -> &mut A
Returns the Analysis
used to generate the underlying Results
.
Sourcepub(super) fn seek_to_block_entry(&mut self, block: BasicBlock)
pub(super) fn seek_to_block_entry(&mut self, block: BasicBlock)
Resets the cursor to hold the entry set for the given basic block.
For forward dataflow analyses, this is the dataflow state prior to the first statement.
For backward dataflow analyses, this is the dataflow state after the terminator.
Sourcepub fn seek_to_block_start(&mut self, block: BasicBlock)
pub fn seek_to_block_start(&mut self, block: BasicBlock)
Resets the cursor to hold the state prior to the first statement in a basic block.
For forward analyses, this is the entry set for the given block.
For backward analyses, this is the state that will be propagated to its predecessors (ignoring edge-specific effects).
Sourcepub fn seek_to_block_end(&mut self, block: BasicBlock)
pub fn seek_to_block_end(&mut self, block: BasicBlock)
Resets the cursor to hold the state after the terminator in a basic block.
For backward analyses, this is the entry set for the given block.
For forward analyses, this is the state that will be propagated to its successors (ignoring edge-specific effects).
Sourcepub fn seek_before_primary_effect(&mut self, target: Location)
pub fn seek_before_primary_effect(&mut self, target: Location)
Advances the cursor to hold the dataflow state at target
before its “primary” effect is
applied.
The “early” effect at the target location will be applied.
Sourcepub fn seek_after_primary_effect(&mut self, target: Location)
pub fn seek_after_primary_effect(&mut self, target: Location)
Advances the cursor to hold the dataflow state at target
after its “primary” effect is
applied.
The “early” effect at the target location will be applied as well.
fn seek_after(&mut self, target: Location, effect: Effect)
Sourcepub fn apply_custom_effect(&mut self, f: impl FnOnce(&mut A, &mut A::Domain))
pub fn apply_custom_effect(&mut self, f: impl FnOnce(&mut A, &mut A::Domain))
Applies f
to the cursor’s internal state.
This can be used, e.g., to apply the call return effect directly to the cursor without creating an extra copy of the dataflow state.
Auto Trait Implementations§
impl<'mir, 'tcx, A> DynSend for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> DynSync for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> Freeze for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> !RefUnwindSafe for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> Send for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> Sync for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> Unpin for ResultsCursor<'mir, 'tcx, A>
impl<'mir, 'tcx, A> !UnwindSafe for ResultsCursor<'mir, 'tcx, A>
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
Source§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
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§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<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.