diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-14 09:23:54 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-14 09:23:54 +0000 |
commit | 87a120fbdc25544135e8d625e8dc11950b7245a3 (patch) | |
tree | c23668533bf769b504a5d4262a8b5f4e00564acc /vm_method.c | |
parent | 4dd06525612585fc592abb935b2ac6c74c908e1f (diff) | |
download | ruby-87a120fbdc25544135e8d625e8dc11950b7245a3.tar.gz |
* 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.c | 15 |
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); |