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 なナニをきちっと確認した方が良さげ。どうもこのあたりのコアなソレが微妙ッス。
とは言え、今日も体調微妙なのでこのまま死ぬ可能性大。