約80個の関数で構成されるCライブラリ用のPerlXSラッパーを作成しました。現在、私の一般的な戦略は、C関数からのエラーをで置き換えることでPL_sv_undefあり、呼び出し元のPerlコードは、戻り値がであるかどうかを明示的にチェックする必要がありundefます。HV(一部のC関数では、出力を/に変換し、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のXSのアナログは何dieですか?または、XSUBは、関数が失敗し、戻るRETVALがないことをPerlランタイムに報告する方法は他にありますか?正しく設定する方法は$@?