代码之家  ›  专栏  ›  技术社区  ›  Dummy00001

Perl的xsub怎么死?

  •  5
  • Dummy00001  · 技术社区  · 14 年前

    我已经为C库编写了一个PerlXS包装器,它由大约80个 功能。现在我的一般策略是用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
    

    我已经看到一些模块具有全局标志,如“raiserror”to 死亡 在 错误,但找不到任何我可以借鉴的例子。我有几个模块 找到句柄“raiseError”标志 .pm ,不在 .xs 和 因此允许使用Perl 死亡 . 在我看来,这很难 在 下午 许多函数都需要特殊的错误检查。那 也会导致代码重复,因为检查已经存在于XS中。

    我发现在 perlxs / perlguts 文档。尤其是,我看到有人打电话给 Perl_croak() .c 从我的 XS ,但找不到该函数的任何文档。

    什么是perl的xs模拟 死亡 ?或者XSub如何向Perl报告 运行时函数失败,没有返回的retval?如何正确设置 $@ ?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Peter S. Housel    14 年前

    Perl_Croak()已记录在案 here perlapi 人页。如该页上的示例所示,您可以将消息字符串传递给它,也可以手动将$@设置为异常对象并传递空值。

    推荐文章