[#45085] [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC — Narihiro Nakamura <authorNari@...>
11 messages
2012/01/04
[#45086] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/04
ささだです.
[#45087] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— Yukihiro Matsumoto <matz@...>
2012/01/04
まつもと ゆきひろです
[#45088] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/04
ささだです.
[#45089] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— Narihiro Nakamura <authornari@...>
2012/01/05
nariです。
[#45090] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/05
ささだです.
[#45110] [ruby-trunk - Feature #5861][Assigned] String#version_compare — Yui NARUSE <naruse@...>
5 messages
2012/01/07
[#45135] [ruby-trunk - Bug #5896][Open] object representaion in rb_enc_vsprintf() — Nobuyoshi Nakada <nobu@...>
6 messages
2012/01/15
[ruby-dev:45071] [ruby-trunk - Bug #5832][Assigned] 意図しないブロック渡しが行われる
From:
Kazuki Tsujimoto <kazuki@...>
Date:
2012-01-02 07:39:12 UTC
List:
ruby-dev #45071
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
--
http://redmine.ruby-lang.org