From d135138f9b7b64dc49025e27b5a7c9f97b11fa6d Mon Sep 17 00:00:00 2001 From: shugo Date: Thu, 15 Mar 2012 10:14:22 +0000 Subject: * enumerator.c (lazy_zip): rescue StopIteration returned by Enumerator#next. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35042 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- enumerator.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'enumerator.c') diff --git a/enumerator.c b/enumerator.c index ea4d4fcbe4..09543940f4 100644 --- a/enumerator.c +++ b/enumerator.c @@ -1373,6 +1373,18 @@ lazy_grep(VALUE obj, VALUE pattern) return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_grep_func, pattern); } +static VALUE +call_next(VALUE obj) +{ + return rb_funcall(obj, id_next, 0); +} + +static VALUE +next_stopped(VALUE obj) +{ + return Qnil; +} + static VALUE lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv) { @@ -1383,7 +1395,8 @@ lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv) ary = rb_ary_new2(RARRAY_LEN(arg) + 1); rb_ary_push(ary, argv[1]); for (i = 0; i < RARRAY_LEN(arg); i++) { - v = rb_funcall(RARRAY_PTR(arg)[i], id_next, 0); + v = rb_rescue2(call_next, RARRAY_PTR(arg)[i], next_stopped, 0, + rb_eStopIteration, 0); rb_ary_push(ary, v); } rb_funcall(yielder, id_yield, 1, ary); -- cgit v1.2.3