summaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/gc.c b/gc.c
index c4ae9274..01931840 100644
--- a/gc.c
+++ b/gc.c
@@ -395,9 +395,26 @@ static int in_heap(val ptr)
return 0;
}
-int gc_is_heap_obj(union obj *ptr)
+static void mark_obj_maybe(val maybe_obj)
{
- return in_heap(ptr);
+#if HAVE_VALGRIND
+ VALGRIND_MAKE_MEM_DEFINED(&maybe_obj, sizeof maybe_obj);
+#endif
+ if (in_heap(maybe_obj)) {
+#if HAVE_VALGRIND
+ if (opt_vg_debug)
+ VALGRIND_MAKE_MEM_DEFINED(maybe_obj, SIZEOF_PTR);
+#endif
+ type_t t = maybe_obj->t.type;
+ if ((t & FREE) == 0) {
+ mark_obj(maybe_obj);
+ } else {
+#if HAVE_VALGRIND
+ if (opt_vg_debug)
+ VALGRIND_MAKE_MEM_NOACCESS(maybe_obj, sizeof *maybe_obj);
+#endif
+ }
+ }
}
static void mark_mem_region(val *low, val *high)
@@ -408,28 +425,8 @@ static void mark_mem_region(val *low, val *high)
low = tmp;
}
- while (low < high) {
- val maybe_obj = *low;
-#if HAVE_VALGRIND
- VALGRIND_MAKE_MEM_DEFINED(&maybe_obj, sizeof maybe_obj);
-#endif
- if (in_heap(maybe_obj)) {
-#if HAVE_VALGRIND
- if (opt_vg_debug)
- VALGRIND_MAKE_MEM_DEFINED(maybe_obj, SIZEOF_PTR);
-#endif
- type_t t = maybe_obj->t.type;
- if ((t & FREE) == 0) {
- mark_obj(maybe_obj);
- } else {
-#if HAVE_VALGRIND
- if (opt_vg_debug)
- VALGRIND_MAKE_MEM_NOACCESS(maybe_obj, sizeof *maybe_obj);
-#endif
- }
- }
- low++;
- }
+ for (; low < high; low++)
+ mark_obj_maybe(*low);
}
static void mark(mach_context_t *pmc, val *gc_stack_top)
@@ -718,6 +715,11 @@ void gc_mark(val obj)
mark_obj(obj);
}
+void gc_conservative_mark(val maybe_obj)
+{
+ mark_obj_maybe(maybe_obj);
+}
+
int gc_is_reachable(val obj)
{
type_t t;