vm->handlers とか

色々確認してみます。最初 vm.c を emacs で開いて M-x occur で vm->handlers 探してたんですが、core.c でも何かしている模様 (これは別途確認)。
vm.c において vm->handlers に何かが代入されるタイミングが以下。

  • PUSH_HANDLERS インストラクション
  • POP_HANDLERS インストラクション

上記はスデに obsolete ?

  • Scm_VMDynamicWind() 手続き
    • Scm_VMEval() 手続き
    • Scm_VMDynamicWindC() 手続きから呼ばれる
    • with_error_handler() 手続きから呼ばれる
    • Scm_VMWithExceptionHandler() 手続きから呼ばれる
    • Scm_VMLoadFromPort() 手続き (load.c) から呼ばれる
    • Scm_VMWithPortLocking() 手続き (port.c) から呼ばれる

ちなみに Scm_VMDynamicWind() 手続きですが色々な意味で複雑怪奇。定義は以下。

ScmObj Scm_VMDynamicWind(ScmObj before, ScmObj body, ScmObj after)
{
    void *data[3];

    /* NB: we don't check types of arguments, since we allo object-apply
       hooks can be used for them. */
    data[0] = (void*)before;
    data[1] = (void*)body;
    data[2] = (void*)after;

    Scm_VMPushCC(dynwind_before_cc, data, 3);
    return Scm_VMApply0(before);
}

上記、Scm_VMDynamicWind() に渡された引数と共に dynwind_before_cc が次に実行される継続を push して before を apply (引数ナシ) している。
とりあえず控えてるドキュメントのポインタを以下に。

VMのスタック操作(未完) によれば_C-continuationではsizeワード分だけスタックの上方向に余分なデータが_とある。Scm_VMPushCC() 手続きの中を見るに

  • argp 属性は NULL なので C-continuation
  • 引数を積んでいる

というあたりでこの手続きは C-continuation をナニする手続きに違いない、と見当。
# 一応上記のドキュメントにもそんな記述があります

スデに Scm_VMPushCC() 手続きとか POP_CONT() なソレとかを確認するリキ無い。とりあえず微妙ではありますが、現時点でエントリ投入。