summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-14 09:23:54 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-14 09:23:54 +0000
commit87a120fbdc25544135e8d625e8dc11950b7245a3 (patch)
treec23668533bf769b504a5d4262a8b5f4e00564acc /vm_method.c
parent4dd06525612585fc592abb935b2ac6c74c908e1f (diff)
* class.c, include/ruby/ruby.h: add write barriers for T_CLASS,
T_MODULE, T_ICLASS. * constant.h: constify rb_const_entry_t::value and file to detect assignment. * variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy): added. update table with write barrier. * method.h: constify some variables to detect assignment. * object.c (init_copy): add WBs. * variable.c: ditto. * vm_method.c (rb_add_method): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/vm_method.c b/vm_method.c
index 70fda7bf8b..e4e8c0176d 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -411,9 +411,12 @@ rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *opts, rb_method_
def->original_id = mid;
def->alias_count = 0;
switch (type) {
- case VM_METHOD_TYPE_ISEQ:
- def->body.iseq = (rb_iseq_t *)opts;
- break;
+ case VM_METHOD_TYPE_ISEQ: {
+ rb_iseq_t *iseq = (rb_iseq_t *)opts;
+ *(rb_iseq_t **)&def->body.iseq = iseq;
+ OBJ_WRITTEN(klass, Qundef, iseq->self);
+ break;
+ }
case VM_METHOD_TYPE_CFUNC:
{
rb_method_cfunc_t *cfunc = (rb_method_cfunc_t *)opts;
@@ -423,16 +426,16 @@ rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *opts, rb_method_
case VM_METHOD_TYPE_ATTRSET:
case VM_METHOD_TYPE_IVAR:
def->body.attr.id = (ID)opts;
- def->body.attr.location = Qfalse;
+ OBJ_WRITE(klass, (VALUE *)&def->body.attr.location, Qfalse);
th = GET_THREAD();
cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
if (cfp && (line = rb_vm_get_sourceline(cfp))) {
VALUE location = rb_ary_new3(2, cfp->iseq->location.path, INT2FIX(line));
- def->body.attr.location = rb_ary_freeze(location);
+ OBJ_WRITE(klass, (VALUE *)&def->body.attr.location, rb_ary_freeze(location));
}
break;
case VM_METHOD_TYPE_BMETHOD:
- def->body.proc = (VALUE)opts;
+ OBJ_WRITE(klass, (VALUE *)&def->body.proc, (VALUE)opts);
break;
case VM_METHOD_TYPE_NOTIMPLEMENTED:
setup_method_cfunc_struct(&def->body.cfunc, rb_f_notimplement, -1);