diff --git a/ChangeLog b/ChangeLog index 7f4112763f..3ff46b2b8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Thu Sep 20 00:42:20 2012 Nobuyoshi Nakada + + * array.c (take_items), enum.c (enum_zip): raise TypeError at + non-enumerable objects, not NoMethodError. [ruby-dev:46145] + [Bug #7038] + + * vm_eval.c (rb_check_block_call): check_funcall variant with block + function. + Tue Sep 18 17:51:29 2012 NARUSE, Yui * ext/openssl/ossl_ssl.c (ossl_sslctx_attrs): add npn_select_db to diff --git a/array.c b/array.c index 8b2c4c5c8b..0e4061931f 100644 --- a/array.c +++ b/array.c @@ -2795,7 +2795,8 @@ take_items(VALUE obj, long n) if (!NIL_P(result)) return rb_ary_subseq(result, 0, n); result = rb_ary_new2(n); args[0] = result; args[1] = (VALUE)n; - rb_block_call(obj, rb_intern("each"), 0, 0, take_i, (VALUE)args); + if (rb_check_block_call(obj, rb_intern("each"), 0, 0, take_i, (VALUE)args) == Qundef) + Check_Type(obj, T_ARRAY); return result; } diff --git a/enum.c b/enum.c index ac86c9d550..0e4cf33d12 100644 --- a/enum.c +++ b/enum.c @@ -2010,6 +2010,7 @@ enum_zip(int argc, VALUE *argv, VALUE obj) if (!allary) { CONST_ID(conv, "to_enum"); for (i=0; iobj, arg->mid, arg->argc, arg->argv); +} + +VALUE +rb_check_block_call(VALUE obj, ID mid, int argc, VALUE * argv, + VALUE (*bl_proc) (ANYARGS), VALUE data2) +{ + struct iter_method_arg arg; + + arg.obj = obj; + arg.mid = mid; + arg.argc = argc; + arg.argv = argv; + return rb_iterate(iterate_check_method, (VALUE)&arg, bl_proc, data2); +} + VALUE rb_each(VALUE obj) {