call時のスタックオーバーフローをチェックを実装した - Scheme VM を書く
以前は push 時にスタックオーバーフローをチェックしていたが、パフォーマンス上 call 時にチェックしたほうが速い(らしい)ので実装。
手順は
- コンパイル時:コンパイル時に各コード片のスタック使用量を計算しコンパイル結果に反映
- コンパイル時:CLOSURE 作成命令列にスタック使用量を紛れ込ませる
- VM実行時:CLOSURE命令時に Closure データ構造に想定最大使用量を記録
- VM実行時:手続きを call する命令(APPLY)時に残りスタックと想定最大使用量を比べてチェック
というもの。
コンパイラの構造変更がややこしかったので svn でブランチ的なものを作って作業をした。
小さな変更をしてコミット&テストを繰り返してやっと実装できた。
手元では fib(30) で1割くらい速くなったのだけどそんなに速くなってないという Gaku さんからの報告も。