Forum: Ruby-dev [ruby-trunk - Bug #5832][Assigned] 意図しないブロック渡しが行われる

Posted by Kazuki Tsujimoto (Guest)
on 2012-01-02 08:46
(Received via mailing list)
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
Posted by ko1 (Koichi Sasada) (Guest)
on 2012-06-25 22:42
(Received via mailing list)
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
Posted by ktsj (Kazuki Tsujimoto) (Guest)
on 2012-08-10 16:54
(Received via mailing list)
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
No account? Register here.