From 4b295bb7ca2f4ea4aaee2eaf730fb55aae4f716e Mon Sep 17 00:00:00 2001 From: kosaki Date: Mon, 6 Feb 2012 20:03:14 +0000 Subject: merge revision(s) r34399: * vm_eval.c (vm_call0): should pass block to enumerators. patched by Kazuki Tsujimoto. [ruby-dev:44961][Bug #5731] * vm_eval.c (method_missing), vm_insnhelper.c (vm_call_method): ditto. patched by satoshi shiba. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34450 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_eval.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'vm_eval.c') diff --git a/vm_eval.c b/vm_eval.c index 7df7f5f47b..a7e15918b5 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -118,6 +118,7 @@ vm_call0(rb_thread_t* th, VALUE recv, VALUE id, int argc, const VALUE *argv, RB_GC_GUARD(new_args); rb_ary_unshift(new_args, ID2SYM(id)); + th->passed_block = blockptr; return rb_funcall2(recv, idMethodMissing, argc+1, RARRAY_PTR(new_args)); } @@ -547,6 +548,7 @@ method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status) { VALUE *nargv, result, argv_ary = 0; rb_thread_t *th = GET_THREAD(); + const rb_block_t *blockptr = th->passed_block; th->method_missing_reason = call_status; th->passed_block = 0; @@ -572,6 +574,7 @@ method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status) if (rb_method_basic_definition_p(CLASS_OF(obj) , idMethodMissing)) { raise_method_missing(th, argc+1, nargv, obj, call_status | NOEX_MISSING); } + th->passed_block = blockptr; result = rb_funcall2(obj, idMethodMissing, argc + 1, nargv); if (argv_ary) rb_ary_clear(argv_ary); return result; -- cgit v1.2.3