いくつか
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 見つつ爆呑予定。
# と言いつつもう寝るのですが