[project @ 1996-01-11 14:06:51 by partain]
[ghc-hetmet.git] / ghc / runtime / storage / SMscan.lc
index 35f1b05..35534bb 100644 (file)
@@ -61,7 +61,8 @@ Inplace_Compaction(base, lim, scanbase, scanlim, bit_array, bit_array_words
 #endif
 {
     BitWord *bit_array_ptr, *bit_array_end;
-    P_ scan_w_start, info; I_ size;
+    P_ scan_w_start, info;
+    I_ size;
 
     LinkLim = lim;  /* Only checked for generational collection */
 
@@ -118,12 +119,6 @@ Inplace_Compaction(base, lim, scanbase, scanlim, bit_array, bit_array_words
                    info = next;
                }
                INFO_PTR(Scan) = (W_) info;
-/*
-if (SM_trace & 8) {
-    fprintf(stderr, "  Marked: word %ld, val 0x%lx, cur 0x%lx, Scan_w 0x%lx, Scan 0x%lx, Info 0x%lx, Code 0x%lx\n",
-           (bit_array_ptr-1) - bit_array, *(bit_array_ptr-1), w, scan_w_start, Scan, info,
-           SCAN_LINK_CODE(info)); };
-*/
 
                size = (*SCAN_LINK_CODE(info))();
 
@@ -175,29 +170,17 @@ if (SM_trace & 8) {
                w >>= 1;
 
            } else {    /* Bit Set -- Enter ScanMove for closure*/
-/*HACK if (SM_trace&8) {fprintf(stderr,"Scan=%x\n",Scan);} */
                info = (P_) INFO_PTR(Scan);
-/*HACK if (SM_trace&8) {fprintf(stderr,"info=%x\n",info);} */
                while (MARKED_LOCATION(info)) {
                    P_ next;
                    info = UNMARK_LOCATION(info);
                     next = (P_) *info;
-/*HACK     if (SM_trace&8) {fprintf(stderr,"next=%x\n",next);} */
                    DEBUG_UNLINK_LOCATION(info, Scan, New);
-/*HACK     if (SM_trace&8) {fprintf(stderr,"New=%x\n",New);} */
                    *info = (W_) New;
                    info = next;
-/*HACK     if (SM_trace&8) {fprintf(stderr,"*info=%x,info=%x\n",*info,info);} */
                }
-/*HACK if (SM_trace&8) {fprintf(stderr,"preNew info=%x\n",info);} */
                INFO_PTR(New) = (W_) info;
 
-/*
-if (SM_trace & 8) {
-    fprintf(stderr, "  Marked: word %ld, cur 0x%lx, Scan_w 0x%lx, Scan 0x%lx, Info 0x%lx, Code 0x%lx\n",
-           (bit_array_ptr-1) - bit_array, w, scan_w_start, Scan, info, SCAN_MOVE_CODE(info)); };
-*/
-
                size = (*SCAN_MOVE_CODE(info))();
                New  += size;  /* set New address of next closure */
                Scan += size;  /* skip size bits */  
@@ -356,15 +339,15 @@ LinkLim -- The limit of the heap requiring to be linked & moved
 #endif                               
 
 
-#if defined(_GC_DEBUG)
+#if defined(DEBUG)
 
 #define DEBUG_SCAN_LINK(type, sizevar, ptrvar) \
-    if (SM_trace & 2)                  \
+    if (RTSflags.GcFlags.trace & DEBUG_TRACE_MINOR_GC)                  \
         fprintf(stderr, "Scan Link (%s): 0x%lx -> 0x%lx, info 0x%lx, size %ld, ptrs %ld\n", \
                type, Scan, New, INFO_PTR(Scan), sizevar, ptrvar)
 
 #define DEBUG_SCAN_MOVE(type, sizevar) \
-    if (SM_trace & 2)            \
+    if (RTSflags.GcFlags.trace & DEBUG_TRACE_MINOR_GC)            \
         fprintf(stderr, "Scan Move (%s): 0x%lx -> 0x%lx, info 0x%lx, size %ld\n", \
                type, Scan, New, INFO_PTR(New), sizevar)
 
@@ -378,106 +361,128 @@ LinkLim -- The limit of the heap requiring to be linked & moved
 
 /*** LINKING CLOSURES ***/
 
+#ifdef TICKY_TICKY
 I_
-_ScanLink_1_0(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 1, 0);
-    return(FIXED_HS + 1);      /* SPEC_VHS is defined to be 0, so "size" really is 1 */
+_ScanLink_0_0(STG_NO_ARGS) {
+    I_ size = 0; /* NB: SPEC_VHS is *defined* to be zero */
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
+#endif
+
 I_
-_ScanLink_2_0(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 2, 0);
-    return(FIXED_HS + 2);
+_ScanLink_1_0(STG_NO_ARGS) {
+    I_ size = 1; /* NB: SPEC_VHS is *defined* to be zero */
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_3_0(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 3, 0);
-    return(FIXED_HS + 3);
+_ScanLink_1_1(STG_NO_ARGS) {
+    I_ size = 1;
+    DEBUG_SCAN_LINK("SPEC", size, 1);
+    SPEC_LINK_LOCATION(1);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_4_0(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 4, 0);
-    return(FIXED_HS + 4);
+_ScanLink_2_0(STG_NO_ARGS) {
+    I_ size = 2;
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_5_0(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 5, 0);
-    return(FIXED_HS + 5);
-}
-
-I_
 _ScanLink_2_1(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 2, 1);
+    I_ size = 2;
+    DEBUG_SCAN_LINK("SPEC", size, 1);
     SPEC_LINK_LOCATION(1);
-    return(FIXED_HS + 2);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_3_1(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 3, 1);
+_ScanLink_2_2(STG_NO_ARGS) {
+    I_ size = 2;
+    DEBUG_SCAN_LINK("SPEC", size, 2);
     SPEC_LINK_LOCATION(1);
-    return(FIXED_HS + 3);
+    SPEC_LINK_LOCATION(2);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_3_2(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 3, 2);
-    SPEC_LINK_LOCATION(1);
-    SPEC_LINK_LOCATION(2);
-    return(FIXED_HS + 3);
+_ScanLink_3_0(STG_NO_ARGS) {
+    I_ size = 3;
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
-
 I_
-_ScanLink_1_1(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 1, 1);
+_ScanLink_3_1(STG_NO_ARGS) {
+    I_ size = 3;
+    DEBUG_SCAN_LINK("SPEC", size, 1);
     SPEC_LINK_LOCATION(1);
-    return(FIXED_HS + 1);
+    return(FIXED_HS + size);
 }
 I_
-_ScanLink_2_2(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 2, 2);
+_ScanLink_3_2(STG_NO_ARGS) {
+    I_ size = 3;
+    DEBUG_SCAN_LINK("SPEC", size, 2);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
-    return(FIXED_HS + 2);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_3_3(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 3, 3);
+    I_ size = 3;
+    DEBUG_SCAN_LINK("SPEC", size, 3);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
-    return(FIXED_HS + 3);
+    return(FIXED_HS + size);
+}
+I_
+_ScanLink_4_0(STG_NO_ARGS) {
+    I_ size = 4;
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_4_4(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 4, 4);
+    I_ size = 4;
+    DEBUG_SCAN_LINK("SPEC", size, 4);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
     SPEC_LINK_LOCATION(4);
-    return(FIXED_HS + 4);
+    return(FIXED_HS + size);
+}
+I_
+_ScanLink_5_0(STG_NO_ARGS) {
+    I_ size = 5;
+    DEBUG_SCAN_LINK("SPEC", size, 0);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_5_5(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 5, 5);
+    I_ size = 5;
+    DEBUG_SCAN_LINK("SPEC", size, 5);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
     SPEC_LINK_LOCATION(4);
     SPEC_LINK_LOCATION(5);
-    return(FIXED_HS + 5);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_6_6(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 6, 6);
+    I_ size = 6;
+    DEBUG_SCAN_LINK("SPEC", size, 6);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
     SPEC_LINK_LOCATION(4);
     SPEC_LINK_LOCATION(5);
     SPEC_LINK_LOCATION(6);
-    return(FIXED_HS + 6);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_7_7(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 7, 7);
+    I_ size = 7;
+    DEBUG_SCAN_LINK("SPEC", size, 7);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -485,11 +490,12 @@ _ScanLink_7_7(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(5);
     SPEC_LINK_LOCATION(6);
     SPEC_LINK_LOCATION(7);
-    return(FIXED_HS + 7);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_8_8(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 8, 8);
+    I_ size = 8;
+    DEBUG_SCAN_LINK("SPEC", size, 8);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -498,11 +504,12 @@ _ScanLink_8_8(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(6);
     SPEC_LINK_LOCATION(7);
     SPEC_LINK_LOCATION(8);
-    return(FIXED_HS + 8);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_9_9(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 9, 9);
+    I_ size = 9;
+    DEBUG_SCAN_LINK("SPEC", size, 9);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -512,11 +519,12 @@ _ScanLink_9_9(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(7);
     SPEC_LINK_LOCATION(8);
     SPEC_LINK_LOCATION(9);
-    return(FIXED_HS + 9);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_10_10(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 10, 10);
+    I_ size = 10;
+    DEBUG_SCAN_LINK("SPEC", size, 10);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -527,11 +535,12 @@ _ScanLink_10_10(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(8);
     SPEC_LINK_LOCATION(9);
     SPEC_LINK_LOCATION(10);
-    return(FIXED_HS + 10);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_11_11(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 11, 11);
+    I_ size = 11;
+    DEBUG_SCAN_LINK("SPEC", size, 11);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -543,11 +552,12 @@ _ScanLink_11_11(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(9);
     SPEC_LINK_LOCATION(10);
     SPEC_LINK_LOCATION(11);
-    return(FIXED_HS + 11);
+    return(FIXED_HS + size);
 }
 I_
 _ScanLink_12_12(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("SPEC", 12, 12);
+    I_ size = 12;
+    DEBUG_SCAN_LINK("SPEC", size, 12);
     SPEC_LINK_LOCATION(1);
     SPEC_LINK_LOCATION(2);
     SPEC_LINK_LOCATION(3);
@@ -560,7 +570,7 @@ _ScanLink_12_12(STG_NO_ARGS) {
     SPEC_LINK_LOCATION(10);
     SPEC_LINK_LOCATION(11);
     SPEC_LINK_LOCATION(12);
-    return(FIXED_HS + 12);
+    return(FIXED_HS + size);
 }
 \end{code}
 
@@ -572,94 +582,95 @@ Scan-linking revertible black holes with underlying @SPEC@ closures.
 I_ 
 _ScanLink_RBH_2_1(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 2, 1);
+    I_ size = 2 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
-    return(FIXED_HS + 2); /* ???? but SPEC_RBH_VHS is *not* zero! */
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_3_1(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 3, 1);
+    I_ size = 3 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
-    return(FIXED_HS + 3);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_3_3(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 3, 3);
+    I_ size = 3 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 3);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
-    return(FIXED_HS + 3);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_4_1(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 4, 1);
+    I_ size = 4 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
-    return(FIXED_HS + 4);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_4_4(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 4, 4);
+    I_ size = 4 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 4);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
-    return(FIXED_HS + 4);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_5_1(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 5, 1);
+    I_ size = 5 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
-    return(FIXED_HS + 5);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_5_5(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 5, 5);
+    I_ size = 5 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 5);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 3);
-    return(FIXED_HS + 5);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_6_6(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 6, 6);
+    I_ size = 6 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 6);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 3);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 4);
-    return(FIXED_HS + 6);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_7_7(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 7, 7);
+    I_ size = 7 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 7);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 3);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 4);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 5);
-    return(FIXED_HS + 7);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_8_8(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 8, 8);
+    I_ size = 8 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 8);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
@@ -667,13 +678,13 @@ _ScanLink_RBH_8_8(STG_NO_ARGS)
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 4);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 5);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 6);
-    return(FIXED_HS + 8);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_9_9(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 9, 9);
+    I_ size = 9 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 9);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
@@ -682,13 +693,13 @@ _ScanLink_RBH_9_9(STG_NO_ARGS)
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 5);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 6);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 7);
-    return(FIXED_HS + 9);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_10_10(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 10, 10);
+    I_ size = 10 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 10);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
@@ -698,13 +709,13 @@ _ScanLink_RBH_10_10(STG_NO_ARGS)
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 6);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 7);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 8);
-    return(FIXED_HS + 10);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_11_11(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 11, 11);
+    I_ size = 11 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 11);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
@@ -715,13 +726,13 @@ _ScanLink_RBH_11_11(STG_NO_ARGS)
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 7);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 8);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 9);
-    return(FIXED_HS + 11);
+    return(FIXED_HS + size);
 }
