Skip to main content

ThreadExceptionState

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

  1. Create with new() (or Default::default())
  2. Set exception with set_exception() when thrown
  3. Push finally blocks with push_finally()
  4. Pop and execute finally blocks with pop_finally()
  5. Enter catch with enter_catch() to handle exception
  6. 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

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

Checks if there is an active exception.

§Returns

true if an exception is currently active.

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>

Gets the current exception as an EmValue.

§Returns

Some(EmValue::ObjectRef(...)) if an exception is active, None otherwise.

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>

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>

Takes (consumes) the exception as an EmValue.

Removes the exception from this state and returns it as an EmValue. Also clears the handling flag.

§Returns

Some(EmValue::ObjectRef(...)) if an exception was active, None otherwise.

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

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>, )

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 block
  • handler_offset - The IL offset of the finally handler
  • leave_target - Optional target offset for leave instructions

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

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

Gets the number of pending finally blocks.

§Returns

The count of finally blocks in the queue.

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

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)

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)

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>)

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>

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>)

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, or None to clear

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 in_filter(&self) -> bool

Checks if currently in filter evaluation.

§Returns

true if currently evaluating a filter clause.

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)

Sets the filter evaluation state.

§Arguments
  • in_filter - true when entering filter evaluation, false when 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>

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>

Gets the filter evaluation result.

§Returns
  • Some(true) - Filter accepted, enter the handler
  • Some(false) - Filter rejected, continue searching
  • None - Filter not yet evaluated

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>

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>

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>

Returns the method that owns the current catch handler.

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 handler
  • origin_offset - The IL offset where the exception was thrown
  • handler_offset - The IL offset of this catch handler

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

Returns whether we are currently in a finally block entered during exception unwinding.

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>

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, )

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)

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

§

fn clone(&self) -> ThreadExceptionState

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for ThreadExceptionState

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
§

impl Default for ThreadExceptionState

§

fn default() -> ThreadExceptionState

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

Gets the type name of self
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: AsAny + ?Sized,

Source§

fn is<T>(&self) -> bool
where T: AsAny,

Returns true if the boxed type is the same as T. Read more
Source§

fn downcast_ref<T>(&self) -> Option<&T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T, A> IntoAst<A> for T
where T: Into<A>, A: Ast,

Source§

fn into_ast(self, _a: &A) -> A

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryClone for T
where T: Clone,

Source§

fn try_clone(&self) -> Result<T, Error>

Clones self, possibly returning an error.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more