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

ruby-changes:14991

From: mame <ko1@a...>
Date: Wed, 10 Mar 2010 21:30:10 +0900 (JST)
Subject: [ruby-changes:14991] Ruby:r26866 (trunk): * enum.c (min_ii, max_ii, minmax_ii): remove wrong optimization that

mame	2010-03-10 21:29:50 +0900 (Wed, 10 Mar 2010)

  New Revision: 26866

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26866

  Log:
    * enum.c (min_ii, max_ii, minmax_ii): remove wrong optimization that
      reuses array for yield parameter, which caused unexpected behavior.
      [ruby-core:25989]

  Modified files:
    trunk/ChangeLog
    trunk/enum.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26865)
+++ ChangeLog	(revision 26866)
@@ -1,3 +1,9 @@
+Wed Mar 10 21:25:41 2010  Yusuke Endoh  <mame@t...>
+
+	* enum.c (min_ii, max_ii, minmax_ii): remove wrong optimization that
+	  reuses array for yield parameter, which caused unexpected behavior.
+	  [ruby-core:25989]
+
 Wed Mar 10 12:10:00 2010  Kenta Murata  <mrkn@m...>
 
 	* enc/x_emoji.h: renamed from enc/x-emoji.c.
Index: enum.c
===================================================================
--- enum.c	(revision 26865)
+++ enum.c	(revision 26866)
@@ -1058,10 +1058,7 @@
 	*memo = i;
     }
     else {
-	VALUE ary = memo[1];
-	RARRAY_PTR(ary)[0] = i;
-	RARRAY_PTR(ary)[1] = *memo;
-	cmp = rb_yield(ary);
+	cmp = rb_yield_values(2, i, *memo);
 	if (rb_cmpint(cmp, i, *memo) < 0) {
 	    *memo = i;
 	}
@@ -1087,18 +1084,16 @@
 static VALUE
 enum_min(VALUE obj)
 {
-    VALUE result[2];
+    VALUE result = Qundef;
 
-    result[0] = Qundef;
     if (rb_block_given_p()) {
-	result[1] = rb_ary_new3(2, Qnil, Qnil);
-	rb_block_call(obj, id_each, 0, 0, min_ii, (VALUE)result);
+	rb_block_call(obj, id_each, 0, 0, min_ii, (VALUE)&result);
     }
     else {
-	rb_block_call(obj, id_each, 0, 0, min_i, (VALUE)result);
+	rb_block_call(obj, id_each, 0, 0, min_i, (VALUE)&result);
     }
-    if (result[0] == Qundef) return Qnil;
-    return result[0];
+    if (result == Qundef) return Qnil;
+    return result;
 }
 
 static VALUE
@@ -1131,10 +1126,7 @@
 	*memo = i;
     }
     else {
-	VALUE ary = memo[1];
-	RARRAY_PTR(ary)[0] = i;
-	RARRAY_PTR(ary)[1] = *memo;
-	cmp = rb_yield(ary);
+	cmp = rb_yield_values(2, i, *memo);
 	if (rb_cmpint(cmp, i, *memo) > 0) {
 	    *memo = i;
 	}
@@ -1159,24 +1151,21 @@
 static VALUE
 enum_max(VALUE obj)
 {
-    VALUE result[2];
+    VALUE result = Qundef;
 
-    result[0] = Qundef;
     if (rb_block_given_p()) {
-	result[1] = rb_ary_new3(2, Qnil, Qnil);
-	rb_block_call(obj, id_each, 0, 0, max_ii, (VALUE)result);
+	rb_block_call(obj, id_each, 0, 0, max_ii, (VALUE)&result);
     }
     else {
-	rb_block_call(obj, id_each, 0, 0, max_i, (VALUE)result);
+	rb_block_call(obj, id_each, 0, 0, max_i, (VALUE)&result);
     }
-    if (result[0] == Qundef) return Qnil;
-    return result[0];
+    if (result == Qundef) return Qnil;
+    return result;
 }
 
 struct minmax_t {
     VALUE min;
     VALUE max;
-    VALUE ary;
     VALUE last;
 };
 
@@ -1242,17 +1231,11 @@
 	memo->max = j;
     }
     else {
-	VALUE ary = memo->ary;
-
-        rb_ary_store(ary, 0, i);
-        rb_ary_store(ary, 1, memo->min);
-	n = rb_cmpint(rb_yield(ary), i, memo->min);
+	n = rb_cmpint(rb_yield_values(2, i, memo->min), i, memo->min);
 	if (n < 0) {
 	    memo->min = i;
 	}
-        rb_ary_store(ary, 0, j);
-        rb_ary_store(ary, 1, memo->max);
-	n = rb_cmpint(rb_yield(ary), j, memo->max);
+	n = rb_cmpint(rb_yield_values(2, j, memo->max), j, memo->max);
 	if (n > 0) {
 	    memo->max = j;
 	}
@@ -1264,7 +1247,7 @@
 {
     struct minmax_t *memo = (struct minmax_t *)_memo;
     int n;
-    VALUE ary, j;
+    VALUE j;
 
     ENUM_WANT_SVALUE();
 
@@ -1275,10 +1258,7 @@
     j = memo->last;
     memo->last = Qundef;
 
-    ary = memo->ary;
-    rb_ary_store(ary, 0, j);
-    rb_ary_store(ary, 1, i);
-    n = rb_cmpint(rb_yield(ary), j, i);
+    n = rb_cmpint(rb_yield_values(2, j, i), j, i);
     if (n == 0)
         i = j;
     else if (n < 0) {
@@ -1317,7 +1297,6 @@
     memo.min = Qundef;
     memo.last = Qundef;
     if (rb_block_given_p()) {
-	memo.ary = ary;
 	rb_block_call(obj, id_each, 0, 0, minmax_ii, (VALUE)&memo);
         if (memo.last != Qundef)
             minmax_ii_update(memo.last, memo.last, &memo);

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

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