pub trait UnwindContextStorage<T: ReaderOffset>: Sized {
type Rules: ArrayLike<Item = (Register, RegisterRule<T>)>;
type Stack: ArrayLike<Item = UnwindTableRow<T, Self>>;
}
Expand description
Specification of what storage should be used for UnwindContext
.
Normally you would only need to use StoreOnHeap
, which places the stack
on the heap using Box
. This is the default storage type parameter for UnwindContext
.
You may want to supply your own storage type for one of the following reasons:
- In rare cases you may run into failed unwinds due to the fixed stack size
used by
StoreOnHeap
, so you may want to try a largerBox
. If denial of service is not a concern, then you could also try aVec
-based stack which can grow as needed. - You may want to avoid heap allocations entirely. You can use a fixed-size
stack with in-line arrays, which will place the entire storage in-line into
UnwindContext
.
Here’s an implementation which uses a fixed-size stack and allocates everything in-line,
which will cause UnwindContext
to be large:
struct StoreOnStack;
impl<T: ReaderOffset> UnwindContextStorage<T> for StoreOnStack {
type Rules = [(Register, RegisterRule<T>); 192];
type Stack = [UnwindTableRow<T, Self>; 4];
}
let mut ctx = UnwindContext::<_, StoreOnStack>::new_in();
// Initialize the context by evaluating the CIE's initial instruction program,
// and generate the unwind table.
let mut table = some_fde.rows(&eh_frame, &bases, &mut ctx)?;
while let Some(row) = table.next_row()? {
// Do stuff with each row...
}
Required Associated Types§
Sourcetype Rules: ArrayLike<Item = (Register, RegisterRule<T>)>
type Rules: ArrayLike<Item = (Register, RegisterRule<T>)>
The storage used for register rules in a unwind table row.
Note that this is nested within the stack.
Sourcetype Stack: ArrayLike<Item = UnwindTableRow<T, Self>>
type Stack: ArrayLike<Item = UnwindTableRow<T, Self>>
The storage used for unwind table row stack.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.