続いて 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 が狭くて微妙だな、と。