問題タブ [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.
c++ - C++ 例外が Perl スクリプトをクラッシュさせないようにする
おそらくxsを使用してラップされているC++ライブラリを使用するPerlスクリプトがあります。ライブラリが例外をスローすると、内部から呼び出された場合でも Perl スクリプトがクラッシュしますeval
。例外をスキップして、スクリプトがクラッシュしないようにするにはどうすればよいですか?
Perl のバージョンは v5.12.4 です
c - Perl XS での構造体の使用
Perl XS は初めてで、C 関数を Perl サブルーチンに変換しようとしています。
次のC関数があります
このparse
関数は、へのポインタstruct parser
、文字列、および文字列の長さを受け入れます。struct parser
は次のように定義されています。
関数はその結果をresult
引数に格納します。
この関数を Perl XS に変換したいと考えています。私がやっていることは次のようなものです:
parse_xs
このようなPerlコードで実行するように上記のコードを変更するにはどうすればよいですか
はC 関数$result
の結果です。parse
multithreading - メインスレッド外で SV/HV/AV を使用/作成/変更することは可能ですか?
pthread_create() で作成した新しいスレッドで、newSVpvn() で SV を作成しようとしています。この時点で、私のプログラムはクラッシュします。クラッシュが発生するC関数はこんな感じ
そしてXSUB
テスト例
完全なコードはこちらにあります: https://github.com/olegwtf/p5-Net-DNS-Native/blob/fbc57dbe9e6832afed8d46cd369db6930bbd53bc/Native.xs
それで、私がやりたいことをすることは可能ですか?
perl - NO_XSLOCKS を #define する必要がある場合
NO_XSLOCKS
と組み合わせると、XS コードで一部のエラー チェック マクロを使用できます#include XSUB.h
。しかし、その使用はそれを超えているようです。ActiveState perl との互換性を向上させるために、XS ファイルに追加することが最近提案されました。この問題は例として示されています。
他に何をし#define NO_XSLOCKS
ますか? XS コードでいつ使用する必要がありますか?
perl - Perl/XS の手続き型およびオブジェクト指向インターフェース
私は現在、最初の XS モジュール (C math-library の単なるラッパー) を作成しており、まあまあの成功を収めています。最大の問題は、ドキュメントが非常に理解しにくい、または不完全であることです。
XS でコンストラクターを作成し、ライブラリーからいくつかの関数をメソッド呼び出しとして実装することに成功しました。それはうまくいきます。
今度は、手続き型インターフェイスも実装したいと考えています。このため、メソッド呼び出しかどうかを知る必要があります。メソッド呼び出しの場合は、関数で計算する数値がインスタンスに格納されます。関数の手続き呼び出しの場合は、最初の引数として指定された数値です。これは、コサイン関数の現在のコードです。
perl - sv_catpv() と sv_catpvs() の違いは何ですか?
perlapiによると、次のようにsv_catpv()
動作します。
NUL
で終わる文字列を、SV にある文字列の末尾に連結します。SV に UTF-8 ステータスが設定されている場合、追加されるバイトは有効な UTF-8 である必要があります。「get」マジックは処理しますが、「set」マジックは処理しません。
void sv_catpv(SV *const sv, const char* ptr)
私が見つけたほとんどの XS チュートリアルでは、次のように使用さsv_catpvs()
れています。
と同様
sv_catpvn
ですが、文字列/長さのペアの代わりにリテラル文字列を取ります。
void sv_catpvs(SV* sv, const char* s)
それはあまり役に立たないので、sv_catpvn()
次を見てみましょう。
SV にある文字列の末尾に文字列を連結します。は
len
、コピーするバイト数を示します。SV に UTF-8 ステータスが設定されている場合、追加されるバイトは有効な UTF-8 である必要があります。「get」マジックは処理しますが、「set」マジックは処理しません。
void sv_catpvn(SV *dsv, const char *sstr, STRLEN len)
したがって、sv_catpvn
はsv_catpv
、文字列の長さを別のパラメーターとして受け取ることを除いてsv_catpvs
と同じsv_catpvn
ことを行い、リテラル文字列を受け取ることを除いて と同じです。
sv_catpv
と の間に微妙な違いがありますかsv_catpvs
、それとも同じことを行うための2つの方法にすぎませんか?
c++ - Perl コードから C++ プログラムを呼び出す
サブモジュールを何千万回も呼び出す perl コードを書いています。サブモジュールは計算集約的であり、その実行時間は非常に遅いです。サブモジュールとまったく同じことを行う C++ プログラムを見つけたので、サブモジュールを C++ プログラムに置き換えたいと思います。プログラムに接続するために XS コードを作成する必要があるかどうか疑問に思っています。perlコードで「system」コマンドを使用してC++プログラムを直接呼び出すと、パフォーマンスが大幅に低下しますか? ありがとう!
c - perl 関数 newSVpv() を呼び出すと C プログラムがクラッシュし続ける
perl データ構造を使用しようとしています (部分的には C で連想配列をサポートする方法として) が、次のプログラムがクラッシュし続けます。正常にコンパイルされますが、newSVpv() の行でクラッシュします。理由がわからない。
それをコンパイルする行は
私が持っている perl は、Ubuntu 12.04.4 LTS で実行されている 5.14.2 です。
ヒントをありがとう!
更新: gdb トレースを追加しました。質問してくれてありがとう。gdb トレース: