[project @ 1999-10-08 14:16:15 by simonmar]
[ghc-hetmet.git] / ghc / rts / Sanity.c
index 1260f8c..920530a 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Sanity.c,v 1.9 1999/02/05 16:02:52 simonm Exp $
+ * $Id: Sanity.c,v 1.14 1999/05/21 14:37:12 sof Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -23,8 +23,7 @@
 #include "BlockAlloc.h"
 #include "Sanity.h"
 
-#define LOOKS_LIKE_PTR(r) \
-  (IS_DATA_PTR(r) || ((IS_USER_PTR(r) && Bdescr((P_)r)->free != (void *)-1)))
+#define LOOKS_LIKE_PTR(r) (LOOKS_LIKE_STATIC_CLOSURE(r) || ((HEAP_ALLOCED(r) && Bdescr((P_)r)->free != (void *)-1)))
 
 /* -----------------------------------------------------------------------------
    Check stack sanity
@@ -36,7 +35,7 @@ StgOffset checkStackObject( StgPtr sp );
 
 void      checkStackChunk( StgPtr sp, StgPtr stack_end );
 
-static StgOffset checkSmallBitmap(  StgPtr payload, StgNat32 bitmap );
+static StgOffset checkSmallBitmap(  StgPtr payload, StgWord32 bitmap );
 
 static StgOffset checkLargeBitmap( StgPtr payload, 
                                   StgLargeBitmap* large_bitmap );
@@ -44,7 +43,7 @@ static StgOffset checkLargeBitmap( StgPtr payload,
 void checkClosureShallow( StgClosure* p );
 
 static StgOffset 
-checkSmallBitmap( StgPtr payload, StgNat32 bitmap )
+checkSmallBitmap( StgPtr payload, StgWord32 bitmap )
 {
     StgOffset i;
 
@@ -61,12 +60,12 @@ checkSmallBitmap( StgPtr payload, StgNat32 bitmap )
 static StgOffset 
 checkLargeBitmap( StgPtr payload, StgLargeBitmap* large_bitmap )
 {
-    StgNat32 bmp;
+    StgWord32 bmp;
     StgOffset i;
 
     i = 0;
     for (bmp=0; bmp<large_bitmap->size; bmp++) {
-       StgNat32 bitmap = large_bitmap->bitmap[bmp];
+       StgWord32 bitmap = large_bitmap->bitmap[bmp];
        for(; bitmap != 0; ++i, bitmap >>= 1 ) {
            if ((bitmap & 1) == 0) {
                checkClosure(stgCast(StgClosure*,payload[i]));
@@ -85,7 +84,7 @@ checkStackClosure( StgClosure* c )
     switch (info->type) {
     case RET_DYN: /* Dynamic bitmap: the mask is stored on the stack */
        {
-           StgRetDyn* r = stgCast(StgRetDyn*,c);
+           StgRetDyn* r = (StgRetDyn *)c;
            return sizeofW(StgRetDyn) + 
                   checkSmallBitmap(r->payload,r->liveness);
        }
@@ -96,13 +95,10 @@ checkStackClosure( StgClosure* c )
     case CATCH_FRAME:
     case STOP_FRAME:
     case SEQ_FRAME:
-           return sizeofW(StgClosure) + 
-                  checkSmallBitmap((StgPtr)c->payload,info->layout.bitmap);
+           return 1 + checkSmallBitmap((StgPtr)c + 1,info->layout.bitmap);
     case RET_BIG: /* large bitmap (> 32 entries) */
     case RET_VEC_BIG:
-           return sizeofW(StgClosure) + 
-                  checkLargeBitmap((StgPtr)c->payload,
-                                   info->layout.large_bitmap);
+           return 1 + checkLargeBitmap((StgPtr)c + 1,info->layout.large_bitmap);
     case FUN:
     case FUN_STATIC: /* probably a slow-entry point return address: */
            return 1;
@@ -110,7 +106,7 @@ checkStackClosure( StgClosure* c )
                    /* if none of the above, maybe it's a closure which looks a
                     * little like an infotable
                     */
-           checkClosureShallow(*stgCast(StgClosure**,c));
+           checkClosureShallow(*(StgClosure **)c);
            return 1;
            /* barf("checkStackClosure: weird activation record found on stack (%p).",c); */
     }
@@ -237,6 +233,10 @@ checkClosure( StgClosure* p )
     case CAF_UNENTERED:
     case CAF_ENTERED:
     case CAF_BLACKHOLE:
+#ifdef TICKY_TICKY
+    case SE_CAF_BLACKHOLE:
+    case SE_BLACKHOLE:
+#endif
     case BLACKHOLE:
     case BLACKHOLE_BQ:
     case FOREIGN:
@@ -264,7 +264,7 @@ checkClosure( StgClosure* p )
       { StgWeak *w = (StgWeak *)p;
        ASSERT(LOOKS_LIKE_PTR(w->key));
        ASSERT(LOOKS_LIKE_PTR(w->value));
-       ASSERT(LOOKS_LIKE_PTR(w->finaliser));
+       ASSERT(LOOKS_LIKE_PTR(w->finalizer));
        if (w->link) {
          ASSERT(LOOKS_LIKE_PTR(w->link));
        }
@@ -368,7 +368,7 @@ checkHeap(bdescr *bd, StgPtr start)
 
        /* skip over slop */
        while (p < bd->free &&
-              (*p == 0 || !LOOKS_LIKE_GHC_INFO(*p))) { p++; } 
+              (*p == 0 || !LOOKS_LIKE_GHC_INFO((void*)*p))) { p++; } 
       }
       bd = bd->link;
       if (bd != NULL) {