[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]