diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-07-20 07:11:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-07-20 07:11:35 +0000 |
commit | 39c56c33490275091939ba33ee18b03b140ea3b7 (patch) | |
tree | 0a0e7b1a90c1475d32669798d0ae72647560616c /gc.c | |
parent | 98a54d46f74bf3c7b60b83bcc73e0b312425a1bb (diff) | |
download | ruby-39c56c33490275091939ba33ee18b03b140ea3b7.tar.gz |
* compile.c, compile.h (DECL_ANCHOR, INIT_ANCHOR): split not to
initialize aggregations with dynamic values. [ruby-talk:259306]
* eval.c (rb_protect): not to initialize aggregations with dynamic
values. [ruby-talk:259306]
* gc.c (mark_current_machine_context): ditto.
* thread.c (thgroup_list, call_trace_func): ditto.
* vm.c (vm_init_redefined_flag): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 37 |
1 files changed, 7 insertions, 30 deletions
@@ -1403,41 +1403,18 @@ mark_current_machine_context(rb_thread_t *th) FLUSH_REGISTER_WINDOWS; /* This assumes that all registers are saved into the jmp_buf (and stack) */ setjmp(save_regs_gc_mark); + mark_locations_array((VALUE*)save_regs_gc_mark, + sizeof(save_regs_gc_mark) / sizeof(VALUE)); - { - struct { VALUE *start; VALUE *end; } regions[] = { - { (VALUE*)save_regs_gc_mark, - (VALUE*)save_regs_gc_mark + - sizeof(save_regs_gc_mark) / sizeof(VALUE *) }, - { stack_start, stack_end } + mark_locations_array(stack_start, stack_end - stack_start); #ifdef __ia64 - , { th->machine_register_stack_start, - th->machine_register_stack_end } + mark_locations_array(th->machine_register_stack_start, + th->machine_register_stack_end - th->machine_register_stack_start); #endif #if defined(__human68k__) || defined(__mc68000__) - , { (VALUE*)((char*)STACK_END + 2), - (VALUE*)((char*)STACK_START + 2) } + mark_locations_array((VALUE*)((char*)STACK_END + 2), + (STACK_START - STACK_END)); #endif - }; - int i; - for (i = 0; i < sizeof(regions)/sizeof(*regions); i++) { - /* stack scanning code is inlined here - * because function call grows stack. - * don't call mark_locations_array, - * rb_gc_mark_locations, etc. */ - VALUE *x, n, v; - x = regions[i].start; - n = regions[i].end - x; - while (n--) { - v = *x; - VALGRIND_MAKE_MEM_DEFINED(&v, sizeof(v)); - if (is_pointer_to_heap((void *)v)) { - gc_mark(v, 0); - } - x++; - } - } - } } static int |