* Copyright (c) 1994-2000.
*
* $RCSfile: Interpreter.c,v $
- * $Revision: 1.29 $
- * $Date: 2001/08/09 11:23:19 $
+ * $Revision: 1.34 $
+ * $Date: 2002/02/15 22:15:08 $
* ---------------------------------------------------------------------------*/
+#if !defined(SMP)
+#include "PosixSource.h"
+#else
+/* Hack and slash.. */
+#include "Stg.h"
+#endif
#include "Rts.h"
#include "RtsAPI.h"
#include "RtsUtils.h"
#define BCO_ITBL(n) itbls[n]
#define LOAD_STACK_POINTERS \
- iSp = cap->rCurrentTSO->sp; \
- iSu = cap->rCurrentTSO->su; \
+ iSp = cap->r.rCurrentTSO->sp; \
+ iSu = cap->r.rCurrentTSO->su; \
/* We don't change this ... */ \
- iSpLim = cap->rCurrentTSO->stack + RESERVED_STACK_WORDS;
+ iSpLim = cap->r.rCurrentTSO->stack + RESERVED_STACK_WORDS;
#define SAVE_STACK_POINTERS \
- cap->rCurrentTSO->sp = iSp; \
- cap->rCurrentTSO->su = iSu;
+ cap->r.rCurrentTSO->sp = iSp; \
+ cap->r.rCurrentTSO->su = iSu;
#define RETURN(retcode) \
SAVE_STACK_POINTERS; return retcode;
// checkSanity(1);
// iSp--; StackWord(0) = obj;
- // checkStack(iSp,cap->rCurrentTSO->stack+cap->rCurrentTSO->stack_size,iSu);
+ // checkStack(iSp,cap->r.rCurrentTSO->stack+cap->r.rCurrentTSO->stack_size,iSu);
// iSp++;
- printStack(iSp,cap->rCurrentTSO->stack+cap->rCurrentTSO->stack_size,iSu);
+ printStack(iSp,cap->r.rCurrentTSO->stack+cap->r.rCurrentTSO->stack_size,iSu);
fprintf(stderr, "\n\n");
);
/* Heap check */
if (doYouWantToGC()) {
iSp--; StackWord(0) = (W_)bco;
- cap->rCurrentTSO->what_next = ThreadEnterInterp;
+ cap->r.rCurrentTSO->what_next = ThreadEnterInterp;
RETURN(HeapOverflow);
}
if (iSp - (INTERP_STACK_CHECK_THRESH+1) < iSpLim) {
iSp--;
StackWord(0) = (W_)obj;
- cap->rCurrentTSO->what_next = ThreadEnterInterp;
+ cap->r.rCurrentTSO->what_next = ThreadEnterInterp;
RETURN(StackOverflow);
}
if (context_switch) {
iSp--;
StackWord(0) = (W_)obj;
- cap->rCurrentTSO->what_next = ThreadEnterInterp;
+ cap->r.rCurrentTSO->what_next = ThreadEnterInterp;
RETURN(ThreadYielding);
}
IF_DEBUG(evaluator,
//if (do_print_stack) {
//fprintf(stderr, "\n-- BEGIN stack\n");
- //printStack(iSp,cap->rCurrentTSO->stack+cap->rCurrentTSO->stack_size,iSu);
+ //printStack(iSp,cap->r.rCurrentTSO->stack+cap->r.rCurrentTSO->stack_size,iSu);
//fprintf(stderr, "-- END stack\n\n");
//}
do_print_stack = 1;
fprintf(stderr, "%d %p\n", i, (StgPtr)(*(iSp+i)));
fprintf(stderr,"\n");
}
- //if (do_print_stack) checkStack(iSp,cap->rCurrentTSO->stack+cap->rCurrentTSO->stack_size,iSu);
+ //if (do_print_stack) checkStack(iSp,cap->r.rCurrentTSO->stack+cap->r.rCurrentTSO->stack_size,iSu);
);
# ifdef INTERP_STATS
if (iSp - stk_words_reqd < iSpLim) {
iSp--;
StackWord(0) = (W_)obj;
- cap->rCurrentTSO->what_next = ThreadEnterInterp;
+ cap->r.rCurrentTSO->what_next = ThreadEnterInterp;
RETURN(StackOverflow);
}
goto nextInsn;
fprintf(stderr,"\tBuilt ");
printObj((StgClosure*)pap);
);
- cap->rCurrentTSO->what_next = ThreadEnterGHC;
+ cap->r.rCurrentTSO->what_next = ThreadEnterGHC;
RETURN(ThreadYielding);
}
case bci_PUSH_L: {
StgInfoTable* magic_itbl = BCO_ITBL(o_itoc_itbl);
if (magic_itbl != NULL) {
StackWord(0) = (W_)magic_itbl;
- cap->rCurrentTSO->what_next = ThreadRunGHC;
+ cap->r.rCurrentTSO->what_next = ThreadRunGHC;
RETURN(ThreadYielding);
} else {
/* Special case -- returning a VoidRep to
tag and enter the itbl. */
ASSERT(StackWord(0) == (W_)NULL);
iSp ++;
- cap->rCurrentTSO->what_next = ThreadRunGHC;
+ cap->r.rCurrentTSO->what_next = ThreadRunGHC;
RETURN(ThreadYielding);
}
}
int o_itbl = BCO_NEXT;
void(*marshall_fn)(void*) = (void (*)(void*))BCO_LIT(o_itbl);
SAVE_STACK_POINTERS;
- tok = suspendThread(cap);
+ tok = suspendThread(&cap->r,rtsFalse);
marshall_fn ( (void*)(& StackWord(0) ) );
- cap = resumeThread(tok);
+ cap = (Capability *)((void *)resumeThread(tok,rtsFalse) - sizeof(StgFunTable));
LOAD_STACK_POINTERS;
goto nextInsn;
}
printObj(obj);
);
iSp--; StackWord(0) = (W_)obj;
- cap->rCurrentTSO->what_next = ThreadEnterGHC;
+ cap->r.rCurrentTSO->what_next = ThreadEnterGHC;
RETURN(ThreadYielding);
}
} /* switch on object kind */