summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-05 08:02:29 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-05 08:02:29 +0000
commit05711c45af45f19ce570863786ee2ed7cc6aabc2 (patch)
tree12fa46bfedcc8e773c918e4bd7a432453c468997
parent972cf8c91e54bbef5c6d73ed5fc187f8d89735a8 (diff)
use `RSTRUCT_CONST_PTR` carefully.
* struct.c: should not use `RSTRUCT_CONST_PTR` with method dispatch because pointers can be obsolete after method dispatch. `rb_equal()` and so on can dispatch Ruby's methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65549 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--struct.c14
1 files changed, 3 insertions, 11 deletions
diff --git a/struct.c b/struct.c
index ece7ebc8a1..5e90f65506 100644
--- a/struct.c
+++ b/struct.c
@@ -1135,15 +1135,12 @@ rb_struct_select(int argc, VALUE *argv, VALUE s)
static VALUE
recursive_equal(VALUE s, VALUE s2, int recur)
{
- const VALUE *ptr, *ptr2;
long i, len;
if (recur) return Qtrue; /* Subtle! */
- ptr = RSTRUCT_CONST_PTR(s);
- ptr2 = RSTRUCT_CONST_PTR(s2);
len = RSTRUCT_LEN(s);
for (i=0; i<len; i++) {
- if (!rb_equal(ptr[i], ptr2[i])) return Qfalse;
+ if (!rb_equal(RSTRUCT_GET(s, i), RSTRUCT_GET(s2, i))) return Qfalse;
}
return Qtrue;
}
@@ -1191,13 +1188,11 @@ rb_struct_hash(VALUE s)
long i, len;
st_index_t h;
VALUE n;
- const VALUE *ptr;
h = rb_hash_start(rb_hash(rb_obj_class(s)));
- ptr = RSTRUCT_CONST_PTR(s);
len = RSTRUCT_LEN(s);
for (i = 0; i < len; i++) {
- n = rb_hash(ptr[i]);
+ n = rb_hash(RSTRUCT_GET(s, i));
h = rb_hash_uint(h, NUM2LONG(n));
}
h = rb_hash_end(h);
@@ -1207,15 +1202,12 @@ rb_struct_hash(VALUE s)
static VALUE
recursive_eql(VALUE s, VALUE s2, int recur)
{
- const VALUE *ptr, *ptr2;
long i, len;
if (recur) return Qtrue; /* Subtle! */
- ptr = RSTRUCT_CONST_PTR(s);
- ptr2 = RSTRUCT_CONST_PTR(s2);
len = RSTRUCT_LEN(s);
for (i=0; i<len; i++) {
- if (!rb_eql(ptr[i], ptr2[i])) return Qfalse;
+ if (!rb_eql(RSTRUCT_GET(s, i), RSTRUCT_GET(s2, i))) return Qfalse;
}
return Qtrue;
}