C と Lua の間のスタック [Lua]
Tcl から Lua のコードを呼べるようなバインディングを作ろうとしていて PiL の C API の部分を読んだ。
Lua と C の間の型付けの違いとメモリ管理の違いを埋める解決策として C-Lua 間では必ず仮想スタックを使ってデータの受け渡しをするというのはへぇと思ったんだけど、実際にコードを書いてみるとなかなか見通しが悪くて苦戦する。
コードを書きながら常にスタックの状態を意識して書かなければならないわけだけど Lua の関数のどれがスタックに値を積むもので、どれが参照するだけで、どれが値を取り出して削除するものかっていうのを把握していないと変なズレが生じる。
そういうズレは当然実行時にしか検出できないのだが、ズレた次の呼び出しとかで顕在化するのでなかなか追いにくい。
基本的に何らかのまとまった処理をした後はスタックが片付いていることを前提としてよいと思うので、とりあえず以下のようなマクロを定義して、
-関数の最初には LUA_ENTER(L); と書く
-キーワードの return は直接使わず LUA_RETURN(L, X) を使う
という規約を作ることにした。
#define LUA_ENTER(L) int __stacksize = lua_gettop(L)
#define LUA_RETURN(L,X) assert(__stacksize == lua_gettop(L));return X
なお lua_gettop は仮想スタックのサイズを返す関数。
2006-11-05 13:52
nice!(0)
コメント(0)
トラックバック(0)
コメント 0