diff options
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -562,7 +562,7 @@ rb_mark_tbl(tbl) } static int -mark_hashentry(key, value) +mark_keyvalue(key, value) VALUE key; VALUE value; { @@ -576,7 +576,7 @@ rb_mark_hash(tbl) st_table *tbl; { if (!tbl) return; - st_foreach(tbl, mark_hashentry, 0); + st_foreach(tbl, mark_keyvalue, 0); } void @@ -1246,6 +1246,18 @@ rb_gc_start() return Qnil; } +#if !defined(__human68k__) +static int +stack_growup_p(addr) + VALUE *addr; +{ + SET_STACK_END; + + if (STACK_END > addr) return Qtrue; + return Qfalse; +} +#endif + void Init_stack(addr) VALUE *addr; @@ -1255,6 +1267,17 @@ Init_stack(addr) rb_gc_stack_start = _SEND; #else if (!addr) addr = (VALUE *)&addr; + if (rb_gc_stack_start) { + if (stack_growup_p(addr)) { + if (rb_gc_stack_start > addr) + rb_gc_stack_start = addr; + } + else { + if (rb_gc_stack_start < addr) + rb_gc_stack_start = addr; + } + return; + } rb_gc_stack_start = addr; #endif #ifdef HAVE_GETRLIMIT |