- StgWord* p = MainRegTable.rSp;
-fprintf(stderr, "SP = %p\n", p);
- p += (8-1);
- for (i = 0; i < 8; i++, p--)
- fprintf (stderr, "-- %p: %p\n", p, *p );
-}
+ 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:
+ }