处理嵌套 lua_CFunction 调用的最佳方法是什么?假设我有两个这样的函数:
static int function2(lua_State *L) {
int i = luaL_checkint(L, 1);
/* do something */
return 1;
};
static int function1(lua_State *L) {
struct udata *u = luaL_checkudata(L, 1, UDATA_METATABLE);
int i = luaL_checkint(L, 2);
/* do something */
/* this does not work, first on call stack is udata, not int */
return function2(L);
};
上面的函数调用不起作用。一种选择是修改 function2()
以使用堆栈上的最后一个元素(索引 -1),但这不是一般的解决方案,因为 function2()
可能会被调用来自具有不同调用堆栈的不同地方。
另一种方法是将 return function2(L);
替换为
lua_pushcfunction(L, function2);
lua_pushvalue(L, 2);
lua_call(L, 1, 1); /* need to know number of results */
我假设这为 function2()
提供了自己的调用堆栈,因此无需修改它。但是这个解决方案对于具有更多参数的函数来说似乎过于复杂,因为它需要在堆栈上复制所有参数。
tl;dr:从另一个内部调用 lua_CFunction
的推荐方法/好方法是什么?
最佳答案
在 function1
中,您期望堆栈底部是用户数据。
当你直接调用function2
时,LuaState并没有改变,因此底部仍然是用户数据。
通过确保整数位于索引 1,您可以从 function1
成功调用 function2
。
您可以通过调用 lua_insert(L, 1)
来完成此操作,这会将顶部(假设索引 2)移动到索引 1。
您也可以通过弹出所有值并将整数推回:
lua_pop(L, lua_gettop(L));
lua_pushnumber(L, i);
return function2(L);
关于c - 嵌套的 lua_CFunction 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26982913/