Bug #2258 » 0001-add-ruby_bind_stack-to-inform-GC-about-explicit-stac.patch
| gc.c | ||
|---|---|---|
|
void rb_vm_mark(void *ptr);
|
||
|
static VALUE *ruby_gc_stack_lower = 0,
|
||
|
*ruby_gc_stack_upper = 0;
|
||
|
void
|
||
|
ruby_bind_stack(VALUE *lower, VALUE *upper)
|
||
|
{
|
||
|
ruby_gc_stack_lower = lower;
|
||
|
ruby_gc_stack_upper = upper;
|
||
|
}
|
||
|
static void
|
||
|
mark_current_machine_context(rb_objspace_t *objspace, rb_thread_t *th)
|
||
|
{
|
||
| ... | ... | |
|
(VALUE*)save_regs_gc_mark,
|
||
|
sizeof(save_regs_gc_mark) / sizeof(VALUE));
|
||
|
if (ruby_gc_stack_upper && stack_end > ruby_gc_stack_upper) {
|
||
|
stack_end = ruby_gc_stack_upper;
|
||
|
}
|
||
|
if (ruby_gc_stack_lower && stack_start < ruby_gc_stack_lower) {
|
||
|
stack_end = ruby_gc_stack_lower;
|
||
|
}
|
||
|
rb_gc_mark_locations(stack_start, stack_end);
|
||
|
#ifdef __ia64
|
||
|
rb_gc_mark_locations(th->machine_register_stack_start, th->machine_register_stack_end);
|
||
| include/ruby/ruby.h | ||
|---|---|---|
|
#define RUBY_INIT_STACK \
|
||
|
VALUE variable_in_this_stack_frame; \
|
||
|
ruby_init_stack(&variable_in_this_stack_frame);
|
||
|
void ruby_bind_stack(VALUE *lower, VALUE *upper);
|
||
|
void ruby_init(void);
|
||
|
void *ruby_options(int, char**);
|
||
|
int ruby_run_node(void *);
|
||