Perl的XSUB怎么会死?

Dum*_*001 5 perl perl-xs xs

我为一个包含约80个函数的C库编写了一个Perl XS包装器.现在我的一般策略是用C函数替换错误,PL_sv_undef并且调用Perl代码必须明确检查返回是否不是undef.(对于某些C函数,它更复杂,因为我将它们的输出转换为HV/ AV并使用空列表来报告错误.)

现在,当我开始使用该库编写更大的Perl脚本时,我想简化错误处理并使用例如通常eval {}/ die类似异常的机制来处理错误.

目前,我的XS中的简单XSUB看起来像这样:

SV *
simple_function( param1, param2 = 0, param3 = 0)
        int             param1
        int             param2
        int             param3
        CODE:
                int rc;
                rc = simple_function( param1, param2, param3 );
                RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef;
        OUTPUT:
                RETVAL
Run Code Online (Sandbox Code Playgroud)

我已经看到一些模块有die关于错误的"RaiseError"的全局标志,但未能找到任何我可以借用的例子.我发现的几个模块处理里面的"RaiseError"标志.pm,而不是在里面.xs,因此允许使用Perl die.在我的情况下,在.pm很多函数内部很难实现需要特殊的错误检查.这也会导致代码重复,因为检查已经存在于XS内部.

我发现perlxs/ perlguts文档中没有任何相关内容.特别是,我已经看到了将呼叫Perl_croak().c从我的产生.xs,但未能找到该功能的任何文件.

什么是XS的Perl模拟die?或者XSUB如何报告Perl运行时函数失败并且没有RETVAL返回?如何正确设置$@

Pet*_*sel 6

手册页上记录 Perl_croak()perlapi.如该页面上的示例所示,您可以向其传递消息字符串,也可以手动将$ @设置为异常对象并传递NULL.