From e5877f1c96b759a7468341c354027638ca7ced33 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 9 Apr 2003 08:27:01 +0000 Subject: * 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 --- gc.c | 60 +++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'gc.c') 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); } -- cgit v1.2.3