約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ランタイムに報告する方法は他にありますか?正しく設定する方法は$@
?