- if (nwords < 0) fprintf(stderr, "erk: nwords < 0\n");
- checkStackChunk ( ptr, ptr-nwords0 );
-}
-
-
-extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
-{
- char* nm;
- while (1) {
-
-// #define STACK_DETAILS 0 // I like details -- HWL
-
-#if STACK_DETAILS
- {
- int i;
- StgWord* sp = basereg->rSp;
- StgWord* su = basereg->rSu;
- StgTSO* tso = basereg->rCurrentTSO;
- StgWord* sb = tso->stack + tso->stack_size;
- int ws;
-
- fprintf(stderr, "== SP = %p SU = %p\n", sp,su);
-
- if (su >= sb) goto postloop;
- if (!sp || !su) goto postloop;
-
- //printStack ( sp, sb, su);
-
- while (1) {
- ws = su - sp;
- switch (get_itbl((StgClosure*)su)->type) {
- case STOP_FRAME:
- scanStackSeg(sp,ws);
- fprintf(stderr, "S%d ",ws);
- fprintf(stderr, "\n");
- goto postloop;
- case UPDATE_FRAME:
- scanStackSeg(sp,ws);
- fprintf(stderr,"U%d ",ws);
- sp = su + sizeofW(StgUpdateFrame);
- su = ((StgUpdateFrame*)su)->link;
- break;
- case SEQ_FRAME:
- scanStackSeg(sp,ws);
- fprintf(stderr,"Q%d ",ws);
- sp = su + sizeofW(StgSeqFrame);
- su = ((StgSeqFrame*)su)->link;
- break;
- case CATCH_FRAME:
- scanStackSeg(sp,ws);
- fprintf(stderr,"C%d ",ws);
- sp = su + sizeofW(StgCatchFrame);
- su = ((StgCatchFrame*)su)->link;
- break;
- default:
- fprintf(stderr, "?\nweird record on stack\n");
- goto postloop;
- }
- }
- postloop:
- }
-#endif
-
-#if STACK_DETAILS
- fprintf(stderr,"\n");
-#endif
- fprintf(stderr,"-- enter: ");
- nm = nameFromOPtr ( f );
- if (nm)
- fprintf(stderr, "%s (%p)", nm, f); else
- printPtr((P_)f);
- fprintf ( stderr, "\n");
-#if STACK_DETAILS
- fprintf(stderr,"\n");
-#endif
- f = (StgFunPtr) (f)();
- if (!f) break;
- }
- fprintf (stderr, "miniInterpreter: bye!\n\n" );
- return (StgThreadReturnCode)R1.i;