Code refactoring regarding GC_PUSH_ONE_HEAP (mark)
authorIvan Maidanski <ivmai@mail.ru>
Sun, 29 Jan 2012 17:46:40 +0000 (21:46 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 29 Jan 2012 17:46:40 +0000 (21:46 +0400)
* finalize.c (GC_ignore_self_finalize_mark_proc): Pass
GC_mark_stack_top to GC_PUSH_ONE_HEAP.
* mark.c (PUSH_GRANULE): Likewise.
* include/private/gc_pmark.h (GC_PUSH_ONE_HEAP): Replace
hard-coded GC_mark_stack_top with mark_stack_top argument; reformat
comment; add missing brackets.

finalize.c
include/private/gc_pmark.h
mark.c

index 56f62f1..f66d76e 100644 (file)
@@ -335,7 +335,7 @@ STATIC void GC_ignore_self_finalize_mark_proc(ptr_t p)
     for (q = p; q <= scan_limit; q += ALIGNMENT) {
         r = *(word *)q;
         if ((ptr_t)r < p || (ptr_t)r > target_limit) {
-            GC_PUSH_ONE_HEAP(r, q);
+            GC_PUSH_ONE_HEAP(r, q, GC_mark_stack_top);
         }
     }
 }
index 42fbb20..04aa8c3 100644 (file)
@@ -392,18 +392,14 @@ exit_label: ; \
       }
 #endif
 
-
-/*
- * As above, but interior pointer recognition as for
- * normal heap pointers.
- */
-#define GC_PUSH_ONE_HEAP(p,source) \
-    FIXUP_POINTER(p); \
-    if ((ptr_t)(p) >= (ptr_t)GC_least_plausible_heap_addr \
-         && (ptr_t)(p) < (ptr_t)GC_greatest_plausible_heap_addr) { \
-      GC_mark_stack_top = GC_mark_and_push( \
-                            (void *)(p), GC_mark_stack_top, \
-                            GC_mark_stack_limit, (void * *)(source)); \
+/* As above, but interior pointer recognition as for normal heap pointers. */
+#define GC_PUSH_ONE_HEAP(p,source,mark_stack_top) \
+    { \
+      FIXUP_POINTER(p); \
+      if ((ptr_t)(p) >= (ptr_t)GC_least_plausible_heap_addr \
+          && (ptr_t)(p) < (ptr_t)GC_greatest_plausible_heap_addr) \
+        mark_stack_top = GC_mark_and_push((void *)(p), mark_stack_top, \
+                                GC_mark_stack_limit, (void * *)(source)); \
     }
 
 /* Mark starting at mark stack entry top (incl.) down to        */
diff --git a/mark.c b/mark.c
index 87e2b4a..5bef7f9 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -1537,25 +1537,25 @@ GC_INNER void GC_push_all_stack(ptr_t bottom, ptr_t top)
 #   define USE_PUSH_MARKED_ACCELERATORS
 #   define PUSH_GRANULE(q) \
                 { word qcontents = (q)[0]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)); }
+                  GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); }
 # elif GC_GRANULE_WORDS == 2
 #   define USE_PUSH_MARKED_ACCELERATORS
 #   define PUSH_GRANULE(q) \
                 { word qcontents = (q)[0]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)); \
+                  GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); \
                   qcontents = (q)[1]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)+1); }
+                  GC_PUSH_ONE_HEAP(qcontents, (q)+1, GC_mark_stack_top); }
 # elif GC_GRANULE_WORDS == 4
 #   define USE_PUSH_MARKED_ACCELERATORS
 #   define PUSH_GRANULE(q) \
                 { word qcontents = (q)[0]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)); \
+                  GC_PUSH_ONE_HEAP(qcontents, q, GC_mark_stack_top); \
                   qcontents = (q)[1]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)+1); \
+                  GC_PUSH_ONE_HEAP(qcontents, (q)+1, GC_mark_stack_top); \
                   qcontents = (q)[2]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)+2); \
+                  GC_PUSH_ONE_HEAP(qcontents, (q)+2, GC_mark_stack_top); \
                   qcontents = (q)[3]; \
-                  GC_PUSH_ONE_HEAP(qcontents, (q)+3); }
+                  GC_PUSH_ONE_HEAP(qcontents, (q)+3, GC_mark_stack_top); }
 # endif
 #endif /* !USE_MARK_BYTES && MARK_BIT_PER_GRANULE */