レビュ関連

VALUES_N と PUSH_HANDLERS とか。
まず VALUES_N ですが、VALUES が改善版なのかなぁ。参考まで gauche/vm.h のコメントからスタックの簡易な図を引用。

/*
 * Environment frame
 *
 *   :        :
 *   +--------+
 *   | size=N |
 *   |  info  |
 *   |...up...|<--- ScmEnvFrame* envp
 *   |arg[N-1]|
 *   |arg[N-2]|
 *   :        :
 *   | arg[0] |
 *   +--------+
 *   :        :
 */

あ、成程。VALUES_N は FINISH_ENV されてる事が前提なのかな。逆に VALUES はインストラクションに多値の要素数 (って言えばよいのかどうか微妙) を渡してあげれば OK なのか。

PUSH_HANDLERS なんですが vm->handlers に (before after) なリストを先頭に追加する、というのはぱっと見分かるんですが、after に #f がセットされてます。このあたりって以前のバージョンの実装を見ないと分からんのかな、と書いてる途中で ChangeLog 見れば良いのかも、という事に気づく。

見てみたんですが

ヒントは見つけられなかった。しかも何故にいったん before に val0 代入して直後でスタックから取り出した値を格納しているのかも謎。

            CASE(SCM_VM_PUSH_HANDLERS) {
                ScmObj before, after = SCM_FALSE;
                VM_ASSERT(SP - vm->stackBase >= 1);
                before = VAL0;
                POP_ARG(before);
                vm->handlers = Scm_Acons(before, after, vm->handlers);
                NEXT;
            }

前の実装オトして確認なリキは無いなぁ。とりあえずこちらも上記は略でコメント投入してみる方向ッス。