summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-04-09 08:27:01 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-04-09 08:27:01 +0000
commite5877f1c96b759a7468341c354027638ca7ced33 (patch)
treeba2cd1b61c54a0bf65b25642355b77071d52a79a /gc.c
parentfcb42a16dc97f2790fb59616e670dd43cc6fd3e3 (diff)
* gc.c (rb_gc_mark_children): introduce this function again; this
is required when stack was very tight. [ruby-talk:68916] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3657 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c60
1 files changed, 35 insertions, 25 deletions
diff --git a/gc.c b/gc.c
index 57e1ebac8f..ae7cff920d 100644
--- a/gc.c
+++ b/gc.c
@@ -462,22 +462,7 @@ sweep_source_filename(key, value)
}
}
-static void
-gc_mark_rest()
-{
- VALUE tmp_arry[MARK_STACK_MAX];
- VALUE *p;
-
- p = (mark_stack_ptr - mark_stack) + tmp_arry;
- MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
-
- init_mark_stack();
- while(p != tmp_arry){
- p--;
- FL_UNSET(*p, FL_MARK);
- rb_gc_mark(*p);
- }
-}
+static void rb_gc_mark_children _((VALUE ptr));
static void
gc_mark_all()
@@ -485,21 +470,35 @@ gc_mark_all()
RVALUE *p, *pend;
int i;
- gc_mark_rest();
init_mark_stack();
for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + heaps_limits[i];
while (p < pend) {
if ((p->as.basic.flags & FL_MARK) &&
(p->as.basic.flags != FL_MARK)) {
- FL_UNSET(p, FL_MARK);
- rb_gc_mark((VALUE)p);
+ rb_gc_mark_children((VALUE)p);
}
p++;
}
}
}
+static void
+gc_mark_rest()
+{
+ VALUE tmp_arry[MARK_STACK_MAX];
+ VALUE *p;
+
+ p = (mark_stack_ptr - mark_stack) + tmp_arry;
+ MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX);
+
+ init_mark_stack();
+ while(p != tmp_arry){
+ p--;
+ rb_gc_mark_children(*p);
+ }
+}
+
static inline int
is_pointer_to_heap(ptr)
void *ptr;
@@ -600,13 +599,14 @@ rb_gc_mark(ptr)
int ret;
register RVALUE *obj;
+ obj = RANY(ptr);
+ if (rb_special_const_p(ptr)) return; /* special const not marked */
+ if (obj->as.basic.flags == 0) return; /* free cell */
+ if (obj->as.basic.flags & FL_MARK) return; /* already marked */
+ obj->as.basic.flags |= FL_MARK;
+
CHECK_STACK(ret);
if (ret) {
- obj = RANY(ptr);
- if (rb_special_const_p(ptr)) return; /* special const not marked */
- if (obj->as.basic.flags == 0) return; /* free cell */
- if (obj->as.basic.flags & FL_MARK) return; /* already marked */
- obj->as.basic.flags |= FL_MARK;
if (!mark_stack_overflow) {
if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
*mark_stack_ptr = ptr;
@@ -618,15 +618,25 @@ rb_gc_mark(ptr)
}
return;
}
+ rb_gc_mark_children(ptr);
+}
+
+static void
+rb_gc_mark_children(ptr)
+ VALUE ptr;
+{
+ register RVALUE *obj = RANY(ptr);
+
+ goto marking; /* skip */
again:
obj = RANY(ptr);
if (rb_special_const_p(ptr)) return; /* special const not marked */
if (obj->as.basic.flags == 0) return; /* free cell */
if (obj->as.basic.flags & FL_MARK) return; /* already marked */
-
obj->as.basic.flags |= FL_MARK;
+ marking:
if (FL_TEST(obj, FL_EXIVAR)) {
rb_mark_generic_ivar(ptr);
}