我想在从Lua调用的C函数中弹出/清理Lua调用堆栈。这可能吗?
背景:
我希望我的 C 库及其扩展脚本使用相同的测试框架。(我知道Lua存在各种单元测试工具。我不在乎;我想要一份报告)我正在用一层薄薄的Lua包裹CUnit。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()
和assert_fcn(bool)
的方法签名,但仅此而已。
清空堆栈真的很容易。只需使用带有 0 的 lua_settop
作为参数。
lua_settop(L, 0);
不确定我是否正确理解了这个问题...但要清除 Lua 的堆栈:
int stackSize = lua_gettop(L);
lua_pop(L, stackSize);
我的建议是使用 Lua 自己的断言系统,然后将其捕获在您的运行器中,然后将错误转发到您的单元测试框架:
使用 lua_pcall
启动您的 Lua 代码。
在 Lua 代码中,使用标准 assert
命令触发致命错误。
从您启动 Lua 代码的位置,检查 lua_pcall
的结果,当您得到 != 0 时,触发您的 CUnit 致命断言失败。
这将避免在Lua和CUnit之间混合任何longjmp。