diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-25 07:59:23 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-25 07:59:23 +0000 |
commit | 8cab598c25b618eb4323752df13d2b28f50b7cc3 (patch) | |
tree | bbf98eaecab76b4181bb4b328546d7b0e30715c2 /gc.c | |
parent | 39a5ad3460245a090096dfb12883eb1747c44e5d (diff) | |
download | ruby-8cab598c25b618eb4323752df13d2b28f50b7cc3.tar.gz |
* vm_method.c: make a rb_method_definition_t data (def) *after* making
a rb_method_entry_t data (me).
Normally, `me' points `def'. Some Ruby objects pointed from `def'
and objects are marked by `me' (mark_method_entry() in gc.c).
However, `def' is built before making a `me', then nobody can mark
objects pointed from `def' before making (and pointing from) `me'.
I hope this patch solve #11244.
* vm_method.c: remove `rb_' prefix from some static functions.
* method.h (rb_method_entry_create): constify
* gc.c (mark_method_entry): add checking `def' and
`def->body.iseq.iseqptr' availability because they can be NULL.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51026 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 52 |
1 files changed, 27 insertions, 25 deletions
@@ -3930,31 +3930,33 @@ mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me) gc_mark(objspace, me->klass); - switch (def->type) { - case VM_METHOD_TYPE_ISEQ: - gc_mark(objspace, def->body.iseq.iseqptr->self); - gc_mark(objspace, (VALUE)def->body.iseq.cref); - break; - case VM_METHOD_TYPE_ATTRSET: - case VM_METHOD_TYPE_IVAR: - gc_mark(objspace, def->body.attr.location); - break; - case VM_METHOD_TYPE_BMETHOD: - gc_mark(objspace, def->body.proc); - break; - case VM_METHOD_TYPE_ALIAS: - gc_mark(objspace, (VALUE)def->body.alias.original_me); - return; - case VM_METHOD_TYPE_REFINED: - gc_mark(objspace, (VALUE)def->body.refined.orig_me); - break; - case VM_METHOD_TYPE_CFUNC: - case VM_METHOD_TYPE_ZSUPER: - case VM_METHOD_TYPE_MISSING: - case VM_METHOD_TYPE_OPTIMIZED: - case VM_METHOD_TYPE_UNDEF: - case VM_METHOD_TYPE_NOTIMPLEMENTED: - break; + if (def) { + switch (def->type) { + case VM_METHOD_TYPE_ISEQ: + if (def->body.iseq.iseqptr) gc_mark(objspace, def->body.iseq.iseqptr->self); + gc_mark(objspace, (VALUE)def->body.iseq.cref); + break; + case VM_METHOD_TYPE_ATTRSET: + case VM_METHOD_TYPE_IVAR: + gc_mark(objspace, def->body.attr.location); + break; + case VM_METHOD_TYPE_BMETHOD: + gc_mark(objspace, def->body.proc); + break; + case VM_METHOD_TYPE_ALIAS: + gc_mark(objspace, (VALUE)def->body.alias.original_me); + return; + case VM_METHOD_TYPE_REFINED: + gc_mark(objspace, (VALUE)def->body.refined.orig_me); + break; + case VM_METHOD_TYPE_CFUNC: + case VM_METHOD_TYPE_ZSUPER: + case VM_METHOD_TYPE_MISSING: + case VM_METHOD_TYPE_OPTIMIZED: + case VM_METHOD_TYPE_UNDEF: + case VM_METHOD_TYPE_NOTIMPLEMENTED: + break; + } } } |