首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从C中弹出/清除Lua调用堆栈

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

Stack Overflow用户
提问于 2012-11-15 19:35:05
回答 3查看 2.3K关注 0票数 3

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

背景:

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

堆栈可能看起来类似于:

代码语言:javascript
运行
复制
#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)的方法签名,但仅此而已。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-15 19:43:34

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

代码语言:javascript
运行
复制
int stackSize = lua_gettop(L);
lua_pop(L, stackSize);
票数 2
EN

Stack Overflow用户

发布于 2012-11-15 20:36:40

清空堆栈非常容易。只需使用带有0的lua_settop作为参数。

代码语言:javascript
运行
复制
lua_settop(L, 0);
票数 8
EN

Stack Overflow用户

发布于 2012-11-16 14:40:43

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

使用lua_pcall启动Lua代码。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13404810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档