summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gc.c50
-rw-r--r--gc.h2
-rw-r--r--parser.c5
3 files changed, 28 insertions, 29 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;
diff --git a/gc.h b/gc.h
index b24b470e..255171f5 100644
--- a/gc.h
+++ b/gc.h
@@ -33,8 +33,8 @@ val make_obj(void);
void gc(void);
int gc_state(int);
void gc_mark(val);
+void gc_conservative_mark(val);
int gc_is_reachable(val);
-int gc_is_heap_obj(union obj *ptr);
#if CONFIG_GEN_GC
val gc_set(loc, val);
diff --git a/parser.c b/parser.c
index c5342ae9..bb5205f2 100644
--- a/parser.c
+++ b/parser.c
@@ -54,10 +54,7 @@ static val stream_parser_hash;
static void yy_tok_mark(struct yy_token *tok)
{
- obj_t *ptr = tok->yy_lval.val;
-
- if (gc_is_heap_obj(ptr))
- gc_mark(ptr);
+ gc_conservative_mark(tok->yy_lval.val);
}
static void parser_mark(val obj)