-
 I_ 
 _ScanLink_RBH_12_12(STG_NO_ARGS)
 {
-    DEBUG_SCAN_LINK("SRBH", 12, 12);
+    I_ size = 12 + SPEC_RBH_VHS;
+    DEBUG_SCAN_LINK("SRBH", size, 12);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 1);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 2);
@@ -733,10 +744,9 @@ _ScanLink_RBH_12_12(STG_NO_ARGS)
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 8);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 9);
     LINK_LOCATION(SPEC_RBH_BQ_LOCN + 10);
-    return(FIXED_HS + 12);
+    return(FIXED_HS + size);
 }
 #endif
-
 \end{code}
 
 Scan-linking a MallocPtr is straightforward: exactly the same as
@@ -744,10 +754,11 @@ Scan-linking a MallocPtr is straightforward: exactly the same as
 
 \begin{code}
 #ifndef PAR
-StgInt
+I_
 _ScanLink_MallocPtr(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("MallocPtr", MallocPtr_SIZE, 0);
-    return(FIXED_HS + MallocPtr_SIZE);
+    I_ size = MallocPtr_SIZE;
+    DEBUG_SCAN_LINK("MallocPtr", size, 0);
+    return(FIXED_HS + size);
 }
 #endif /* !PAR */
 \end{code}
