5

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

4

1 に答える 1

6

Perl_croak()は、このマニュアルページに記載されていますperlapiそのページの例が示すように、メッセージ文字列を渡すか、手動で$@を例外オブジェクトに設定してNULLを渡すことができます。

于 2010-09-02T16:45:24.980 に答える