[前][次][番号順一覧][スレッド一覧][生データ]

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