Fixes to account for the new layout of MUT_ARR_PTRS (see #650)
authorSimon Marlow <marlowsd@gmail.com>
Mon, 21 Dec 2009 11:52:49 +0000 (11:52 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 21 Dec 2009 11:52:49 +0000 (11:52 +0000)
rts/sm/Compact.c

index 0a695ca..315eda7 100644 (file)
@@ -511,13 +511,13 @@ update_fwd_large( bdescr *bd )
     case MUT_ARR_PTRS_FROZEN0:
       // follow everything 
       {
     case MUT_ARR_PTRS_FROZEN0:
       // follow everything 
       {
-       StgPtr next;
+          StgMutArrPtrs *a;
 
 
-       next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
-       for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
-           thread((StgClosure **)p);
-       }
-       continue;
+          a = (StgMutArrPtrs*)p;
+          for (p = (P_)a->payload; p < (P_)&a->payload[a->ptrs]; p++) {
+              thread((StgClosure **)p);
+          }
+          continue;
       }
 
     case TSO:
       }
 
     case TSO:
@@ -692,13 +692,14 @@ thread_obj (StgInfoTable *info, StgPtr p)
     case MUT_ARR_PTRS_FROZEN0:
        // follow everything 
     {
     case MUT_ARR_PTRS_FROZEN0:
        // follow everything 
     {
-       StgPtr next;
-       
-       next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
-       for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
+        StgMutArrPtrs *a;
+
+        a = (StgMutArrPtrs *)p;
+       for (p = (P_)a->payload; p < (P_)&a->payload[a->ptrs]; p++) {
            thread((StgClosure **)p);
        }
            thread((StgClosure **)p);
        }
-       return p;
+
+       return (StgPtr)a + mut_arr_ptrs_sizeW(a);
     }
     
     case TSO:
     }
     
     case TSO: