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

我想在从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)的方法签名,但仅此而已。

点赞
用户434004
用户434004

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

int stackSize = lua_gettop(L);
lua_pop(L,stackSize);
2012-11-15 19:43:34
用户1008957
用户1008957

清空栈非常容易。只需使用 lua_settop 并将参数设为 0。

lua_settop(L, 0);
2012-11-15 20:36:40
用户1793220
用户1793220

我的建议是使用Lua自己的assert系统,然后在运行器中进行捕捉并将错误转发到您的单元测试框架:

使用lua_pcall启动您的Lua代码。

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

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

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

2012-11-16 14:40:43