@@ -758,54 +769,69 @@ Back to the main feature...
 
 /*** MOVING CLOSURES ***/
 
+#ifdef TICKY_TICKY
+I_
+_ScanMove_0(STG_NO_ARGS) {
+    I_ size = 0; /* NB: SPEC_VHS defined to be zero, so 0 really is the "size" */
+    DEBUG_SCAN_MOVE("CONST", size);
+    SLIDE_FIXED_HDR;
+    return(FIXED_HS + size);
+}
+#endif
 I_
 _ScanMove_1(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 1);
+    I_ size = 1; /* NB: SPEC_VHS defined to be zero, so 1 really is the "size" */
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
-    return(FIXED_HS + 1); /* NB: SPEC_VHS defined to be zero, so 1 really is the "size" */
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_2(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 2);
+    I_ size = 2;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
-    return(FIXED_HS + 2);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_3(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 3);
+    I_ size = 3;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
     SPEC_SLIDE_WORD(3);
-    return(FIXED_HS + 3);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_4(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 4);
+    I_ size = 4;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
     SPEC_SLIDE_WORD(3);
     SPEC_SLIDE_WORD(4);
-    return(FIXED_HS + 4);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_5(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 5);
+    I_ size = 5;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
     SPEC_SLIDE_WORD(3);
     SPEC_SLIDE_WORD(4);
     SPEC_SLIDE_WORD(5);
