[#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:45007] [ruby-trunk - Bug #5731] enum_for を使うと method_missing にブロックが渡されない

From: satoshi shiba <shiba@...>
Date: 2011-12-19 02:04:41 UTC
List: ruby-dev #45007
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]
#<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

Prev Next