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

ruby-changes:25443

From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:10:54 +0900 (JST)
Subject: [ruby-changes:25443] marcandRe: r37500 (trunk): * array.c: Support for Enumerator#size in trivial cases:

marcandre	2012-11-07 02:10:50 +0900 (Wed, 07 Nov 2012)

  New Revision: 37500

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

  Log:
    * array.c: Support for Enumerator#size in trivial cases:
      each, each_index, reverse_each, sort_by, collect,
      collect!, select, select!, keep_if, reject, reject!, delete_if
      [Feature #6636]

  Modified files:
    trunk/array.c
    trunk/test/ruby/test_enumerator.rb

Index: array.c
===================================================================
--- array.c	(revision 37499)
+++ array.c	(revision 37500)
@@ -1563,7 +1563,7 @@
     long i;
     volatile VALUE ary = array;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     for (i=0; i<RARRAY_LEN(ary); i++) {
 	rb_yield(RARRAY_PTR(ary)[i]);
     }
@@ -1592,7 +1592,7 @@
 rb_ary_each_index(VALUE ary)
 {
     long i;
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
 
     for (i=0; i<RARRAY_LEN(ary); i++) {
 	rb_yield(LONG2NUM(i));
@@ -1620,7 +1620,7 @@
 {
     long len;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     len = RARRAY_LEN(ary);
     while (len--) {
 	rb_yield(RARRAY_PTR(ary)[len]);
@@ -2291,7 +2291,7 @@
 {
     VALUE sorted;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     rb_ary_modify(ary);
     sorted = rb_block_call(ary, rb_intern("sort_by"), 0, 0, sort_by_i, 0);
     rb_ary_replace(ary, sorted);
@@ -2325,7 +2325,7 @@
     long i;
     VALUE collect;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     collect = rb_ary_new2(RARRAY_LEN(ary));
     for (i = 0; i < RARRAY_LEN(ary); i++) {
 	rb_ary_push(collect, rb_yield(RARRAY_PTR(ary)[i]));
@@ -2358,7 +2358,7 @@
 {
     long i;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     rb_ary_modify(ary);
     for (i = 0; i < RARRAY_LEN(ary); i++) {
 	rb_ary_store(ary, i, rb_yield(RARRAY_PTR(ary)[i]));
@@ -2441,7 +2441,7 @@
     VALUE result;
     long i;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     result = rb_ary_new2(RARRAY_LEN(ary));
     for (i = 0; i < RARRAY_LEN(ary); i++) {
 	if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
@@ -2472,7 +2472,7 @@
 {
     long i1, i2;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     rb_ary_modify(ary);
     for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) {
 	VALUE v = RARRAY_PTR(ary)[i1];
@@ -2508,7 +2508,7 @@
 static VALUE
 rb_ary_keep_if(VALUE ary)
 {
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     rb_ary_select_bang(ary);
     return ary;
 }
@@ -2737,7 +2737,7 @@
 static VALUE
 rb_ary_reject_bang(VALUE ary)
 {
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     return ary_reject_bang(ary);
 }
 
@@ -2759,7 +2759,7 @@
 {
     VALUE rejected_ary;
 
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     rejected_ary = rb_ary_new();
     ary_reject(ary, rejected_ary);
     return rejected_ary;
@@ -2786,7 +2786,7 @@
 static VALUE
 rb_ary_delete_if(VALUE ary)
 {
-    RETURN_ENUMERATOR(ary, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ary, 0, 0, rb_ary_length);
     ary_reject_bang(ary);
     return ary;
 }
Index: test/ruby/test_enumerator.rb
===================================================================
--- test/ruby/test_enumerator.rb	(revision 37499)
+++ test/ruby/test_enumerator.rb	(revision 37500)
@@ -420,5 +420,14 @@
     assert_equal 42, enum.with_index.size
     assert_equal 42, enum.with_object(:foo).size
   end
+
+  def test_size_for_enum_created_from_array
+    arr = %w[hello world]
+    %i[each each_with_index reverse_each sort_by! sort_by map map!
+      keep_if reject! reject select! select delete_if].each do |method|
+      assert_equal arr.size, arr.send(method).size
+    end
+  end
+
 end
 

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

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