Commit ce9d03fa authored by simonmar's avatar simonmar
Browse files

[project @ 2006-01-03 12:56:10 by simonmar]

two fixes for the case when a (synchronous) exception is propagated to
the top of a thread's stack, i.e. it is unhandled.

  1. store the exception in the right place (we were using the
     OFFSET_StgTSO_stack macro and not accounting for the TSO's
     header size)

  2. put an stg_enter_info on the stack so that the GC can understand
     this thread's stack.
parent c1fa1f50
......@@ -378,10 +378,15 @@ retry_pop_stack:
}
if (frame_type == STOP_FRAME) {
/* We've stripped the entire stack, the thread is now dead. */
Sp = CurrentTSO + OFFSET_StgTSO_stack
+ WDS(StgTSO_stack_size(CurrentTSO)) - WDS(1);
Sp(0) = R1; /* save the exception */
/*
* We've stripped the entire stack, the thread is now dead.
* We will leave the stack in a GC'able state, see the stg_stop_thread
* entry code in StgStartup.cmm.
*/
Sp = CurrentTSO + TSO_OFFSET_StgTSO_stack
+ WDS(StgTSO_stack_size(CurrentTSO)) - WDS(2);
Sp(1) = R1; /* save the exception */
Sp(0) = stg_enter_info; /* so that GC can traverse this stack */
StgTSO_what_next(CurrentTSO) = ThreadKilled::I16;
SAVE_THREAD_STATE(); /* inline! */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment