[project @ 2000-04-25 11:27:35 by rrt]
[ghc-hetmet.git] / ghc / rts / StgCRun.c
index 4ebfcf0..09a8016 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgCRun.c,v 1.14 2000/03/08 10:58:38 simonmar Exp $
+ * $Id: StgCRun.c,v 1.18 2000/04/17 14:46:31 sewardj Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -67,36 +67,35 @@ static jmp_buf jmp_environment;
 
 extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
 {
-    jmp_buf save_buf;
-    /* Save jmp_environment for previous call to miniInterpret  */
-    memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf));
-    if (setjmp(jmp_environment) == 0) {
-       while ( 1 ) {
-            IF_DEBUG(evaluator,
-                    fprintf(stderr,"Jumping to ");
-                    printPtr((P_)f);
-                    fprintf(stderr,"\n");
-                    );
-           f = (StgFunPtr) (f)();
-       }
-    }
-    /* Restore jmp_environment for previous call */
-    memcpy((void*) save_buf, (void*) jmp_environment, sizeof(jmp_buf));
-
-    return (StgThreadReturnCode)R1.i;
+   while (f) {
+      IF_DEBUG(evaluator,
+              fprintf(stderr,"Jumping to ");
+              printPtr((P_)f);
+              fprintf(stderr,"\n");
+             );
+      f = (StgFunPtr) (f)();
+   }
+   return (StgThreadReturnCode)R1.i;
 }
 
 EXTFUN(StgReturn)
 {
-    longjmp(jmp_environment, 1);
+   return 0;
 }
 
 #else
 
+#define CHECK_STACK   0
+#define STACK_DETAILS 0
+
+static int enters = 0;
+
 static void scanStackSeg ( W_* ptr, int nwords )
 {
    W_ w;
+#if CHECK_STACK
    int nwords0 = nwords;
+#if STACK_DETAILS
    while (nwords > 0) {
       w = *ptr;
       if (IS_ARG_TAG(w)) {
@@ -109,80 +108,104 @@ static void scanStackSeg ( W_* ptr, int nwords )
       }
    }
    if (nwords < 0) fprintf(stderr, "erk: nwords < 0\n");
+#endif
    checkStackChunk ( ptr, ptr-nwords0 );
+#endif
 }
 
-
+extern StgFunPtr stg_enterStackTop;
 extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
 {
     char* nm;
     while (1) {
 
-#define STACK_DETAILS 0
-
-#if STACK_DETAILS
+#if CHECK_STACK
    {
    int i;
-   StgWord* sp  = basereg->rSp;
-   StgWord* su  = basereg->rSu;
    StgTSO*  tso = basereg->rCurrentTSO;
    StgWord* sb  = tso->stack + tso->stack_size;
+   StgWord* sp;
+   StgWord* su;
    int ws;
 
-   fprintf(stderr, "== SP = %p   SU = %p\n", sp,su);
+   if (f == &stg_enterStackTop) {
+      sp = tso->sp;
+      su = tso->su;
+   } else {
+      sp  = basereg->rSp;
+      su  = basereg->rSu;
+   }
+
+#if STACK_DETAILS
+   fprintf(stderr, 
+           "== SB = %p   SP = %p(%p)   SU = %p   SpLim = %p(%p)\n", 
+           sb, sp, tso->sp,   su, basereg->rSpLim, tso->splim);
+#endif
 
    if (su >= sb) goto postloop;
    if (!sp || !su) goto postloop;
 
-   //printStack ( sp, sb, su);
+   printStack ( sp, sb, su);
 
    while (1) {
       ws = su - sp;
       switch (get_itbl((StgClosure*)su)->type) {
          case STOP_FRAME: 
             scanStackSeg(sp,ws);
+#if STACK_DETAILS
             fprintf(stderr, "S%d ",ws); 
             fprintf(stderr, "\n");
+#endif
             goto postloop;
          case UPDATE_FRAME: 
             scanStackSeg(sp,ws);
+#if STACK_DETAILS
             fprintf(stderr,"U%d ",ws); 
+#endif
             sp = su + sizeofW(StgUpdateFrame);
             su = ((StgUpdateFrame*)su)->link;
             break;
          case SEQ_FRAME: 
             scanStackSeg(sp,ws);
+#if STACK_DETAILS
             fprintf(stderr,"Q%d ",ws); 
+#endif
             sp = su + sizeofW(StgSeqFrame);
             su = ((StgSeqFrame*)su)->link;
             break;
          case CATCH_FRAME: 
             scanStackSeg(sp,ws);
+#if STACK_DETAILS
             fprintf(stderr,"C%d ",ws); 
+#endif
             sp = su + sizeofW(StgCatchFrame);
             su = ((StgCatchFrame*)su)->link;
             break;
          default:
             fprintf(stderr, "?\nweird record on stack\n");
+            assert(0);
             goto postloop;
       }
    }
    postloop:
    }
-#endif    
-
+#endif
 #if STACK_DETAILS
        fprintf(stderr,"\n");
 #endif
-       fprintf(stderr,"-- enter: ");
+#if 1
+       fprintf(stderr,"-- enter %p ", f);
        nm = nameFromOPtr ( f );
-       if (nm)
-            fprintf(stderr, "%s (%p)", nm, f); else
-            printPtr((P_)f);
+          if (nm) fprintf(stderr, "%s", nm); else
+          printPtr((P_)f);
        fprintf ( stderr, "\n");
+#endif
 #if STACK_DETAILS
        fprintf(stderr,"\n");
 #endif
+    zzz:
+       if (enters % 1000 == 0) fprintf(stderr, "%d enters\n",enters);
+       enters++;
        f = (StgFunPtr) (f)();
        if (!f) break;
     }