当duktape抛出错误时,有什么方法可以获得正确的C ++堆栈展开吗?

时间:2015-05-26 00:32:06

标签: duktape

当在duktape中遇到错误时,目前是否有办法让duktape正确展开C ++堆栈(调用所有适当的析构函数等)?

我知道Lua(例如)有能力通过使用longjmp切换到C ++异常,当Lua由C ++编译器编译时,但是乍一看我没有看到类似的东西duktape,我绝对不会被C ++析构函数所取消。如果duktape中还没有这种能力,那么它有什么计划吗? (如果longjmp目的地以严格的LIFO方式设置和使用,我猜它是可行的。如果没有,那么可能不那么可行......)

我一直在玩duktape,到目前为止,我印象深刻......我主要完成了一个基于C ++模板的元编程库,可以让你自动创建duktape绑定到C ++函数。尽管如此......如果我不能相信我的C ++析构函数可以被调用,那么这个堆栈放松的东西可能是一个彻底的交易破坏者。

编辑:实际上,经过进一步的反思,我可以在没有堆栈展开的情况下使工作正常工作,尽管当然一切都会变得更加复杂和容易出错。它仍然是一个很棒的功能。

3 个答案:

答案 0 :(得分:3)

作为快速更新:Duktape 1.4.0支持使用C ++异常进行长控制传输(https://github.com/svaarala/duktape/tree/master/examples/cpp-exceptions):

  • 如果您正在直接编辑DUK_OPT_CPP_EXCEPTIONS,请定义DUK_USE_CPP_EXCEPTIONSduk_config.h并使用C ++编译器进行编译。
  • 当Duktape / C功能放松时,自动析构函数将起作用。
  • 然而,你不能通过Duktape抛出C ++异常。如果你这样做,Duktape会将C ++异常转换为Ecmascript异常。因此,虽然Duktape / C函数可以在内部使用C ++异常,但这些异常应该在它们传播到Duktape之前被捕获。

答案 1 :(得分:1)

从Duktape 1.2开始,还没有支持用C ++异常友好的try-catch机制替换setjmp / longjmp(用于Duktape内部的错误处理)。计划对未来版本提供支持。

答案 2 :(得分:0)

不幸的是,您没有提供任何代码示例,所以我的猜测是您没有在duk_create_heap中设置致命错误处理程序,而您当前正在使用未受保护的代码执行变体,例如{ {3}}。您应该尝试使用duk_eval之类的protected code execution函数变体。