From 0814c4ac643fcbb2d7f2d6c077fa1626a5e59b77 Mon Sep 17 00:00:00 2001 From: marcandre Date: Tue, 6 Nov 2012 17:16:58 +0000 Subject: * enumerator.c: Support for lazy.cycle.size [Feature #6636] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37525 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- enum.c | 2 +- enumerator.c | 7 ++++++- internal.h | 3 +++ test/ruby/test_lazy_enumerator.rb | 9 +++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/enum.c b/enum.c index e9c925611d..789a88b8ca 100644 --- a/enum.c +++ b/enum.c @@ -2235,7 +2235,7 @@ cycle_i(VALUE i, VALUE ary, int argc, VALUE *argv) return Qnil; } -static VALUE +VALUE enum_cycle_size(VALUE self, VALUE args) { long mul; diff --git a/enumerator.c b/enumerator.c index 0a51709ac1..9223979445 100644 --- a/enumerator.c +++ b/enumerator.c @@ -1740,6 +1740,11 @@ lazy_drop_while(VALUE obj) Qnil, 0); } +static VALUE +lazy_cycle_size(VALUE lazy) { + return enum_cycle_size(rb_ivar_get(lazy, id_receiver), rb_ivar_get(lazy, id_arguments)); +} + static VALUE lazy_cycle_func(VALUE val, VALUE m, int argc, VALUE *argv) { @@ -1764,7 +1769,7 @@ lazy_cycle(int argc, VALUE *argv, VALUE obj) return lazy_set_method(rb_block_call(rb_cLazy, id_new, len, RARRAY_PTR(args), lazy_cycle_func, args /* prevent from GC */), - rb_ary_new4(argc, argv), 0); + rb_ary_new4(argc, argv), lazy_cycle_size); } static VALUE diff --git a/internal.h b/internal.h index 5b66192ddf..9bf66c2780 100644 --- a/internal.h +++ b/internal.h @@ -87,6 +87,9 @@ ID rb_id_encoding(void); /* encoding.c */ void rb_gc_mark_encodings(void); +/* enum.c */ +VALUE enum_cycle_size(VALUE self, VALUE args); + /* error.c */ NORETURN(PRINTF_ARGS(void rb_compile_bug(const char*, int, const char*, ...), 3, 4)); VALUE rb_check_backtrace(VALUE); diff --git a/test/ruby/test_lazy_enumerator.rb b/test/ruby/test_lazy_enumerator.rb index 9647590136..b34bb033d5 100644 --- a/test/ruby/test_lazy_enumerator.rb +++ b/test/ruby/test_lazy_enumerator.rb @@ -346,5 +346,14 @@ EOS assert_equal 0, lazy.drop(4).size assert_equal Float::INFINITY, loop.lazy.drop(4).size assert_equal nil, lazy.select{}.drop(4).size + + assert_equal 0, lazy.cycle(0).size + assert_equal 6, lazy.cycle(2).size + assert_equal 3 << 80, 4.times.inject(lazy){|enum| enum.cycle(1 << 20)}.size + assert_equal Float::INFINITY, lazy.cycle.size + assert_equal Float::INFINITY, loop.lazy.cycle(4).size + assert_equal Float::INFINITY, loop.lazy.cycle.size + assert_equal nil, lazy.select{}.cycle(4).size + assert_equal nil, lazy.select{}.cycle.size end end -- cgit v1.2.3