summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-15 10:14:22 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-15 10:14:22 +0000
commitd135138f9b7b64dc49025e27b5a7c9f97b11fa6d (patch)
treeb32059c69147749408f8e46d7cb91de8c49ff92c /enumerator.c
parent032861ade7bdbe2c7e939b9b2995ed2ad1a1cdc6 (diff)
* 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
Diffstat (limited to 'enumerator.c')
-rw-r--r--enumerator.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/enumerator.c b/enumerator.c
index ea4d4fcbe4..09543940f4 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -1374,6 +1374,18 @@ lazy_grep(VALUE obj, VALUE 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)
{
VALUE yielder, ary, v;
@@ -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);