ruby-changes:53333
From: ko1 <ko1@a...>
Date: Mon, 5 Nov 2018 17:02:35 +0900 (JST)
Subject: [ruby-changes:53333] ko1:r65549 (trunk): use `RSTRUCT_CONST_PTR` carefully.
ko1 2018-11-05 17:02:29 +0900 (Mon, 05 Nov 2018) New Revision: 65549 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65549 Log: 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. Modified files: trunk/struct.c Index: struct.c =================================================================== --- struct.c (revision 65548) +++ struct.c (revision 65549) @@ -1135,15 +1135,12 @@ rb_struct_select(int argc, VALUE *argv, https://github.com/ruby/ruby/blob/trunk/struct.c#L1135 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) https://github.com/ruby/ruby/blob/trunk/struct.c#L1188 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) https://github.com/ruby/ruby/blob/trunk/struct.c#L1202 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; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/