【发布时间】:2012-11-16 22:40:43
【问题描述】:
我想在从 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) 的方法签名,仅此而已。
【问题讨论】:
-
"如果我不先清理堆栈,这似乎会对 Lua VM 造成不利影响。" 它会更糟事情远不止这些。调用堆栈是您最不关心的问题。跳出 Lua 解释器(过去 Lua 自己的
setjmp's)可能会破坏 Lua 中的几乎所有内容。 -
是的,这也是一个问题。我几乎不知道 Lua 的错误处理系统是如何工作的。真的,我应该用重置解释器的状态来表达这个问题。
-
你不能。 Lua 不是“
longjmpover me”安全的。当应用程序决定在其不知情的情况下半执行一个函数时,Lua 没有处理这种情况的规定。如果你想让你的 Lua 解释器保持理智,那么你需要遵守 Lua 的规则。几乎所有 C 库都是如此。您不能只是随机退出其中一个并期望它对此感到满意。