c - 嵌套的 lua_CFunction 调用

标签 c lua lua-api

处理嵌套 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/

相关文章:

c++ - 在 C api 中移动一个 lua 表

c - 在 C 中编写面向 Lua 的函数时,检查参数是否支持类表查找的好方法是什么?

c - 如何从 Visual Studio C 编译器获得更有用的警告?

c - 没有文件系统的 Gettext

c - 使用带有数字大小写和字符大小写的开关

lua - [函数类 :me() end] equal to [function class. me(self) end] 在 lua 中吗?

c++ - 使用 malloc() 初始化类

c - GCC 编译的 Win32 程序在系统 DLL 调用期间崩溃

arrays - 在Lua上读取文件

c++ - 如何查找lua堆栈中有多少项(值)