[MacRuby] #1303: GC does not actively work with RubySpec after "core/gc".
MacRuby
ruby-noreply at macosforge.org
Wed May 25 06:42:59 PDT 2011
#1303: GC does not actively work with RubySpec after "core/gc".
----------------------------------+-----------------------------------------
Reporter: watson1978@… | Owner: lsansonetti@…
Type: defect | Status: new
Priority: critical | Milestone:
Component: MacRuby | Keywords:
----------------------------------+-----------------------------------------
Comment(by watson1978@…):
I think MacRuby needs some GC_WB.
{{{
#!diff
diff --git a/dispatcher.cpp b/dispatcher.cpp
index b04f1e8..7fbbb22 100644
--- a/dispatcher.cpp
+++ b/dispatcher.cpp
@@ -1084,7 +1084,7 @@ dup_block(rb_vm_block_t *src_b)
while (src_l != NULL) {
GC_WB(new_l, xmalloc(sizeof(rb_vm_local_t)));
(*new_l)->name = src_l->name;
- (*new_l)->value = src_l->value;
+ GC_WB(&(*new_l)->value, src_l->value);
new_l = &(*new_l)->next;
src_l = src_l->next;
@@ -1318,7 +1318,7 @@ rb_vm_yield_under(VALUE klass, VALUE self, int argc,
const VALUE *argv)
vm->pop_current_block();
VALUE old_self = b->self;
- b->self = self;
+ GC_WB(&b->self, self);
VALUE old_class = b->klass;
b->klass = klass;
GC_WB(&b->outer, vm->create_outer((Class)klass, b->outer, true));
@@ -1337,7 +1337,7 @@ rb_vm_yield_under(VALUE klass, VALUE self, int argc,
const VALUE *argv)
}
~Finally() {
GC_WB(&b->outer, b->outer->outer);
- b->self = old_self;
+ GC_WB(&b->self, old_self);
b->klass = old_class;
vm->add_current_block(b);
}
@@ -1418,13 +1418,13 @@ rb_vm_prepare_block(void *function, int flags,
VALUE self, rb_vm_arity_t arity,
GET_CORE()->unlock();
#endif
}
- b->userdata = (VALUE)function;
+ GC_WB(&b->userdata, (VALUE)function);
}
b->arity = arity;
b->flags = flags;
b->dvars_size = dvars_size;
b->parent_var_uses = NULL;
- b->parent_block = NULL;
+ GC_WB(&b->parent_block, NULL);
}
else {
assert(b->dvars_size == dvars_size);
@@ -1456,7 +1456,7 @@ rb_vm_prepare_block(void *function, int flags, VALUE
self, rb_vm_arity_t arity,
for (int i = 0; i < lvars_size; ++i) {
assert(l != NULL);
l->name = va_arg(ar, ID);
- l->value = va_arg(ar, VALUE *);
+ GC_WB(&l->value, va_arg(ar, VALUE *));
l = l->next;
}
}
diff --git a/vm.cpp b/vm.cpp
index ffcb22d..3a64a82 100644
--- a/vm.cpp
+++ b/vm.cpp
@@ -3332,7 +3332,7 @@ rb_vm_keep_vars(rb_vm_var_uses *uses, int
lvars_size, ...)
}
// the parent pointers can't be used anymore
- block->parent_block = NULL;
+ GC_WB(&block->parent_block, NULL);
block->parent_var_uses = NULL;
locals_to_replace = block->locals;
@@ -3363,7 +3363,7 @@ push_local(rb_vm_local_t **l, ID name, VALUE *value)
{
GC_WB(l, xmalloc(sizeof(rb_vm_local_t)));
(*l)->name = name;
- (*l)->value = value;
+ GC_WB(&(*l)->value, value);
(*l)->next = NULL;
return &(*l)->next;
}
@@ -3498,7 +3498,7 @@ rb_vm_create_block_from_method(rb_vm_method_t
*method)
b->flags = VM_BLOCK_PROC | VM_BLOCK_METHOD;
b->locals = NULL;
b->parent_var_uses = NULL;
- b->parent_block = NULL;
+ GC_WB(&b->parent_block, NULL);
b->dvars_size = 0;
return b;
}}}
--
Ticket URL: <http://www.macruby.org/trac/ticket/1303#comment:1>
MacRuby <http://macruby.org/>
More information about the macruby-tickets
mailing list