在C中呼叫Lua函式的API主要由以下幾個:
(1)void lua_call (lua_State *L, int nargs, int nresults);
函式呼叫,nargs表示引數的個數,nresults表示返回值的個數
首先將lua函式壓棧,然後將引數依次壓棧,最後呼叫函式即可
函式呼叫時,引數和函式都會pop出棧,呼叫返回後,結果會push進棧
nresults==LUA_MULTRET,所有的返回值都會push進棧
nresults!=LUA_MULTRET,返回值個數根據nresults來調整
Lua語句:
a = f("how", t.x, 14)
在C中的實現:
lua_getglobal(L, "f"); // 函式入棧
lua_pushstring(L, "how"); // 引數1入棧
lua_getglobal(L, "t"); // 表t入棧
lua_getfield(L, -1, "x"); // 引數2入棧
lua_remove(L, -2); // 跳t出棧
lua_pushinteger(L, 14); // 引數3入棧
lua_call(L, 3, 1); // 呼叫函式,引數和函式都會出棧
lua_setglobal(L, "a"); // 給a賦值,棧頂出棧
上述程式碼執行完畢後,堆疊狀態恢復原樣。
(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
函式呼叫,在安全模式下,並且可以新增錯誤處理函式。
如果呼叫期間發生error,lua_pcall會捕獲之,然後push stack一個錯誤資訊(會先將函式和引數pop出棧),並且返回一個error code(非0的一個值)。
發生error時,如果指定了錯誤處理函式,會在error message入棧前呼叫錯誤處理函式,具體由msgh引數來決定:
(1)msgh==0,不指定錯誤處理函式,入棧資訊不變;
(2)msgh!=0,msgh表示錯誤處理函式的堆疊index,錯誤處理函式會以error message為引數,並將返回的新的error
message入棧。主要用來給error
message新增 更多的debug資訊,比如堆疊跟蹤,因為這些資訊在pcall呼叫完之後是收集不到的。
函式返回程式碼:
LUA_OK(0):呼叫成功
LUA_ERRRUN:runtime error
LUA_ERRMEM:記憶體分配錯誤,這種情況下不會呼叫錯誤處理函式
LUA_ERRERR:呼叫錯誤處理函式時出錯,當然,不會再進一步呼叫錯誤處理函式
LUA_ERRGCMM:呼叫metamethod.__gc時報錯,由gc引起,和函式本身沒關係
(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k);
函式呼叫,在安全模式下,並且允許函式yield。
在C中呼叫Lua函式的API主要由以下幾個:
(1)void lua_call (lua_State *L, int nargs, int nresults);
函式呼叫,nargs表示引數的個數,nresults表示返回值的個數
首先將lua函式壓棧,然後將引數依次壓棧,最後呼叫函式即可
函式呼叫時,引數和函式都會pop出棧,呼叫返回後,結果會push進棧
nresults==LUA_MULTRET,所有的返回值都會push進棧
nresults!=LUA_MULTRET,返回值個數根據nresults來調整
Lua語句:
a = f("how", t.x, 14)
在C中的實現:
lua_getglobal(L, "f"); // 函式入棧
lua_pushstring(L, "how"); // 引數1入棧
lua_getglobal(L, "t"); // 表t入棧
lua_getfield(L, -1, "x"); // 引數2入棧
lua_remove(L, -2); // 跳t出棧
lua_pushinteger(L, 14); // 引數3入棧
lua_call(L, 3, 1); // 呼叫函式,引數和函式都會出棧
lua_setglobal(L, "a"); // 給a賦值,棧頂出棧
上述程式碼執行完畢後,堆疊狀態恢復原樣。
(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
函式呼叫,在安全模式下,並且可以新增錯誤處理函式。
如果呼叫期間發生error,lua_pcall會捕獲之,然後push stack一個錯誤資訊(會先將函式和引數pop出棧),並且返回一個error code(非0的一個值)。
發生error時,如果指定了錯誤處理函式,會在error message入棧前呼叫錯誤處理函式,具體由msgh引數來決定:
(1)msgh==0,不指定錯誤處理函式,入棧資訊不變;
(2)msgh!=0,msgh表示錯誤處理函式的堆疊index,錯誤處理函式會以error message為引數,並將返回的新的error
message入棧。主要用來給error
message新增 更多的debug資訊,比如堆疊跟蹤,因為這些資訊在pcall呼叫完之後是收集不到的。
函式返回程式碼:
LUA_OK(0):呼叫成功
LUA_ERRRUN:runtime error
LUA_ERRMEM:記憶體分配錯誤,這種情況下不會呼叫錯誤處理函式
LUA_ERRERR:呼叫錯誤處理函式時出錯,當然,不會再進一步呼叫錯誤處理函式
LUA_ERRGCMM:呼叫metamethod.__gc時報錯,由gc引起,和函式本身沒關係
(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k);
函式呼叫,在安全模式下,並且允許函式yield。