続いて Scm_VMCallCC() を調べる
昨晩は仕事割り込みで時間が取れず。夕方時分からごそごそ開始。
昨晩のナニ
あまり背景は意識せずに掘削してみる事に。ええと
gosh> (define cont #f) cont gosh> (list 1 2 3 (call/cc (lambda (c) (set! cont c) 4)) 5 6) (1 2 3 4 5 6) gosh>
で c に渡される継続手続きが問題になっている throw_continuation() 手続き。
- vm->cstack と call/cc 時点の vm->cstack が異なる場合
- vm->cstack 巻き戻して call/cc 時点の vm->cstack がリンクリストの中に無かったらエラーにしている
- エラーで無ければ
- vm->escapeReason に SCM_VM_ESCAPE_CONT をセット
- vm->escapeData[0] に ep をセット
- vm->escapeData[1] に args (継続手続きに渡された引数) をセット
- vm->cstack->jbuf で siglongjmp
- vm->cstack と call/cc 時点の vm->cstack が同一オブジェクトな場合
- handler なリスト作って
- throw_cont_body() 手続き呼び出し
むむ
この handlers な扱いって dynamic-wind と関係あるのかなぁ。メモ取りつつ ReadingGauche 方面に反映予定ッス。
メモ
とりあえず底から、という事で見てみると throw_cont_body() からな模様。とりあえづ handlers が pair なソレから、と思ったんですが timeup ッス。微妙に view が狭くて微妙だな、と。