_Unwind_ForcedUnwind
raises an exception
for forced unwinding, passing along the given exception
object, which should have its
exception_class and
exception_cleanup fields set. The exception
object has been allocated by the language-specific
runtime, and has a language-specific format, except that it shall contain an
_Unwind_Exception
struct.
Forced unwinding is a single-phase process. stop and stop_parameter control the termination of the unwind process instead of the usual personality routine query. stop is called for each unwind frame, with the parameteres described for the usual personality routine below, plus an additional stop_parameter.
When stop identifies the destination frame, it
transfers control to the user code as appropriate without returning,
normally after calling _Unwind_DeleteException
. If not,
then it should return an _Unwind_Reason_Code value.
If stop returns any reason code other than
_URC_NO_REASON, then the stack state is indeterminate
from the point of view of the caller of
_Unwind_ForcedUnwind
. Rather than attempt to return,
therefore, the unwind library should use the
exception_cleanup
entry in the exception, and then
call abort
.
This is not the destination from. The unwind runtime will call frame's
personality routine with the _UA_FORCE_UNWIND
and _UA_CLEANUP_PHASE flag set in
actions, and then unwind to the next frame
and call the stop
function again.
In order to allow _Unwind_ForcedUnwind
to
perform special processing when it reaches the end of the stack, the
unwind runtime will call it after the last frame is rejected, with a
NULL
stack pointer in the context, and the
stop
function shall catch this condition. It may
return this code if it cannot handle end-of-stack.
The stop
function may return this code for other fatal
conditions like stack corruption.