-    return(FIXED_HS + 5);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_6(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 6);
+    I_ size = 6;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -813,11 +839,12 @@ _ScanMove_6(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(4);
     SPEC_SLIDE_WORD(5);
     SPEC_SLIDE_WORD(6);
-    return(FIXED_HS + 6);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_7(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 7);
+    I_ size = 7;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -826,11 +853,12 @@ _ScanMove_7(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(5);
     SPEC_SLIDE_WORD(6);
     SPEC_SLIDE_WORD(7);
-    return(FIXED_HS + 7);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_8(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 8);
+    I_ size = 8;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -840,11 +868,12 @@ _ScanMove_8(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(6);
     SPEC_SLIDE_WORD(7);
     SPEC_SLIDE_WORD(8);
-    return(FIXED_HS + 8);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_9(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 9);
+    I_ size = 9;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -855,11 +884,12 @@ _ScanMove_9(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(7);
     SPEC_SLIDE_WORD(8);
     SPEC_SLIDE_WORD(9);
-    return(FIXED_HS + 9);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_10(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 10);
+    I_ size = 10;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -871,11 +901,12 @@ _ScanMove_10(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(8);
     SPEC_SLIDE_WORD(9);
     SPEC_SLIDE_WORD(10);
-    return(FIXED_HS + 10);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_11(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 11);
+    I_ size = 11;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -888,11 +919,12 @@ _ScanMove_11(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(9);
     SPEC_SLIDE_WORD(10);
     SPEC_SLIDE_WORD(11);
-    return(FIXED_HS + 11);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_12(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SPEC", 12);
+    I_ size = 12;
+    DEBUG_SCAN_MOVE("SPEC", size);
     SLIDE_FIXED_HDR;
     SPEC_SLIDE_WORD(1);
     SPEC_SLIDE_WORD(2);
@@ -906,13 +938,14 @@ _ScanMove_12(STG_NO_ARGS) {
     SPEC_SLIDE_WORD(10);
     SPEC_SLIDE_WORD(11);
     SPEC_SLIDE_WORD(12);
-    return(FIXED_HS + 12);
+    return(FIXED_HS + size);
 }
 
 #if defined(PAR) && defined(GC_MUT_REQUIRED)
 I_
 _ScanMove_RBH_2(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 2);
+    I_ size = 2 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
 
@@ -920,11 +953,12 @@ _ScanMove_RBH_2(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 2); /* ???? SPEC_RBH_VHS is *not* zero! */
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_3(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 3);
+    I_ size = 3 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -933,11 +967,12 @@ _ScanMove_RBH_3(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 3);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_4(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 4);
+    I_ size = 4 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -947,11 +982,12 @@ _ScanMove_RBH_4(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 4);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_5(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 5);
+    I_ size = 5 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -962,11 +998,12 @@ _ScanMove_RBH_5(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 5);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_6(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 6);
+    I_ size = 6 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -978,11 +1015,12 @@ _ScanMove_RBH_6(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 6);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_7(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 7);
+    I_ size = 7 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -995,11 +1033,12 @@ _ScanMove_RBH_7(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 7);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_8(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 8);
+    I_ size = 8 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -1013,11 +1052,12 @@ _ScanMove_RBH_8(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 8);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_9(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 9);
+    I_ size = 9 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -1032,11 +1072,12 @@ _ScanMove_RBH_9(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 9);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_10(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 10);
+    I_ size = 10 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -1052,11 +1093,12 @@ _ScanMove_RBH_10(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 10);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_11(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 11);
+    I_ size = 11 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -1073,11 +1115,12 @@ _ScanMove_RBH_11(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 11);
+    return(FIXED_HS + size);
 }
 I_
 _ScanMove_RBH_12(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("SRBH", 12);
+    I_ size = 12 + SPEC_RBH_VHS;
+    DEBUG_SCAN_MOVE("SRBH", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(SPEC_RBH_HS + 0);
     SLIDE_WORD(SPEC_RBH_HS + 1);
@@ -1095,7 +1138,7 @@ _ScanMove_RBH_12(STG_NO_ARGS) {
     MUT_LINK(New) = (W_) StorageMgrInfo.OldMutables;
     StorageMgrInfo.OldMutables = (P_) New;
 
-    return(FIXED_HS + 12);
+    return(FIXED_HS + size);
 }
 #endif
 \end{code}
@@ -1106,12 +1149,13 @@ new MallocPtr list.
 
 \begin{code}
 #ifndef PAR
-StgInt
+I_
 _ScanMove_MallocPtr(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("MallocPtr", MallocPtr_SIZE);
+    I_ size = MallocPtr_SIZE;
+    DEBUG_SCAN_MOVE("MallocPtr", size);
 
-#if defined(_GC_DEBUG)
-    if (SM_trace & 16) {
+#if defined(DEBUG)
+    if (RTSflags.GcFlags.trace & DEBUG_TRACE_MALLOCPTRS) {
       printf("Moving MallocPtr(%x)=<%x,%x,%x>", Scan, Scan[0], Scan[1], Scan[2]);
       printf(" Data = %x, Next = %x\n", 
             MallocPtr_CLOSURE_DATA(Scan), MallocPtr_CLOSURE_LINK(Scan) );
@@ -1122,8 +1166,8 @@ _ScanMove_MallocPtr(STG_NO_ARGS) {
     MallocPtr_SLIDE_DATA;
     MallocPtr_RELINK;
 
-#if defined(_GC_DEBUG)
-    if (SM_trace & 16) {
+#if defined(DEBUG)
+    if (RTSflags.GcFlags.trace & DEBUG_TRACE_MALLOCPTRS) {
       printf("Moved MallocPtr(%x)=<%x,_,%x,%x,%x>", New, New[0], New[1], New[2], New[3]);
       printf(" Data = %x, Next = %x", 
             MallocPtr_CLOSURE_DATA(New), MallocPtr_CLOSURE_LINK(New) );
@@ -1131,7 +1175,7 @@ _ScanMove_MallocPtr(STG_NO_ARGS) {
     }
 #endif
 
-    return(FIXED_HS + MallocPtr_SIZE);
+    return(FIXED_HS + size);
 }
 #endif /* !PAR */
 \end{code}
@@ -1373,48 +1417,50 @@ _ScanMove_Data(STG_NO_ARGS) {
 
 I_
 _ScanLink_BH_U(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("BH  ", MIN_UPD_SIZE, 0);
-    return(FIXED_HS + BH_U_SIZE); /* size includes _VHS */
-    /* NB: pretty intimate knowledge about BH closure layout */
+    I_ size = BH_U_SIZE;
+    DEBUG_SCAN_LINK("BH  ", size, 0);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_BH_U(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("BH  ", MIN_UPD_SIZE);
+    I_ size = BH_U_SIZE;
+    DEBUG_SCAN_MOVE("BH  ", size);
     SLIDE_FIXED_HDR;
-    return(FIXED_HS  + BH_U_SIZE);
-    /* ditto */
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanLink_BH_N(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("BH N", MIN_NONUPD_SIZE, 0);
-    return(FIXED_HS + BH_N_SIZE); /* size includes _VHS */
-    /* NB: pretty intimate knowledge about BH closure layout */
+    I_ size = BH_N_SIZE;
+    DEBUG_SCAN_LINK("BH N", size, 0);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_BH_N(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("BH N",MIN_NONUPD_SIZE);
+    I_ size = BH_N_SIZE;
+    DEBUG_SCAN_MOVE("BH N", size);
     SLIDE_FIXED_HDR;
-    return(FIXED_HS + BH_N_SIZE);
-    /* ditto */
+    return(FIXED_HS + size);
 }
 
-#ifdef USE_COST_CENTRES
+#if defined(PROFILING) || defined(TICKY_TICKY)
 I_
 _ScanLink_PI(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("PI  ", IND_CLOSURE_SIZE(dummy), 1);
+    I_ size = IND_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_LINK("PI  ", size, 1);
     LINK_LOCATION(IND_HS);
-    return(FIXED_HS + IND_CLOSURE_SIZE(dummy) /*MIN_UPD_SIZE*/);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_PI(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("PI  ", IND_CLOSURE_SIZE(dummy));
+    I_ size = IND_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_MOVE("PI  ", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(IND_HS);
-    return(FIXED_HS + IND_CLOSURE_SIZE(dummy) /*MIN_UPD_SIZE*/);
+    return(FIXED_HS + size);
 }
 #endif
 
@@ -1430,13 +1476,15 @@ Linking and Marking Routines for FetchMes and stack objects.
 
 I_
 _ScanLink_FetchMe(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("FME ", MIN_UPD_SIZE, 0);
-    return(FIXED_HS + FETCHME_CLOSURE_SIZE(dummy) /*MIN_UPD_SIZE*/);
+    I_ size = FETCHME_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_LINK("FME ", size, 0);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_FetchMe(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("FME ",MIN_UPD_SIZE);
+    I_ size = FETCHME_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_MOVE("FME ", size);
     SLIDE_FIXED_HDR;
     SLIDE_WORD(FETCHME_GA_LOCN);
     ASSERT(GALAlookup(FETCHME_GA(New)) != NULL);
@@ -1447,23 +1495,25 @@ _ScanMove_FetchMe(STG_NO_ARGS) {
     StorageMgrInfo.OldMutables = (P_) New;
 #endif
 
-    return(FIXED_HS + FETCHME_CLOSURE_SIZE(dummy) /*MIN_UPD_SIZE*/);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanLink_BF(STG_NO_ARGS) 
 {
-    DEBUG_SCAN_LINK("BF", BF_HS, 2 /*possibly wrong (WDP 95/07)*/);
+    I_ size = BF_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_LINK("BF", size, 2);
 
     LINK_LOCATION(BF_LINK_LOCN);
     LINK_LOCATION(BF_NODE_LOCN);
-    return(FIXED_HS + BF_CLOSURE_SIZE(dummy));
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_BF(STG_NO_ARGS) 
 {
     I_ count;
+    I_ size = BF_CLOSURE_SIZE(dummy);
 
     SLIDE_FIXED_HDR;
     for (count = FIXED_HS; count < FIXED_HS + BF_VHS; count++) {
@@ -1481,21 +1531,23 @@ _ScanMove_BF(STG_NO_ARGS)
     StorageMgrInfo.OldMutables = (P_) New;
 #endif
 
-    return(FIXED_HS + BF_CLOSURE_SIZE(dummy));
+    return(FIXED_HS + size);
 }
 
 #endif /* PAR */
 
 I_
 _ScanLink_BQ(STG_NO_ARGS) {
-    DEBUG_SCAN_LINK("BQ  ", BQ_CLOSURE_SIZE(dummy), BQ_CLOSURE_NoPTRS(Scan));
+    I_ size = BQ_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_LINK("BQ  ", size, BQ_CLOSURE_NoPTRS(Scan));
     LINK_LOCATION(BQ_HS);
-    return(FIXED_HS + BQ_CLOSURE_SIZE(dummy));
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_BQ(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("BQ  ", BQ_CLOSURE_SIZE(dummy));
+    I_ size = BQ_CLOSURE_SIZE(dummy);
+    DEBUG_SCAN_MOVE("BQ  ", size);
 
     SLIDE_FIXED_HDR;
     SLIDE_WORD(BQ_HS);
@@ -1506,7 +1558,7 @@ _ScanMove_BQ(STG_NO_ARGS) {
     StorageMgrInfo.OldMutables = (P_) New;
 #endif
 
-    return(FIXED_HS + BQ_CLOSURE_SIZE(dummy));
+    return(FIXED_HS + size);
 }
 
 I_
@@ -1515,8 +1567,9 @@ _ScanLink_TSO(STG_NO_ARGS)
     STGRegisterTable *r = TSO_INTERNAL_PTR(Scan);
     W_ liveness = r->rLiveness;
     I_ i;
+    I_ size = TSO_VHS + TSO_CTS_SIZE;
 
-    DEBUG_SCAN_LINK("TSO", TSO_HS + TSO_CTS_SIZE, 0/*wrong*/);
+    DEBUG_SCAN_LINK("TSO", size, 0/*wrong*/);
 
     LINK_LOCATION(TSO_LINK_LOCN);
     LINK_LOCATION(((P_) &r->rStkO) - Scan);
@@ -1525,13 +1578,14 @@ _ScanLink_TSO(STG_NO_ARGS)
            LINK_LOCATION(((P_) &r->rR[i].p) - Scan)
        }
     }
-    return(TSO_HS + TSO_CTS_SIZE);
+    return(FIXED_HS + size);
 }
 
 I_
 _ScanMove_TSO(STG_NO_ARGS) 
 {
     I_ count;
+    I_ size = TSO_VHS + TSO_CTS_SIZE;
 
     SLIDE_FIXED_HDR;
     for (count = FIXED_HS; count < FIXED_HS + TSO_VHS; count++) {
@@ -1548,7 +1602,7 @@ _ScanMove_TSO(STG_NO_ARGS)
     StorageMgrInfo.OldMutables = (P_) New;
 #endif
 
-    return(TSO_HS + TSO_CTS_SIZE);
+    return(FIXED_HS + size);
 }
 
 I_
@@ -1562,7 +1616,7 @@ _ScanLink_StkO(STG_NO_ARGS) {
     LINK_LOCATION(STKO_LINK_LOCN);
 
     /* Link the locations in the A stack */
-    DEBUG_SCAN_LINK("STKO", size, cts_size - STKO_SpA_OFFSET(SCAN) + 1);
+    DEBUG_SCAN_LINK("STKO", size, cts_size - STKO_SpA_OFFSET(Scan) + 1);
     for (count = STKO_SpA_OFFSET(Scan); count <= cts_size; count++) {
        STKO_LINK_LOCATION(count);
     }
@@ -1576,10 +1630,8 @@ _ScanLink_StkO(STG_NO_ARGS) {
        sub = STKO_CLOSURE_OFFSET(Scan, subptr);
     }
 
-    /*
-       I assume what's wanted is the size of the object 
-       rather the number of pointers in the object. KH 
-    */
+    ASSERT(sanityChk_StkO(Scan));
+
     return(FIXED_HS + size);
 }
 
@@ -1600,7 +1652,7 @@ _ScanMove_StkO(STG_NO_ARGS) {
     DEBUG_SCAN_MOVE("STKO", size);
 
     SLIDE_FIXED_HDR;
-#ifdef DO_REDN_COUNTING
+#ifdef TICKY_TICKY
     SLIDE_WORD(STKO_ADEP_LOCN);
     SLIDE_WORD(STKO_BDEP_LOCN);
 #endif
@@ -1640,6 +1692,8 @@ _ScanMove_StkO(STG_NO_ARGS) {
     StorageMgrInfo.OldMutables = (P_) New;
 #endif
 
+    /* ToDo: ASSERT(sanityChk_StkO(Scan or New)); ??? */
+
     return(FIXED_HS + size);
 }
 
@@ -1648,19 +1702,6 @@ _ScanMove_StkO(STG_NO_ARGS) {
 \end{code}
 
 \begin{code}
-#if defined(GCgn)
-I_
-_ScanMove_OldRoot(STG_NO_ARGS) {
-    DEBUG_SCAN_MOVE("OLDR", 2);
-    SLIDE_FIXED_HDR;
-    IND_CLOSURE_PTR(New) = IND_CLOSURE_PTR(Scan);
-    IND_CLOSURE_LINK(New) = (W_) genInfo.OldInNew;
-    genInfo.OldInNew = New;
-    genInfo.OldInNewno++;
-    return(IND_HS + MIN_UPD_SIZE); /* this looks wrong (WDP 95/07) */
-}
-#endif /* GCgn */
-
 /*** Dummy Entries -- Should not be entered ***/
 
 /* Should not be in a .lc file either...  --JSM */
@@ -1691,5 +1732,4 @@ STGFUN(_Dummy_CharLike_entry) {
 }
 
 #endif /* _INFO_COMPACTING */
-
 \end{code}