Struct ThreadExceptionState
pub struct ThreadExceptionState { /* private fields */ }Expand description
Per-thread exception handling state.
This structure tracks the complete exception handling state for a single emulated thread. It manages the current exception, pending cleanup handlers, filter evaluation, and control flow during exception processing.
§Responsibilities
- Tracking the active exception and its information
- Managing the queue of pending finally blocks
- Handling filter clause evaluation state
- Processing rethrow requests from catch handlers
- Tracking leave instruction targets through finally blocks
§Lifecycle
- Create with
new()(orDefault::default()) - Set exception with
set_exception()when thrown - Push finally blocks with
push_finally() - Pop and execute finally blocks with
pop_finally() - Enter catch with
enter_catch()to handle exception - Clear with
clear()when exception is fully handled
§Example
let mut state = ThreadExceptionState::new();
// Exception thrown
state.set_exception(exception_info);
// Queue finally blocks found during search
state.push_finally(method, offset, Some(leave_target));
// Execute finally blocks
while let Some(finally) = state.pop_finally() {
// Execute finally handler...
}
// Enter catch handler
state.enter_catch();Implementations§
§impl ThreadExceptionState
impl ThreadExceptionState
pub fn new() -> Self
pub fn new() -> Self
Creates a new exception state with no active exception.
§Returns
A new ThreadExceptionState in the initial (no exception) state.
pub fn has_exception(&self) -> bool
pub fn has_exception(&self) -> bool
pub fn exception(&self) -> Option<&ExceptionInfo>
pub fn exception(&self) -> Option<&ExceptionInfo>
Gets a reference to the current exception information.
§Returns
A reference to the ExceptionInfo if an exception is active, or None.
pub fn get_exception_value(&self) -> Option<EmValue>
pub fn get_exception_value(&self) -> Option<EmValue>
pub fn set_exception(&mut self, exception: ExceptionInfo)
pub fn set_exception(&mut self, exception: ExceptionInfo)
Sets the current exception.
This should be called when an exception is thrown. It sets the exception info and enters exception handling mode.
§Arguments
exception- The exception information to set
pub fn take_exception(&mut self) -> Option<ExceptionInfo>
pub fn take_exception(&mut self) -> Option<ExceptionInfo>
Takes (consumes) the current exception.
Removes the exception from this state and returns it. Also clears the handling flag.
§Returns
The exception info if one was active, or None.
pub fn take_exception_as_value(&mut self) -> Option<EmValue>
pub fn take_exception_as_value(&mut self) -> Option<EmValue>
pub fn clear(&mut self)
pub fn clear(&mut self)
Clears all exception state.
Resets the exception state to its initial condition, clearing the exception, pending finally blocks, filter state, and all other fields. Call this when an exception has been fully handled or when resetting the thread state.
pub fn is_handling(&self) -> bool
pub fn is_handling(&self) -> bool
Checks if exception handling is in progress.
§Returns
true if currently handling an exception (from throw until catch or propagation).
pub fn push_finally(
&mut self,
method: Token,
handler_offset: u32,
leave_target: Option<u32>,
)
pub fn push_finally( &mut self, method: Token, handler_offset: u32, leave_target: Option<u32>, )
Pushes a pending finally block onto the execution queue.
Finally blocks are executed in LIFO order (last pushed = first executed).
§Arguments
method- The method containing the finally blockhandler_offset- The IL offset of the finally handlerleave_target- Optional target offset forleaveinstructions
pub fn pop_finally(&mut self) -> Option<PendingFinally>
pub fn pop_finally(&mut self) -> Option<PendingFinally>
Pops and returns the next pending finally block.
Returns the most recently pushed finally block (LIFO order).
§Returns
The next finally block to execute, or None if no blocks are pending.
pub fn has_pending_finally(&self) -> bool
pub fn has_pending_finally(&self) -> bool
Checks if there are pending finally blocks.
§Returns
true if there are finally blocks waiting to be executed.
pub fn pending_finally_count(&self) -> usize
pub fn pending_finally_count(&self) -> usize
pub fn request_rethrow(&mut self)
pub fn request_rethrow(&mut self)
Requests a rethrow of the current exception.
Called when a rethrow instruction is executed inside a catch handler.
The exception will be propagated again after executing any pending
finally blocks.
pub fn take_rethrow_request(&mut self) -> bool
pub fn take_rethrow_request(&mut self) -> bool
Takes and clears the rethrow request.
This method checks if a rethrow was requested and clears the flag. It should be called after exiting a catch handler to determine if the exception should be propagated.
§Returns
true if a rethrow was requested since the last check.
pub fn enter_catch(&mut self)
pub fn enter_catch(&mut self)
Enters a catch handler, clearing the exception state.
Called when execution transfers to a catch handler. The exception is considered handled and the state is cleared.
Note: Use enter_catch_handler if you
need to support rethrow from within the catch block.
pub fn enter_finally(&mut self)
pub fn enter_finally(&mut self)
Enters a finally handler.
Called when execution transfers to a finally handler. Exception state is preserved during finally execution.
pub fn exit_finally(&mut self, exception_to_restore: Option<ExceptionInfo>)
pub fn exit_finally(&mut self, exception_to_restore: Option<ExceptionInfo>)
Exits a finally handler.
Called when a finally handler completes (via endfinally). If a
rethrow was requested, restores the exception for continued propagation.
§Arguments
exception_to_restore- The exception to restore if rethrow was requested
pub fn leave_target(&self) -> Option<u32>
pub fn leave_target(&self) -> Option<u32>
Gets the leave target offset.
§Returns
The target IL offset for a pending leave instruction, or None.
pub fn set_leave_target(&mut self, target: Option<u32>)
pub fn set_leave_target(&mut self, target: Option<u32>)
Sets the leave target offset.
Called when a leave instruction is encountered and finally blocks
must execute before reaching the target.
§Arguments
target- The target offset, orNoneto clear
pub fn take_leave_target(&mut self) -> Option<u32>
pub fn take_leave_target(&mut self) -> Option<u32>
Takes the leave target (returns and clears it).
§Returns
The leave target offset if one was set, or None.
pub fn enter_filter(&mut self, handler_offset: u32)
pub fn enter_filter(&mut self, handler_offset: u32)
Enters filter evaluation mode with the given handler offset.
Call this when starting to evaluate a filter clause. The handler_offset is stored so that if the filter accepts, execution can transfer to it.
§Arguments
handler_offset- The IL offset of the handler to enter if filter accepts
pub fn set_in_filter(&mut self, in_filter: bool)
pub fn set_in_filter(&mut self, in_filter: bool)
Sets the filter evaluation state.
§Arguments
in_filter-truewhen entering filter evaluation,falsewhen exiting
§Note
Prefer using enter_filter when entering a filter,
as it also stores the handler offset. Use set_in_filter(false) to exit.
pub fn filter_handler_offset(&self) -> Option<u32>
pub fn filter_handler_offset(&self) -> Option<u32>
Gets the handler offset for the current filter.
If currently evaluating a filter and the filter accepts, execution should transfer to this offset.
§Returns
The handler offset if in a filter, or None.
pub fn filter_result(&self) -> Option<bool>
pub fn filter_result(&self) -> Option<bool>
Gets the filter evaluation result.
§Returns
Some(true)- Filter accepted, enter the handlerSome(false)- Filter rejected, continue searchingNone- Filter not yet evaluated
pub fn set_filter_result(&mut self, result: Option<bool>)
pub fn set_filter_result(&mut self, result: Option<bool>)
Sets the filter evaluation result.
Called after evaluating the filter code to record whether the handler should be entered.
§Arguments
result- The filter result (Some(true)to accept,Some(false)to reject)
pub fn exception_origin_offset(&self) -> Option<u32>
pub fn exception_origin_offset(&self) -> Option<u32>
Gets the exception origin offset.
This is the IL offset where the exception was originally thrown, used for handler search during rethrow.
§Returns
The origin offset if set, or None.
pub fn current_handler_offset(&self) -> Option<u32>
pub fn current_handler_offset(&self) -> Option<u32>
Gets the current handler offset.
This is the IL offset of the handler currently executing, used to skip it during rethrow handler search.
§Returns
The handler offset if set, or None.
pub fn current_handler_method(&self) -> Option<Token>
pub fn current_handler_method(&self) -> Option<Token>
Returns the method that owns the current catch handler.
pub fn enter_catch_handler(
&mut self,
method: Token,
origin_offset: u32,
handler_offset: u32,
)
pub fn enter_catch_handler( &mut self, method: Token, origin_offset: u32, handler_offset: u32, )
Enters a catch handler with tracking for rethrow support.
Unlike enter_catch, this preserves the exception
value to support the rethrow instruction within the catch block.
§Arguments
method- The method token that owns this catch handlerorigin_offset- The IL offset where the exception was thrownhandler_offset- The IL offset of this catch handler
pub fn leave_catch_handler(&mut self)
pub fn leave_catch_handler(&mut self)
Leaves a catch handler normally via leave instruction.
Called when exiting a catch handler through normal control flow (not via rethrow). Clears exception-related state.
pub fn in_unwind_finally(&self) -> bool
pub fn in_unwind_finally(&self) -> bool
Returns whether we are currently in a finally block entered during exception unwinding.
pub fn set_in_unwind_finally(&mut self, in_unwind: bool)
pub fn set_in_unwind_finally(&mut self, in_unwind: bool)
Sets the unwind-finally state.
Set to true when entering a finally block during exception unwinding.
Set to false when the finally completes normally via endfinally.
pub fn exception_mut(&mut self) -> Option<&mut ExceptionInfo>
pub fn exception_mut(&mut self) -> Option<&mut ExceptionInfo>
Gets a mutable reference to the current exception info.
Used to build stack traces during unwinding without consuming the exception.
pub fn replace_exception_in_unwind_finally(
&mut self,
new_exception: ExceptionInfo,
)
pub fn replace_exception_in_unwind_finally( &mut self, new_exception: ExceptionInfo, )
Handles a new exception thrown during an unwind-finally.
Per ECMA-335 §II.12.4.2.5: the old exception is abandoned and the new exception replaces it. The pending finally queue is cleared since the old unwind chain is no longer relevant.
pub fn clear_exception(&mut self)
pub fn clear_exception(&mut self)
Clears exception-related state when fully handled.
Clears the filter result and handler tracking but does not affect other state like pending finally blocks.
Trait Implementations§
§impl Clone for ThreadExceptionState
impl Clone for ThreadExceptionState
§fn clone(&self) -> ThreadExceptionState
fn clone(&self) -> ThreadExceptionState
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for ThreadExceptionState
impl Debug for ThreadExceptionState
§impl Default for ThreadExceptionState
impl Default for ThreadExceptionState
§fn default() -> ThreadExceptionState
fn default() -> ThreadExceptionState
Auto Trait Implementations§
impl Freeze for ThreadExceptionState
impl RefUnwindSafe for ThreadExceptionState
impl Send for ThreadExceptionState
impl Sync for ThreadExceptionState
impl Unpin for ThreadExceptionState
impl UnsafeUnpin for ThreadExceptionState
impl UnwindSafe for ThreadExceptionState
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for T
impl<T> Downcast for T
impl<T> ErasedDestructor for Twhere
T: 'static,
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<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.