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() なソレとかを確認するリキ無い。とりあえず微妙ではありますが、現時点でエントリ投入。