標籤:lua 源碼
工作後,整個人已經比較鬆懈了。雖然一直在看lua的源碼,但是一直是比較零碎的時間,沒有系統的整理,所以還是收穫不多。因為最近工作也不是很忙了,就想整理下lua的源碼學習的筆記,加深下印象,並分享給大家。
先說下這系列bolg我會每周更新2-3篇,沒有順序的
這些文章都是自己的淺薄的理解,有什麼錯誤,還請各位拍磚賜教。
1.關於c語言函數的聲明
相信大家都知道介面的重要,在lua中,如果要調用c語言的函數,就必須要有一個統一的函式宣告:
typedef int (*lua_CFunction) (lua_State *L);
但是,我們很多函數都不是這樣的聲明,所以,我們就需要有一個封裝函數:
比如cos函數:
在c語言,標準math庫中,聲明如下:
double cos (double);
經過封裝後:
static int math_cos (lua_State *L) { lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); return 1;}
因為lua是一個狀態機器,所有的操作都是在操作棧,所以lua_CFunction中傳入的lua_state這個棧,就可以擷取lua運行中的所有資料了
luaL_checknumber(L,1):表示擷取棧頂的number,並且調用標準c的cos函數,並且cos計算值重新壓棧。
2.關於luaL_Reg映射表
我們介面已經好了,那麼我們在lua中怎麼調用這些函數呢?
<pre name="code" class="html">typedef struct luaL_Reg { const char *name; lua_CFunction func;} luaL_Reg;
lua為定義了這樣一個結構體,name表示在lua中的函數名字,func表示name真正調用的函數
3.簡短的說下luaopen_math函數調用過程
當我們映射表好了後,要怎樣註冊?
現在比較詳細的說下:
LUAMOD_API int luaopen_math (lua_State *L) { luaL_newlib(L, mathlib); lua_pushnumber(L, PI); lua_setfield(L, -2, "pi"); lua_pushnumber(L, HUGE_VAL); lua_setfield(L, -2, "huge"); return 1;}
luaL_newlib:這個函數一個宏:建立一個table來儲存我們映射資料(key-value值)。