[ruby-dev:48987] [Ruby trunk - Bug #11163] Binding from Method#to_proc.binding cause BUG
From:
nagachika00@...
Date:
2015-05-21 13:33:30 UTC
List:
ruby-dev #48987
Issue #11163 has been updated by Tomoyuki Chikanaga.
Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
#10432 での修正(r48160)による regression ということですよね。 ruby_2_2 の HEAD でも再現しました。
r48160 は 2.0.0, 2.1 にも backport 済みなので Backport 欄を REQUIRED にしておきます。
----------------------------------------
Bug #11163: Binding from Method#to_proc.binding cause BUG
https://bugs.ruby-lang.org/issues/11163#change-52567
* Author: Koichi Sasada
* Status: Closed
* Priority: Normal
* Assignee: Koichi Sasada
* ruby -v: 2.3dev
* Backport: 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
----------------------------------------
Method オブジェクトから、
to_proc で取り出した Proc オブジェクトから、
Binding を取り出したものを使って eval しようとすると、BUG になります。
```ruby
class C
D = :D
def foo
a = b = c = 123
end
def inspect
"<C object>"
end
end
C.new.method(:foo).to_proc.binding.eval("p [a, b, c]")
```
これは、Method#to_proc したときに、環境をテキトーに弄っているため、不整合を起こすものです。
そもそも、上記の例では foo メソッドは実行されていないため、foo の中の環境が取れる、という変な幻想を与える Binding が取れてはいけないのではないかと思います。
というわけで、このような Binding は、どんなものであるべきでしょうか。レシーバは取れる、cref は同じ、ローカル変数は空、くらいがいいのかと思いますが、どうでしょうか。
解決策としては、現状の method_proc() で何かテキトーに弄っているところではなく、proc_binding で、特殊な環境を作るように変更する必要があるのではないかと思います。
--
https://bugs.ruby-lang.org/