いくつか

dynamic-wind

dynamic-wind と言えば以下なドキュメント

昨晩の検討を踏まえてこの文書をざっくり眺めたら、なんとなくではありますが_成程ね_という気持ちになれました。理解したワケではないあたりが微妙ですが。

Scm_VMCallCC() 手続き

ヒッカッカってるのが cstack なんですが、微妙なメモによれば try-catch な unwind-protect あたり、というか Scm_VMUnwindProtect() あたりが怪しいのかな、という素人考えッス。
件の call/cc な引数の手続きに渡される_継続_は vm.c の throw_continuation() 手続きで作成されるナニ。問題にしてるのは以下ですな。

    if (vm->cstack != ep->cstack) {
        ScmCStack *cstk;
        for (cstk = vm->cstack; cstk; cstk = cstk->prev) {
            if (ep->cstack == cstk) break;
        }
        if (cstk == NULL) {
            Scm_Error("a continuation is thrown outside of it's extent: %p",
                      ep);
        } else {
            /* Rewind C stack */
            vm->escapeReason = SCM_VM_ESCAPE_CONT;
            vm->escapeData[0] = ep;
            vm->escapeData[1] = args;
            siglongjmp(vm->cstack->jbuf, 1);
        }
    } else {

基本的に sigsetjmp してるのは

  • user_eval_inner() 手続き
  • Scm_VMUnwindProtect() 手続き

らしい。

今日はダメです

DebugHacks 見つつ爆呑予定。
# と言いつつもう寝るのですが