如何在另一个lua cfunction中调用lua cfunction?

我正在为我们的应用程序编写一个 Lua (5.1)扩展,使我们的客户可以在没有我们支持的情况下进一步扩展它。

总的来说,这非常有效,并且在几个包装器的帮助下甚至非常舒适,但现在我遇到了以下情况:

我有两个用户数据对象,一个计时器对象和一个窗口对象。用户可以通过定义它们的成员 OnTimer 和 OnSizeChanged 来“附加”事件。

这仍然非常有效:

mainLoop(C ++)-> 检查所有计时器(C ++)-> 脚本对象附加?(C ++),然后:

(在这里插入 C++ 代码)

所以在以下情况下一切仍然完美无缺(在调用之前和之后堆栈绝对为0):

(在这里插入Lua代码)

但是,如果 Lua 脚本如下所示:

(在这里插入 Lua 代码)

那么在 C++ 中的调用堆栈将是:

(在这里插入 C++ 代码)

当然,在应调用 OnSizeChanged 的位置,栈仍然包含前一个 luaChangeSize 回调的内容,并且不为空。

我曾尝试通过在调用 Window::SetSize 之前弹出 luaChangeSize 的所有参数并在之后恢复它们来简单地清空堆栈,但这并不起作用。结果是有点随机的,这取决于堆栈中的调用函数的组合,从“无法调用数字”到随机再次调用堆栈上的前一个函数。(gettop 在所有调用之前和之后肯定为0)。

因此,我应该如何“备份”当前堆栈并像 Lua 自己在 C++ -> Lua -> C++ 组合中那样恢复它?

点赞
用户4857095
用户4857095

原文

The concept of backing up and restoring the stack seems wrong. Can't you just leave the stack how it is and let the new call work on top of the existing stack. Make sure everything accesses items on the stack using a relative to top index rather than absolute.

翻译 回档和还原堆栈的概念似乎是错误的。您不能只是保留堆栈,让新的调用在现有堆栈顶部工作吗?请确保所有访问堆栈元素使用相对于堆栈顶部的索引而不是绝对索引。

2015-05-05 08:34:03