如何从C弹出/清除Lua调用堆栈

时间:2012-11-15 19:35:05

标签: c lua cunit

我想在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()assert_fcn(bool)的方法签名,但就是这样。

3 个答案:

答案 0 :(得分:7)

清空堆栈真的很容易。只需使用lua_settop并将0作为参数。

lua_settop(L, 0);

答案 1 :(得分:2)

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

int stackSize = lua_gettop(L);
lua_pop(L, stackSize);

答案 2 :(得分:2)

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

使用lua_pcall启动您的Lua代码。

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

从你发布Lua代码的地方,检查lua_pcall的结果,当你得到!= 0时,触发你的CUnit致命断言失败。

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