From db1177862cfca962b33e613a6b69e803ba9fcedb Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 4 Jun 2015 16:08:40 +0000 Subject: * vm_method.c (rb_add_method_iseq): use intermediate struct to avoid initializing struct with variables. [Bug #11217] * method.h: add a comment about it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50772 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ method.h | 2 +- vm_method.c | 12 ++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index dea5726d15..63b9e30f41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Fri Jun 5 01:06:02 2015 Koichi Sasada + + * vm_method.c (rb_add_method_iseq): use intermediate struct to + avoid initializing struct with variables. + [Bug #11217] + + * method.h: add a comment about it. + Fri Jun 5 00:55:21 2015 Koichi Sasada * method.h: constify rb_method_refined_t::orig_me. diff --git a/method.h b/method.h index 0b07342615..4d1cf3e6fe 100644 --- a/method.h +++ b/method.h @@ -60,7 +60,7 @@ typedef struct rb_iseq_struct rb_iseq_t; typedef struct rb_method_iseq_struct { rb_iseq_t * const iseqptr; /* should be separated from iseqval */ rb_cref_t * const cref; /* shoudl be marked */ -} rb_method_iseq_t; +} rb_method_iseq_t; /* check rb_add_method_iseq() when modify the fields */ typedef struct rb_method_cfunc_struct { VALUE (*func)(ANYARGS); diff --git a/vm_method.c b/vm_method.c index 8d08272d02..e59a161cc2 100644 --- a/vm_method.c +++ b/vm_method.c @@ -562,11 +562,15 @@ void rb_add_method_iseq(VALUE klass, ID mid, VALUE iseqval, rb_cref_t *cref, rb_method_visibility_t visi) { rb_iseq_t *iseq; + struct { /* should be same fields with rb_method_iseq_struct */ + rb_iseq_t *iseqptr; + rb_cref_t *cref; + } iseq_body; + GetISeqPtr(iseqval, iseq); - { - rb_method_iseq_t iseq_body = {iseq, cref}; - rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, &iseq_body, visi); - } + iseq_body.iseqptr = iseq; + iseq_body.cref = cref; + rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, &iseq_body, visi); } static rb_method_entry_t * -- cgit v1.2.3