From: "ktsj (Kazuki Tsujimoto)" Date: 2012-08-10T23:54:05+09:00 Subject: [ruby-dev:46036] [ruby-trunk - Bug #5832] 意図しないブロック渡しが行われる Issue #5832 has been updated by ktsj (Kazuki Tsujimoto). Assignee changed from ko1 (Koichi Sasada) to ktsj (Kazuki Tsujimoto) レビューありがとうございました。 対応しておきます。 ---------------------------------------- Bug #5832: 意図しないブロック渡しが行われる https://bugs.ruby-lang.org/issues/5832#change-28764 Author: ktsj (Kazuki Tsujimoto) Status: Assigned Priority: Normal Assignee: ktsj (Kazuki Tsujimoto) Category: YARV Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux] =begin 辻本です。 invoke_block_from_cの呼び出しの際に渡していたブロックが VM loopから続けて呼び出される別のメソッドにも渡されてしまうケースがあります。 $ ./ruby -ve " require 'pp' require 'pathname' class <'", "-e:19:in `
'"] blockptrはフレームに積まれることになるので、 passed_blockに代入する行は単純に削除してしまって良いと思います。 diff --git a/vm.c b/vm.c index 2f38eee..3ea190f 100644 --- a/vm.c +++ b/vm.c @@ -597,7 +597,6 @@ invoke_block_from_c(rb_thread_t *th, const rb_block_t *block, iseq->local_size - arg_size); ncfp->me = th->passed_me; th->passed_me = 0; - th->passed_block = blockptr; if (cref) { th->cfp->dfp[-1] = (VALUE)cref; =end -- http://bugs.ruby-lang.org/