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/