Perl的XSUB怎么会死?

时间:2010-09-02 16:38:23

标签: perl xs perl-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

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

我在perlxs / perlguts文档中找不到任何相关内容。特别是,我在Perl_croak()生成的.c中看到了对.xs的调用,但未能找到该函数的任何文档。

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

1 个答案:

答案 0 :(得分:6)

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