1 回答

TA貢獻1757條經(jīng)驗 獲得超7個贊
在C中調(diào)用Lua函數(shù)的API主要由以下幾個:
(1)void lua_call (lua_State *L, int nargs, int nresults);
函數(shù)調(diào)用,nargs表示參數(shù)的個數(shù),nresults表示返回值的個數(shù)
首先將lua函數(shù)壓棧,然后將參數(shù)依次壓棧,最后調(diào)用函數(shù)即可
函數(shù)調(diào)用時,參數(shù)和函數(shù)都會pop出棧,調(diào)用返回后,結(jié)果會push進棧
nresults==LUA_MULTRET,所有的返回值都會push進棧
nresults!=LUA_MULTRET,返回值個數(shù)根據(jù)nresults來調(diào)整
Lua語句:
a = f("how", t.x, 14)
在C中的實現(xiàn):
lua_getglobal(L, "f"); // 函數(shù)入棧
lua_pushstring(L, "how"); // 參數(shù)1入棧
lua_getglobal(L, "t"); // 表t入棧
lua_getfield(L, -1, "x"); // 參數(shù)2入棧
lua_remove(L, -2); // 跳t出棧
lua_pushinteger(L, 14); // 參數(shù)3入棧
lua_call(L, 3, 1); // 調(diào)用函數(shù),參數(shù)和函數(shù)都會出棧
lua_setglobal(L, "a"); // 給a賦值,棧頂出棧
上述代碼執(zhí)行完畢后,堆棧狀態(tài)恢復原樣。
(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
函數(shù)調(diào)用,在安全模式下,并且可以添加錯誤處理函數(shù)。
如果調(diào)用期間發(fā)生error,lua_pcall會捕獲之,然后push stack一個錯誤信息(會先將函數(shù)和參數(shù)pop出棧),并且返回一個error code(非0的一個值)。
發(fā)生error時,如果指定了錯誤處理函數(shù),會在error message入棧前調(diào)用錯誤處理函數(shù),具體由msgh參數(shù)來決定:
(1)msgh==0,不指定錯誤處理函數(shù),入棧信息不變;
(2)msgh!=0,msgh表示錯誤處理函數(shù)的堆棧index,錯誤處理函數(shù)會以error message為參數(shù),并將返回的新的error
message入棧。主要用來給error
message添加 更多的debug信息,比如堆棧跟蹤,因為這些信息在pcall調(diào)用完之后是收集不到的。
函數(shù)返回代碼:
LUA_OK(0):調(diào)用成功
LUA_ERRRUN:runtime error
LUA_ERRMEM:內(nèi)存分配錯誤,這種情況下不會調(diào)用錯誤處理函數(shù)
LUA_ERRERR:調(diào)用錯誤處理函數(shù)時出錯,當然,不會再進一步調(diào)用錯誤處理函數(shù)
LUA_ERRGCMM:調(diào)用metamethod.__gc時報錯,由gc引起,和函數(shù)本身沒關(guān)系
(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k);
函數(shù)調(diào)用,在安全模式下,并且允許函數(shù)yield
- 1 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報