3

我想在从 Lua 调用的 C 函数中弹出/清理 Lua 调用堆栈。这可能吗?

背景:
我希望我的 C 库及其扩展脚本使用相同的测试框架。(我知道 Lua 存在各种单元测试工具。我不在乎;我想要一份报告)我将 CUnit 包装在 Lua 的薄层中。CUnit 提供了致命和非致命测试断言的选择。致命断言会导致立即longjmp退出测试并返回到框架运行程序。如果我不先清理堆栈,这似乎会对 Lua VM 造成不利影响。

堆栈可能看起来像:

#0. C:   assert_wrapper_fcn(test, fatal)
#1. Lua: assert_fcn(bool)
#2. Lua: test_fcn()
#3. C:   runner(&test_fcn)

我想清理 #0 和 #3 之间的所有内容。test_fcn()我知道and的方法签名assert_fcn(bool),仅此而已。

4

3 回答 3

8

清空堆栈真的很容易。只需使用lua_settop0 作为参数。

lua_settop(L, 0);
于 2012-11-15T20:36:40.447 回答
2

不确定我是否完全正确地理解了这个问题......但是要清除 Lua 的堆栈:

int stackSize = lua_gettop(L);
lua_pop(L, stackSize);
于 2012-11-15T19:43:34.120 回答
2

我的建议是使用 Lua 自己的断言系统,然后在你的运行器中捕获它,然后将错误转发到你的单元测试框架:

使用 启动你的 Lua 代码lua_pcall

在您的 Lua 代码中,使用标准assert命令触发致命错误。

从您启动 Lua 代码的位置,检查结果,lua_pcall当您获得 != 0 时,触发您的 CUnit 致命断言失败。

这将避免在 Lua 和 CUnit 之间混合任何 longjmp。

于 2012-11-16T14:40:43.160 回答