2006-04-01から1ヶ月間の記事一覧
さて、 luaD_call に戻る。 firstResult が NULL でないとき、つまり C 関数のときは、各個の C 関数が適切な処理をしてくれるわけでこちらは関知しなくてよい。そうでないときは luaV_execute を実行するが、これも考えなくてよい。おおむね、 CallInfo に…
lua の関数呼出しを受け持つのが luaD_call である。しかし、細かいエラー処理を除くと、実際には luaD_precall を実行し、 luaD_poscall しているにすぎない。そのあいだに、 luaV_execute で実際の関数のコードを呼び出しているが、これは lvm のときまで…
さて、次は ldo に進もうかと思ったが、その前に lua_State の構造の理解が必須だと思ったので先にそれを解説する。先週は lua_State の初期化を見た。今週はまず、 lua_State の内部データを眺める。 struct lua_State { CommonHeader; StkId top; /* first…
次はメモリ管理に進もうかと思ったが、読みすすめていくうちに、どうも lua_State の使い方を見ないと正しく理解できないのではないかと思った。そこで先に lstate を見て lua_State に簡単に触れる。次に ldo を見て lua のコールスタックの使い方を見る。…
lua では関数もファーストクラス値だった。型は次のようになっている。 #define ClosureHeader \ CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist typedef struct CClosure { ClosureHeader; lua_CFunction f; TObject upvalue[1]; } CClos…
http://www.radiumsoftware.com/0604.html#060407 で紹介されていた論文で、テーブルまわりのことはだいたい説明したように書いてあったことを付記しておく。っていうか先に論文を読めという感じですか。この先登場するであろうVM命令の説明とか、 Upval の…
先週は微妙に忙しかったのと、 GC まわりをどうしたものか悩んでいて書けなかった。
さて、あと ltable.c で見ていない関数は luaH_next だ。これは lua の next 関数に対応する(API の lua_next はけっきょく luaH_next を呼んでいる)。 next は、引数としてテーブルとインデックスを取る。インデックスを省略すると「最初の」キーと値のペア…
セット系の関数は次の2つ。 TObject *luaH_set (lua_State *L, Table *t, const TObject *key) { const TObject *p = luaH_get(t, key); t->flags = 0; if (p != &luaO_nilobject) return cast(TObject *, p); else { if (ttisnil(key)) luaG_runerror(L, "t…
テーブルは Lua の最も重要なデータ構造だ。というか、コレクションタイプのデータ構造をこれしか持たない(配列とかは Lua にはない)。さて、ヘッダファイルを見ると、 luaH_ なるプレフィクス(Hはハッシュ表の H だろう)を持つ関数たちが用意されている。ま…
ところで先週書きながら「これ、文字列が書き変わったらどうなるのだろう」というのが気になっていた。のだが、 Lua の言語仕様上、文字列は immutable なのだね。したがって、文字列が書き変わることはない(newstr内でコピーしているから、 Lua のあずかり…