Concurrent Clean : SQLite : cycle in spine

大体できてきたのだけれど、最後のところでcycle in spineエラーが起こる。

      • -

どうやら、Cleanの関数呼び出しの規約をよく理解していなかったことが原因だった模様。
返値がタプルでない場合は、最後にthunkを更新するコードを追加しておく必要がある。
たとえば、

sql_close :: !*SQLConnection !*World -> *World
sql_close c w
    = code {
        pushI_a 0
        pop_a 1
        ccall cc_sql_close "I:V:A"
    }

のように書いていたものを、

sql_close :: !*SQLConnection !*World -> *World
sql_close c w
    = code {
        pushI_a 0
        pop_a 1
        ccall cc_sql_close "I:V:A"
        fill_a 0 1
        pop_a 1
    }

と修正してやったらOKだった。