Project

General

Profile

Actions

Bug #1143

closed

ruby 1.9.1p0でensure節が実行されない

Added by snowfield (Jirou Iizuka) over 12 years ago. Updated about 10 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
ruby -v:
ruby 1.9.1p0 (2009-01-20 revision 21700) [i386-mingw32]
Backport:
[ruby-dev:37967]

Description

=begin
ruby 1.9.1p0で以下を実行した場合、ensure節が実行されません。

def test
return while true
ensure
puts("ENSURE")
end

test

$ ruby -v test.rb
ruby 1.9.1p0 (2009-01-20 revision 21700) [i386-mingw32]

$

別スレッド内で実行しても、またmswin32およびFreeBSD 7.1R/i386版でも実行したところ、やはり同じ結果でした。
ruby 1.8.7p72 (mswin32, FreeBSD 7.1R/i386) 版は上記の通りでもensure節が実行されます。

returnではなくbreakにするとensure節は実行されます。

ifやforでは問題が起こらず、while/untilからのreturnで実行が飛ばされるようです。
=end

Actions #1

Updated by ko1 (Koichi Sasada) about 12 years ago

=begin
 ささだです.

Jirou Iizuka wrote::

Bug #1143: ruby 1.9.1p0でensure節が実行されない
http://redmine.ruby-lang.org/issues/show/1143

 ありがとうございます.バグでした.

 具体的には,while/end では,break やら redo やらを行ったとき,
while/end の外の ensure 節はそのときに実行する必要はないのですが,return
も同様だと思ってしまった,というのが原因でした.return の場合はその場で
ensure 節を実行する必要がある,と.

 YARV では,最近の javac のように ensure 節をコピーしてくっつけるような
実装になっているのですが,その辺の処理のバグということになります.

 というのはすぐに気づいたんですが,何しろ ensure 周りのコードは難しく
て,どうなってんのか読んでもさっぱりわからなかったので時間がかかってしま
いました.

--
// SASADA Koichi at atdot dot net

=end

Actions #2

Updated by ko1 (Koichi Sasada) about 12 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r22363.
=end

Actions

Also available in: Atom PDF