* Copyright (c) 1994-2000.
*
* $RCSfile: Interpreter.c,v $
- * $Revision: 1.17 $
- * $Date: 2001/02/11 17:51:07 $
+ * $Revision: 1.21 $
+ * $Date: 2001/03/21 10:56:04 $
* ---------------------------------------------------------------------------*/
#include "Rts.h"
case SEQ_FRAME:
/* Too complicated ... adopt the Usual Solution. */
- fprintf(stderr, "!!! SEQ frame in PAP update\n");
+ /* fprintf(stderr, "!!! SEQ frame in PAP update\n"); */
goto defer_to_sched;
case CATCH_FRAME:
ap = (StgAP_UPD*)allocate_UPD(request);
StackWord(-1) = (W_)ap;
ap->n_args = n_payload;
- SET_HDR(ap, &stg_AP_UPD_info, ??)
+ SET_HDR(ap, &stg_AP_UPD_info, CCS_SYSTEM/*ToDo*/)
iSp --;
goto nextInsn;
}
if (ret_itbl == (StgInfoTable*)&stg_ctoi_ret_R1p_info
|| ret_itbl == (StgInfoTable*)&stg_ctoi_ret_R1n_info
|| ret_itbl == (StgInfoTable*)&stg_ctoi_ret_F1_info
- || ret_itbl == (StgInfoTable*)&stg_ctoi_ret_D1_info) {
+ || ret_itbl == (StgInfoTable*)&stg_ctoi_ret_D1_info
+ || ret_itbl == (StgInfoTable*)&stg_ctoi_ret_V_info) {
/* Returning to interpreted code. Interpret the BCO
immediately underneath the itbl. */
StgBCO* ret_bco = (StgBCO*)StackWord(tag +1+1);
the TOS value into R1/F1/D1 and do a standard
compiled-code return. */
StgInfoTable* magic_itbl = BCO_ITBL(o_itoc_itbl);
- StackWord(0) = (W_)magic_itbl;
- cap->rCurrentTSO->what_next = ThreadRunGHC;
- RETURN(ThreadYielding);
+ if (magic_itbl != NULL) {
+ StackWord(0) = (W_)magic_itbl;
+ cap->rCurrentTSO->what_next = ThreadRunGHC;
+ RETURN(ThreadYielding);
+ } else {
+ /* Special case -- returning a VoidRep to
+ compiled code. T.O.S is the VoidRep tag,
+ and underneath is the return itbl. Zap the
+ tag and enter the itbl. */
+ ASSERT(StackWord(0) == (W_)NULL);
+ iSp ++;
+ cap->rCurrentTSO->what_next = ThreadRunGHC;
+ RETURN(ThreadYielding);
+ }
}
}
+ case bci_JMP: {
+ /* BCO_NEXT modifies bciPtr, so be conservative. */
+ int nextpc = BCO_NEXT;
+ bciPtr = nextpc;
+ goto nextInsn;
+ }
case bci_CASEFAIL:
barf("interpretBCO: hit a CASEFAIL");