YARV のバイトコードベリファイアを作ってみた の続き

前回は「while に catch table はいらないので消してしまえばいい」と言ってましたが、while true; class C; next; end; end のようなコードでは next が throw になり、これがキャッチできなくなるのでダメでした。
while に対する next の catch table がブロックに対する catch table と違って、next の throw を受けたときに next の引数をスタックに載せないという特別扱いをしているのが問題です。例えば [1].map { next :foo } としたときは :foo がスタックに載って [:foo] が得られます。でも、while true; next :foo; end とか書いても :foo はスタックには載ることなく無視されます。いろいろ不正確ですがまあそんな感じ。
なので、while に対する catch table でもいったんスタックに載せて、すぐ pop するというように改造しました。ささださんがいいと言ってくれたので r16568 でここだけコミット済み。少しだけ命令が増えますが、それこそ while true; class C; next; end; end みたいなコードにしか影響ないはずです。


現バージョンに対するベリファイアのソース。yarv-verifier-20080524.patch
それはそれとして、面倒くさすぎてデバッグできる気がしないんですが、なんかいい方法ないでしょうか。配列による表現だと中途半端にチェックする項目が多いので、いったんバイト列まで落とした方がチェック項目が減って楽かなあ。