yarv-dev:715
From: Minero Aoki <aamine loveruby.net>
Date: Tue, 27 Dec 2005 15:48:23 +0900 (JST)
Subject: [yarv-dev:715] close> Re: return from ensure
青木です。 In mail "[yarv-dev:705] fixed> Re: open> return from ensure" SASADA Koichi <ko1 atdot.net> wrote: > ささだです。 > > ensure 節から return したら SEGV しました。 > > > > ~/c/yarv % ./miniruby -e 'def m() 2 ensure return 3; end; p m()' > で、これはいったい何か、というとそのスタックフレームから戻る前に、ス > タックの深さのチェックをしています。end 命令は 1 つ詰まれたスタックから > 戻る、という命令なのですが、その際にはスタックにはただ 1 つしか詰まれて > いないといけません(深さ 1)。そうじゃないと、バグです。実際、このチェッ > クを入れて、多めに積んでいた場合、stack underflow していた場合のバグを発 > 見できました。多くの場合、この問題は compiler のバグです。 > > で、その問題というのは対応しました。 修正を確認しましたので close します。 > どういう話だったかというと、先の命令列をコンパイルすると以下のようにな > ります。 > にあるとおりですが、putobject を2回呼び出してスタックの深さが 2 になっ > ていたところで end 命令を呼んでいます。スタックの深さが 2 なので、stack > consistency error になります。 > で、根本的な原因は、 > > * YARV では method 中の return 文は end 命令へジャンプするだけ > > ということでした。ensure 節をコンパイル中に、その直前でいくつスタック > が詰まれているかわからない、というのが問題です。 > > で、解決策としては、ensure 節(メソッド中)で return があった場合、 > emptstack という命令を用意して、そいつでスタックを空にして、end 命令を実 > 行することにしました。 詳細な解説ありがとうございます。納得しました。 -- 青木峰郎 -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
702 2005-12-26 02:29 [aamine loveruby.net ] open> return from ensure 705 2005-12-26 07:50 ┗[ko1 atdot.net ] fixed> Re: open> return from ensure -> 715 2005-12-27 15:48 ┗[aamine loveruby.net ] close> Re: return from ensure