lua
luaL_newstateは先のlua_newstateにLuaが提供するシンプルなアロケータ(とエラー発生時呼び出す関数)を指定して呼び出す関数。 LUALIB_API lua_State *luaL_newstate (void) { lua_State *L = lua_newstate(l_alloc, NULL); if (L) lua_atpanic(L, &panic)…
lua_newstateは一個のlua_Stateとglobal_Stateからなるメインスレッド(ネイティブスレッドではなくいわゆるグリーンスレッド)を初期化する関数。基本的には領域とってきて値を設定してるだけです。 LUA_API lua_State *lua_newstate (lua_Alloc f, void *u…
Lua VM一個にglobal_Stateが一個。VMが保持しておくべきアロケータへのポインタとかGCの状態とかを保持しておく。全てのlua_Stateはこのglobal_Stateへの参照を保持する。 /* ** `global state', shared by all threads of this state */ typedef struct glo…
ひどい話でObjectStackのリサイズをまだ実装していない。スタックそのものをreallocしたあとには当然スタック割り当てを指してるオブジェクト達のポインタを修正してやらにゃならんのだけど、どっかで漏れてるようでうまくいかない。気分転換にプロファイリ…
refixするように実装した。 % cat |./src/lua-stackalloc-dev local t = {10, 20} local u = {t} u[1][1] = u[1][1] + 100 print("t[1]", t[1]) print("u[1][1]", u[1][1]) v = {t} v[1][1] = v[1][1] + 100 print("t[1]", t[1]) print("u[1][1]", u[1][1]) …
AO benchが動いたので % grep 'model name' /proc/cpuinfo model name : AMD Athlon(tm)64 X2 Dual Core Processor 4600+ model name : AMD Athlon(tm)64 X2 Dual Core Processor 4600+ % uname -a Linux rambai.cs.uec.ac.jp 2.6.26-2-amd64 #1 SMP Fri Aug…
lobject.h /* ** Upvalues */ typedef struct UpVal { CommonHeader; TValue *v; /* points to stack or to its own value */ union { TValue value; /* the value (when closed) */ struct { /* double linked list (when open) */ struct UpVal *prev; str…
lobject.h /* ** Function Prototypes */ typedef struct Proto { CommonHeader; TValue *k; /* constants used by the function */ Instruction *code; struct Proto **p; /* functions defined inside the function */ int *lineinfo; /* map from opcodes…
lobject.h /* ** Closures */ #define ClosureHeader \ CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ struct Table *env typedef struct CClosure { ClosureHeader; lua_CFunction f; TValue upvalue[1]; } CClosure; typedef struct…
lgc.h #define luaC_checkGC(L) { \ condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \ if (G(L)->totalbytes >= G(L)->GCthreshold) \ luaC_step(L); } 総アロケート量が閾値を超えているときにGCステップの呼び出し。超えてな…
lmem.c /* ** generic allocation routine. */ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { global_State *g = G(L); lua_assert((osize == 0) == (block == NULL)); block = (*g->frealloc)(g->ud, block, osize, nsiz…
lvm.c void luaV_execute (lua_State *L, int nexeccalls) { LClosure *cl; StkId base; TValue *k; const Instruction *pc; reentry: /* entry point */ lua_assert(isLua(L->ci)); pc = L->savedpc; cl = &clvalue(L->ci->func)->l; base = L->base; k = c…
llimits.h /* ** type for virtual-machine instructions ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) */ typedef lu_int32 Instruction; Lua VM命令の型。4バイト(=32ビット)。lopcodes.hに /*==========================…
lobject.h typedef TValue *StkId; /* index to stack elements */ Lua VMのスタック要素を示す型。実質TValueのポインタ。
Lua処理系内部における「値」は共用体Valueにint型のタグを付与した構造体TValueで表現される。int ttは各種ビット(例えばTValueが示すのがgc, p, n, bいずれの型の値であるかなどの情報)を保持する。 /* ** Union of all Lua values */ typedef union { GCO…
せっかくLua処理系いじったりしてるんだから適当にアウトプットしていこうかなと思った。ストーリーだてた解説ではなく、思いついたときに目についた構造体や関数、マクロの適当な解説を日記にのっける感じで。いつまで続けるか未定。 lua_Stateは「Lua処理…
非常にいいかげんに実装。たいていのプログラムはセグフォで落ちる。非常に恣意的なテストプログラムを走らせる。 local i = 1 local j = 1 while i<100000000 do i = i + 1 j = j + i end print(j) % time (repeat 10 ./lua test.lua >/dev/null) 1:08.98 u…
Pitは細々としたスクリプトのパスワード管理の面倒さから解放してくれますが、luaのpit実装が見当たらなかったので書いてみました。http://github.com/hogelog/luapit/tree/masterluayamlをインストールして、pit.luaをダウンロードして/usr/share/lua/5.1/…
Windowsから使いたかったんで、バイナリはLua@空想具現化プログラミングから頂いてきたもので。とりあえずインタプリタ兼対話環境、バイトコードコンパイラとかあります。 C:\hoge\docs\lua\hoge>lua Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio > …