問題タブ [xs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - PerlのXSUBはどのように死ぬことができますか?
約80個の関数で構成されるCライブラリ用のPerlXSラッパーを作成しました。現在、私の一般的な戦略は、C関数からのエラーをで置き換えることでPL_sv_undef
あり、呼び出し元のPerlコードは、戻り値がであるかどうかを明示的にチェックする必要がありundef
ます。HV
(一部のC関数では、出力を/に変換し、AV
空のリストを使用してエラーを報告するため、より複雑になります。)
そのライブラリを使用してより大きなPerlスクリプトを作成するようになったので、エラー処理を簡素化し、たとえば通常のeval {}
/die
例外のようなメカニズムを使用してエラーを処理したいと思います。
現時点では、XSの単純なXSUBは次のようになっています。
一部のモジュールには、エラー時に「RaiseError」のようなグローバルフラグが設定されているのを見てきdie
ましたが、借りることができる例を見つけることができませんでした。.pm
私が見つけたいくつかのモジュールは、の内部ではなく、の内部で「RaiseError」フラグを処理.xs
するため、Perlのを使用できますdie
。.pm
私の場合、多くの関数が特別なエラーチェックを必要とするため、これを内部に実装するのはかなり困難です。チェックはXS内にすでに存在するため、これもコードの重複につながります。
perlxs
/perlguts
ドキュメントに関連するものは何も見つかりませんでした。特に、から生成されPerl_croak()
たでへの呼び出しを見ましたが、関数のドキュメントを見つけることができませんでした。.c
.xs
PerlのXSのアナログは何die
ですか?または、XSUBは、関数が失敗し、戻るRETVALがないことをPerlランタイムに報告する方法は他にありますか?正しく設定する方法は$@
?
perl - Perl XS モジュールが黙って pure-perl にフォールバックするのを止める
CPAN のいくつかの (多くの?) モジュールは、XS を使用して部分的に C で実装されているようで、必要に応じて純粋な perl 実装にフォールバックできます。これは賢明ですが、明らかにパフォーマンスが低下する可能性があります。問題を解決できるように、それが発生することを知りたいです。
このタイプのフォールバックを停止または検出する一般的な方法はありますか?
この動作の例については、(非常に便利な) Date::Simple (コード スニペット)をご覧ください。
c - C コードで Perl ハッシュを作成するにはどうすればよいですか?
Perl に C コードを埋め込みたい。この C コードでは、巨大なファイルをメモリに読み込み、変更を加えてハッシュ (カスタム ハッシュ) を作成します。このハッシュを Perl コードからアクセスできるようにしたいと考えています。出来ますか?どうすれば目標に到達できますか?
c++ - PERLXSを使用してSTLベクトルを取り込むC++関数を呼び出す方法
私はPerlXSを使用してC++オブジェクトの周りにperlラッパーを記述しています。通常、私のfcnはstring / intなどを取り込んでおり、問題なく作成できます。.xsファイルにこのようなコードを書くだけです
今回; stlベクトルを取り込む関数が必要です
このエラーが発生します:
perl - オペコードのリストを含むパッケージに CV を割り当てるにはどうすればよいですか?
私は bleadperl の新しい parse_block 機能で遊んでいます。
いくつかのステートメントを解析して listop にすることができます。これにより、以下のツリーが生成されます。
キーワード プラグインから optree 構造へのポインタを返す必要があります。現時点では、ops のベア リストのみが含まれています。これらの操作をサブルーチン内にラップし、スタッシュ内のシンボルに割り当てたいと考えています。
だから私はこのようなことをしたいと思います:
おそらく、listops の最初と最後に entersub、leavesub を追加する必要がありますが、XS でこれをどのように構築するのかわかりません。また、結果の optree を CV に変換する方法もわかりませんか?
xsub の CV を生成する例を見つけることができますが、optree からはできません。
ご協力いただきありがとうございます。
perl - XS から perl オブジェクト (祝福されたハッシュ) に格納された値にアクセスする
このような perl オブジェクト (ハッシュへの祝福された参照) があります。
$o 参照がある XS コードの別の場所で、 の値を取得する必要があります$o->{internal_data}
。
perl(api|xstut|guts|???) にはおそらくいくつかの章があります。私はそれを見つけることができませんでした。
ヒントをお寄せいただきありがとうございます。
-- kmx
perl - Perl XS 拡張から stdout への出力
私は最近、XS を使用して Perl (v5.8.8) 拡張機能を書き始めました。私が書いているメソッドの 1 つは、大量のデータを収集し、それをクライアントにスプラットします。出力に対してアサーションを行う単体テストを書きたいのですが、問題が発生しています。PerlIO メソッドがprint
、Perl の呼び出しと同じチャネルを介してデータを渡しているようには見えません。通常、STDOUT ファイル ハンドラーに接続して結果をインターセプトできますが、PerlIO メソッドはこれを完全にバイパスしているようです。
以下に例を貼り付けましたが、私のテストの基本的な要点は次のとおりTie
です。これを行うと、ステートメントをキャプチャできますが、モジュールからの呼び出しはキャプチャできません。、、などを使ってみました。サイコロはありません。STDOUT
untie
print
PerlIO_*
PerlIO_write
PerlIO_puts
PerlIO_printf
最初から、ここに私がやっていることの最小限の再現があります:
これを に入れますIOTest.xs
:
そして、これは次のファイルに入りますtest.pl
(興味深い部分は一番下にあり、それ以外はすべて stdout をキャプチャするためのものです):
ビルドとテストは、次の問題だけです。
私が見ている出力は次のとおりです。
明らかに、私は「ブー!」と期待しています。「前」と「後」の間に挟まれているが、それは起こっていないようだ.
何か案は?
perl - システム/perlのアップグレード後のlocal::libのトラブルを軽減する方法は?
私たちのシステム管理者は最近私のOSとperlを(5.12.3に)アップグレードしました。local :: lib環境変数をロードすると、xsに依存するものはすべて壊れているように見えます。
これに対する簡単な修正はありますか?
perl - PerlXSおよびInline::C
XSとInline::Cモジュールの使用の違いは何ですか?これはこの質問の誰かによって言及され、私は興味をそそられました。