ひとり勉強会

ひとり楽しく勉強会

2008-04-28から1日間の記事一覧

おまけ:LuLu (3)

LUA

今日の成果 → http://hzkr.kokage.cc/lulu3.zip ちょっとソースコードが酷いですごめんなさい。CALLのコードが3カ所くらいにコピペされてます。あとでちゃんとリファクタリングする。。。 今回読んだ全命令を実装(ただし、メタテーブルの処理は除く)して…

VM命令:まとめ

LUA

Lua 5.1 の VM の全命令を分類すると、こうなります。 変数/定数コピー MOVE, LOADK, LOADNIL グローバル GETGLOBAL, SETGLOBAL 関数呼び出し CALL, TAILCALL, RETURN 演算子 ADD, SUB, MUL, DIV, MOD, POW, UNM, NOT, LEN, CONCAT, GETTABLE, SETTABLE ジャ…

VM命令:可変長引数

LUA

前回可変長の扱いをサボったので今回ちゃんと読むことにしました。 まず、可変長引数の関数が呼び出されたときは、luaD_precall内でその「調整」が行われます。 else { /* vararg function */ int nargs = cast_int(L->top - func) - 1; base = adjust_varar…

VM命令:クロージャ

LUA

お待ちかね?のクロージャの実装です。こんなサンプル行ってみましょう。 function counter() local x = 0 local up = function() x=x+1 return x end local dn = function() x=x-1 return x end return up, dn end up,dn = counter() print(up()) -- 1 prin…

VM命令:ループ

LUA

while文やrepeat文は特別なことは何もなく、条件分岐を使って実現されてます。問題はfor文で、これには専用命令が用意されています。まずは数値に関するループから。 for i=1,100 do print(i) end これは、ループの頭にFORPREP命令と、実際にループを司るFOR…

VM命令:ジャンプ

LUA

LuaVMには純粋なジャンプ命令は1つしかありません。相対距離をオペランドにとって、pcを変化させる無条件ジャンプです。 case OP_JMP: { dojump(L, pc, GETARG_sBx(i)); continue; } dojumpマクロの定義はこうで #define dojump(L,pc,i) {(pc) += (i); luai…

VM命令:演算子

LUA

Luaの演算子に一対一に対応した命令がそれぞれ用意されています。OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_POW, OP_UNM, OP_NOT, OP_LEN, OP_CONCAT, OP_GETTABLE, OP_SETTABLE。例として、OP_ADDの実装はこんなんです。 case OP_ADD: { arith_op(luai_n…

Luaソースコード勉強会 (3)

LUA

今回の目標は、Lua VMの命令セット完全制覇!です。