From: satoshi shiba Date: 2011-12-19T11:04:41+09:00 Subject: [ruby-dev:45007] [ruby-trunk - Bug #5731] enum_for を使うと method_missing にブロックが渡されない Issue #5731 has been updated by satoshi shiba. 芝と申します。 パッチが正しいかどうかは分かりませんが、passing_block の設定が抜けてる関数は method_missing 以外にもあるので、一緒に対処してはどうでしょうか。 例えば、vm_call0 での passing_block の設定忘れは次のコードで確認できます。 # 問題となるコード(vm_call0 のほう) # missing.rb def respond_to_missing?(*args) true end def method_missing(mid, *args) yield end m = method(:call_missing) m.call(){ puts "passing block ok" } # 追加パッチ Index: vm_eval.c =================================================================== --- vm_eval.c (revision 34071) +++ vm_eval.c (working copy) @@ -118,6 +118,7 @@ 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)); } Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 34071) +++ vm_insnhelper.c (working copy) @@ -555,6 +555,7 @@ argv[0] = ID2SYM(me->def->original_id); MEMCPY(argv+1, cfp->sp - num, VALUE, num); cfp->sp += - num - 1; + th->passed_block = blockptr; val = rb_funcall2(recv, rb_intern("method_missing"), num+1, argv); break; } ---------------------------------------- Bug #5731: enum_for を使うと method_missing にブロックが渡されない https://bugs.ruby-lang.org/issues/5731 Author: Masahiro Tomita Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: - 次のスクリプトを 1.9.3 で実行すると enum_for の方は block が nil になります。 1.8.7 では両方とも block が渡されました。 --------------------------------------------- class A def method_missing(name, *args, &block) p block end end a = A.new a.hoge{|l| p l} # ブロックが渡される a.enum_for(:hoge).each{|l| p l} # ブロックが渡されない --------------------------------------------- % /usr/local/ruby187/bin/ruby -v a.rb ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] # # % ruby -v a.rb ruby 1.9.3p0 (2011-10-30) [i686-linux] # nil # 使い方が間違ってるだけだったらすいません -- http://redmine.ruby-lang.org