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

ruby-changes:25455

From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:13:56 +0900 (JST)
Subject: [ruby-changes:25455] marcandRe: r37512 (trunk): * hash.c: Support for enumerators created by ENV:

marcandre	2012-11-07 02:13:48 +0900 (Wed, 07 Nov 2012)

  New Revision: 37512

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

  Log:
    * hash.c: Support for enumerators created by ENV:
              each, each_value, ...
      [Feature #6636]

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

Index: hash.c
===================================================================
--- hash.c	(revision 37511)
+++ hash.c	(revision 37512)
@@ -2549,12 +2549,30 @@
  * An Enumerator is returned if no block is given.
  */
 static VALUE
+rb_env_size(VALUE ehash)
+{
+    char **env;
+    long cnt = 0;
+
+    rb_secure(4);
+
+    env = GET_ENVIRON(environ);
+    for (; *env ; ++env) {
+	if (strchr(*env, '=')) {
+	    cnt++;
+	}
+    }
+    FREE_ENVIRON(environ);
+    return LONG2FIX(cnt);
+}
+
+static VALUE
 env_each_key(VALUE ehash)
 {
     VALUE keys;
     long i;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     keys = env_keys();	/* rb_secure(4); */
     for (i=0; i<RARRAY_LEN(keys); i++) {
 	rb_yield(RARRAY_PTR(keys)[i]);
@@ -2603,7 +2621,7 @@
     VALUE values;
     long i;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     values = env_values();	/* rb_secure(4); */
     for (i=0; i<RARRAY_LEN(values); i++) {
 	rb_yield(RARRAY_PTR(values)[i]);
@@ -2629,7 +2647,7 @@
     VALUE ary;
     long i;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
 
     rb_secure(4);
     ary = rb_ary_new();
@@ -2666,7 +2684,7 @@
     long i;
     int del = 0;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     keys = env_keys();	/* rb_secure(4); */
     for (i=0; i<RARRAY_LEN(keys); i++) {
 	VALUE val = rb_f_getenv(Qnil, RARRAY_PTR(keys)[i]);
@@ -2694,7 +2712,7 @@
 static VALUE
 env_delete_if(VALUE ehash)
 {
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     env_reject_bang(ehash);
     return envtbl;
 }
@@ -2735,7 +2753,7 @@
     VALUE result;
     char **env;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     rb_secure(4);
     result = rb_hash_new();
     env = GET_ENVIRON(environ);
@@ -2769,7 +2787,7 @@
     long i;
     int del = 0;
 
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     keys = env_keys();	/* rb_secure(4); */
     for (i=0; i<RARRAY_LEN(keys); i++) {
 	VALUE val = rb_f_getenv(Qnil, RARRAY_PTR(keys)[i]);
@@ -2797,7 +2815,7 @@
 static VALUE
 env_keep_if(VALUE ehash)
 {
-    RETURN_ENUMERATOR(ehash, 0, 0);
+    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
     env_select_bang(ehash);
     return envtbl;
 }
Index: test/ruby/test_enumerator.rb
===================================================================
--- test/ruby/test_enumerator.rb	(revision 37511)
+++ test/ruby/test_enumerator.rb	(revision 37512)
@@ -450,6 +450,12 @@
     end
   end
 
+  def test_size_for_enum_created_from_env
+    %i[each_pair reject! delete_if select select! keep_if].each do |method|
+      assert_equal ENV.size, ENV.send(method).size
+    end
+  end
+
   def check_consistency_for_combinatorics(method)
     [ [], [:a, :b, :c, :d, :e] ].product([-2, 0, 2, 5, 6]) do |array, arg|
       assert_equal array.send(method, arg).to_a.size, array.send(method, arg).size,

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

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