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

ruby-changes:53215

From: ko1 <ko1@a...>
Date: Tue, 30 Oct 2018 03:00:11 +0900 (JST)
Subject: [ruby-changes:53215] ko1:r65430 (trunk): use RARRAY_AREF() instead of RARRAY_CONST_PTR().

ko1	2018-10-30 03:00:02 +0900 (Tue, 30 Oct 2018)

  New Revision: 65430

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65430

  Log:
    use RARRAY_AREF() instead of RARRAY_CONST_PTR().
    
    * class.c (rb_keyword_error_new): use RARRAY_AREF() because
      RARRAY_CONST_PTR() can introduce additional overhead in a futre.
      Same fixes for other files.

  Modified files:
    trunk/class.c
    trunk/enum.c
    trunk/gc.c
    trunk/struct.c
Index: enum.c
===================================================================
--- enum.c	(revision 65429)
+++ enum.c	(revision 65430)
@@ -744,7 +744,8 @@ ary_inject_op(VALUE ary, VALUE init, VAL https://github.com/ruby/ruby/blob/trunk/enum.c#L744
         }
     }
     for (; i < RARRAY_LEN(ary); i++) {
-        v = rb_funcallv_public(v, id, 1, &RARRAY_CONST_PTR(ary)[i]);
+        VALUE arg = RARRAY_AREF(ary, i);
+        v = rb_funcallv_public(v, id, 1, &arg);
     }
     return v;
 }
Index: struct.c
===================================================================
--- struct.c	(revision 65429)
+++ struct.c	(revision 65430)
@@ -138,7 +138,6 @@ static inline int https://github.com/ruby/ruby/blob/trunk/struct.c#L138
 struct_member_pos(VALUE s, VALUE name)
 {
     VALUE back = struct_ivar_get(rb_obj_class(s), id_back_members);
-    VALUE const * p;
     long j, mask;
 
     if (UNLIKELY(NIL_P(back))) {
@@ -148,7 +147,6 @@ struct_member_pos(VALUE s, VALUE name) https://github.com/ruby/ruby/blob/trunk/struct.c#L147
 	rb_raise(rb_eTypeError, "corrupted struct");
     }
 
-    p = RARRAY_CONST_PTR(back);
     mask = RARRAY_LEN(back);
 
     if (mask <= AREF_HASH_THRESHOLD) {
@@ -158,7 +156,7 @@ struct_member_pos(VALUE s, VALUE name) https://github.com/ruby/ruby/blob/trunk/struct.c#L156
 		     mask, RSTRUCT_LEN(s));
 	}
 	for (j = 0; j < mask; j++) {
-	    if (p[j] == name)
+	    if (RARRAY_AREF(back, j) == name)
 		return (int)j;
 	}
 	return -1;
@@ -173,9 +171,10 @@ struct_member_pos(VALUE s, VALUE name) https://github.com/ruby/ruby/blob/trunk/struct.c#L171
     j = struct_member_pos_ideal(name, mask);
 
     for (;;) {
-	if (p[j] == name)
-	    return FIX2INT(p[j + 1]);
-	if (!RTEST(p[j])) {
+        VALUE e = RARRAY_AREF(back, j);
+	if (e == name)
+	    return FIX2INT(RARRAY_AREF(back, j + 1));
+        if (!RTEST(e)) {
 	    return -1;
 	}
 	j = struct_member_pos_probe(j, mask);
Index: gc.c
===================================================================
--- gc.c	(revision 65429)
+++ gc.c	(revision 65430)
@@ -2797,13 +2797,13 @@ define_final0(VALUE obj, VALUE block) https://github.com/ruby/ruby/blob/trunk/gc.c#L2797
 
 	/* avoid duplicate block, table is usually small */
 	{
-	    const VALUE *ptr = RARRAY_CONST_PTR(table);
 	    long len = RARRAY_LEN(table);
 	    long i;
 
-	    for (i = 0; i < len; i++, ptr++) {
-		if (rb_funcall(*ptr, idEq, 1, block)) {
-		    return *ptr;
+	    for (i = 0; i < len; i++) {
+                VALUE recv = RARRAY_AREF(table, i);
+		if (rb_funcall(recv, idEq, 1, block)) {
+		    return recv;
 		}
 	    }
 	}
Index: class.c
===================================================================
--- class.c	(revision 65429)
+++ class.c	(revision 65430)
@@ -1776,14 +1776,13 @@ rb_define_attr(VALUE klass, const char * https://github.com/ruby/ruby/blob/trunk/class.c#L1776
 MJIT_FUNC_EXPORTED VALUE
 rb_keyword_error_new(const char *error, VALUE keys)
 {
-    const VALUE *ptr = RARRAY_CONST_PTR(keys);
     long i = 0, len = RARRAY_LEN(keys);
     VALUE error_message = rb_sprintf("%s keyword%.*s", error, len > 1, "s");
 
     if (len > 0) {
 	rb_str_cat_cstr(error_message, ": ");
 	while (1) {
-	    const VALUE k = ptr[i];
+	    const VALUE k = RARRAY_AREF(keys, i);
 	    Check_Type(k, T_SYMBOL); /* wrong hash is given to rb_get_kwargs */
 	    rb_str_append(error_message, rb_sym2str(k));
 	    if (++i >= len) break;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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