cstack

確認した所、VM の cstack 属性を変更しているのは vm.c の中のみ、に見えます。

  • 一つは user_eval_inner() 手続き
  • Scm_VMUnwindProtect() 手続き

ちょっと微妙なので vm.h にあるコメントと直下にあるマクロを展開してみる。

SCM_UNWIND_PROTECT {
  preprocess
  main operation
} SCM_WHEN_ERROR {
  clean up code on abnormal situation
  SCM_NEXT_HANDLER;
} SCM_END_PROTECT;
clean up code on normal situation

これを展開してみると以下。

    do {
       ScmCStack cstack;
       cstack.prev = Scm_VM()->cstack;
       cstack.cont = NULL;
       Scm_VM()->cstack = &cstack;
       if (sigsetjmp(cstack.jbuf, FALSE) == 0) {
          {
             preprocess
             main_operation
          }
       } else {
          {
             clean_up_code_on_abnormal_situation
             do {
                if (Scm_VM()->cstack->prev) {
                   Scm_VM()->cstack = Scm_VM()->cstack->prev;
                   siglongjmp(Scm_VM()->cstack->jbuf, 1);
                }
                else Scm_Exit(1);
             } while (0)
           }
       }
       Scm_VM()->cstack = Scm_VM()->cstack->prev;
    } while (0)

というカンジ?
# 手動展開です

むむ

やっぱ、setjmp/longjmp なナニをきちっと確認した方が良さげ。どうもこのあたりのコアなソレが微妙ッス。
とは言え、今日も体調微妙なのでこのまま死ぬ可能性大。