summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-20 07:11:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-07-20 07:11:35 +0000
commit39c56c33490275091939ba33ee18b03b140ea3b7 (patch)
tree0a0e7b1a90c1475d32669798d0ae72647560616c /gc.c
parent98a54d46f74bf3c7b60b83bcc73e0b312425a1bb (diff)
* 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.c37
1 files changed, 7 insertions, 30 deletions
diff --git a/gc.c b/gc.c
index 737344ab9c..7a646a160f 100644
--- a/gc.c
+++ b/gc.c
@@ -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