diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-04-09 06:44:34 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-04-09 06:44:34 +0000 |
commit | 5cb4133e6719ba8b54f3bb5f838cd548288cedd0 (patch) | |
tree | 3547858c5bf05ad31472307fd110d35347644450 /gc.c | |
parent | bb4ade0ab6d298837891224d839026cc7c7c988a (diff) |
* bignum.c (BIGZEROP): macro to determine if x is a bignum zero.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 44 |
1 files changed, 27 insertions, 17 deletions
@@ -381,9 +381,11 @@ static unsigned int STACK_LEVEL_MAX = 655300; : STACK_END - rb_gc_stack_start) #endif +#define GC_WARTER_MARK 512 + #define CHECK_STACK(ret) do {\ SET_STACK_END;\ - (ret) = (STACK_LENGTH > STACK_LEVEL_MAX);\ + (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WARTER_MARK);\ } while (0) int @@ -461,17 +463,36 @@ 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 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); } p++; @@ -479,22 +500,6 @@ gc_mark_all() } } -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(*p); - } -} - static inline int is_pointer_to_heap(ptr) void *ptr; @@ -597,6 +602,11 @@ rb_gc_mark(ptr) 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; |