我为C库编写了一个Perl XS包装器,包含大约80个
功能.现在我的总体策略是用C代替错误
PL_sv_undef函数和调用Perl代码必须明确检查
是否退货不是undef. (对于某些C函数,它更复杂
因为我将他们的输出转换为HV / AV并使用空列表来报告错误.)
功能.现在我的总体策略是用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”这样的全局标志
错误,但没有找到任何我可以借用的例子.我拥有的几个模块
发现.pm内部处理“RaiseError”标志,而不是.xs内部
因此允许使用Perl的模具.在我的情况下,这很难
在.pm内部实现,因为许多函数需要特殊的错误检查.那
由于检查已经存在于XS中,因此也会导致代码重复.
我在perlxs
/perlguts
文档中找不到任何相关内容.特别是,我已经看到从我的.xs生成的.c中调用Perl_croak(),但未能找到该函数的任何文档.
什么是Perl’s die的XS模拟?或者XSUB如何向Perl报告
运行时函数失败并且没有RETVAL返回?如何正确设置$@?