Issue #5832 has been reported by Kazuki Tsujimoto. ---------------------------------------- Bug #5832: 意図しないブロック渡しが行われる https://bugs.ruby-lang.org/issues/5832 Author: Kazuki Tsujimoto Status: Assigned Priority: Normal Assignee: Koichi Sasada 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 <<File alias realpath_orig realpath def realpath(*args) yield if block_given? realpath_orig(*args) end end pathname = Pathname.new('.') Class.new do define_method(:foo) { pathname.realpath } end.new.foo { pp caller } " ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux] ["-e:9:in `realpath'", "-e:17:in `realpath'", "-e:17:in `block (2 levels) in <main>'", "-e:19:in `<main>'"] 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
on 2012-01-02 08:46
on 2012-06-25 22:42
Issue #5832 has been updated by ko1 (Koichi Sasada). 見落としていてすみません. 良さそうに見えるので,テストが通れば,テストを追加してコミット頂けませんか. ---------------------------------------- Bug #5832: 意図しないブロック渡しが行われる https://bugs.ruby-lang.org/issues/5832#change-27446 Author: ktsj (Kazuki Tsujimoto) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) 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 <<File alias realpath_orig realpath def realpath(*args) yield if block_given? realpath_orig(*args) end end pathname = Pathname.new('.') Class.new do define_method(:foo) { pathname.realpath } end.new.foo { pp caller } " ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux] ["-e:9:in `realpath'", "-e:17:in `realpath'", "-e:17:in `block (2 levels) in <main>'", "-e:19:in `<main>'"] 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
on 2012-08-10 16:54
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 <<File alias realpath_orig realpath def realpath(*args) yield if block_given? realpath_orig(*args) end end pathname = Pathname.new('.') Class.new do define_method(:foo) { pathname.realpath } end.new.foo { pp caller } " ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux] ["-e:9:in `realpath'", "-e:17:in `realpath'", "-e:17:in `block (2 levels) in <main>'", "-e:19:in `<main>'"] 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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.