[#44925] [Backport93 - Backport #5702][Open] backport r33935 — Yusuke Endoh <mame@...>

19 messages 2011/12/03

[#44940] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — Tanaka Akira <akr@...>

2011/12/6 <naruse@ruby-lang.org>:

9 messages 2011/12/05
[#44941] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/05

2011年12月5日16:56 Tanaka Akira <akr@fsij.org>:

[#44942] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/05

> おかしいな。gdbmは勝手にcreateフラグを立ててしまうので当該2つの

[#44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない — Yui NARUSE <naruse@...>

12 messages 2011/12/13

[#45021] [ruby-trunk - Bug #5786][Open] LoadError: cannot load such file -- openssl — Kazuhiro NISHIYAMA <redmine@...>

11 messages 2011/12/21

[#45057] [ruby-trunk - Feature #5820][Assigned] Merge Onigmo to Ruby 2.0 — Yui NARUSE <naruse@...>

21 messages 2011/12/28

[ruby-dev:45003] [ruby-trunk - Bug #5731] enum_for を使うと method_missing にブロックが渡されない

From: Kazuki Tsujimoto <kazuki@...>
Date: 2011-12-17 15:33:10 UTC
List: ruby-dev #45003
Issue #5731 has been updated by Kazuki Tsujimoto.


=begin
今のmethod_missing関数の実装はpassed_blockを無条件に0クリアするようになっています。

同関数ではmethod_missingメソッドを呼び出す前に色々と処理を行っており
その際にraiseされる可能性があるので0クリアしておくことは必要ですが、
前処理が終わった時点でpassed_blockを再設定しておかないといけないという話ではないかと思います。

以下のパッチでどうでしょうか。

 diff --git a/vm_eval.c b/vm_eval.c
 index 44edf6f..d653e4e 100644
 --- a/vm_eval.c
 +++ b/vm_eval.c
 @@ -563,6 +563,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;
 @@ -589,6 +590,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;
=end

----------------------------------------
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: ruby 1.9.3p0 (2011-10-30) [i686-linux]


次のスクリプトを 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]
#<Proc:0xb76dbb60@a.rb:9>
#<Proc:0xb76db8e0@a.rb:10>

% ruby -v a.rb
ruby 1.9.3p0 (2011-10-30) [i686-linux]
#<Proc:0x8829080@a.rb:9>
nil

# 使い方が間違ってるだけだったらすいません



-- 
http://redmine.ruby-lang.org

In This Thread