summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--method.h2
-rw-r--r--vm_method.c12
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 <ko1@atdot.net>
+
+ * 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 <ko1@atdot.net>
* 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 *