Struct miri::Stack

source ·
pub struct Stack {
    borrows: Vec<Item>,
    unknown_bottom: Option<BorTag>,
    cache: StackCache,
    unique_range: Range<usize>,
}
Expand description

Extra per-location state.

Fields§

§borrows: Vec<Item>

Used mostly as a stack; never empty. Invariants:

  • Above a SharedReadOnly there can only be more SharedReadOnly.
  • Except for Untagged, no tag occurs in the stack more than once.
§unknown_bottom: Option<BorTag>

If this is Some(id), then the actual current stack is unknown. This can happen when wildcard pointers are used to access this location. What we do know is that borrows are at the top of the stack, and below it are arbitrarily many items whose tag is strictly less than id. When the bottom is unknown, borrows always has a SharedReadOnly or Unique at the bottom; we never have the unknown-to-known boundary in an SRW group.

§cache: StackCache

A small LRU cache of searches of the borrow stack.

§unique_range: Range<usize>

On a read, we need to disable all Unique above the granting item. We can avoid most of this scan by keeping track of the region of the borrow stack that may contain Uniques.

Implementations§

Panics if any of the caching mechanisms have broken,

  • The StackCache indices don’t refer to the parallel items,
  • There are no Unique items outside of first_unique..last_unique

Find the item granting the given kind of access to the given tag, and return where it is on the stack. For wildcard tags, the given index is approximate, but if no index is given it means the match was not in the known part of the stack. Ok(None) indicates it matched the “unknown” part of the stack. Err indicates it was not found.

Construct a new Stack using the passed Item as the base tag.

Find all Unique elements in this borrow stack above granting_idx, pass a copy of them to the visitor, then set their Permission to Disabled.

Produces an iterator which iterates over range in reverse, and when dropped removes that range of Items from this Stack.

Core per-location operations: access, dealloc, reborrow.

Find the first write-incompatible item above the given one – i.e, find the height to which the stack will be truncated when writing to granting.

The given item was invalidated – check its protectors for whether that will cause UB.

Test if a memory access using pointer tagged tag is granted. If yes, return the index of the item that granted it. range refers the entire operation, and offset refers to the specific offset into the allocation that we are currently checking.

Deallocate a location: Like a write access, but also there must be no active protectors at all because we will remove all items.

Derive a new pointer from one with the given tag.

access indicates which kind of memory access this retag itself should correspond to.

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

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

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion 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: 560 bytes