let 境界と jump のバグ発見 - Scheme VM を書く

pass2(最適化フェーズ)でnamed let または letrec のような local クロージャの call をループ(jump)に変換するときに、その jump がもっとも内側の let の境界を越えてしまいスタックフレームが壊れるバグに遭遇。
pass2 は Gauche のものをほぼそのまま使わせていただいているのですが、let frame が存在するという自前処理系特有の事情でバグらせてしまった。

選択肢としては

  • 境界越えをチェックして越えているなら最適化を通さない
  • let frame をなくす

だな。後者が可能かどうかはもう少し考えて見ないと分からない。