問題タブ [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 - Perl API で正規表現をイントロスペクトする方法
私は、正規表現フラグを含む、Perl 正規表現をシリアル化する必要があるいくつかのコードに取り組んでいます。フラグのサブセットのみがサポートされているため、サポートされていないフラグ/u
が正規表現オブジェクトに含まれていることを検出する必要があります。
コードの現在のバージョンはこれを行います:
次に、手動でstring
char-by-char を処理してフラグを見つけます。
ここでの問題は、正規表現フラグの文字列化が (Perl 5.14 でだと思いますが) eg(?i-xsm:foo)
から(?^i:foo)
に変更され、解析が面倒になったことです。
のバージョンを確認しperl
たり、両方のケースを処理するパーサーを作成したりすることはできますが、より優れたイントロスペクションの方法が利用可能であることがわかります。
c++ - C++呼び出しperlコード-eval_svがスクリプトに引数を渡さない
以下のサンプルプログラムは、引数をPerlスタックにプッシュしてから、「eval_sv」を呼び出します。サンプルのperlステートメントは実行されますが、C++からPerl引数として渡された変数を取得できません。以下のプログラムで私が欠けているものを教えてください
プログラムの出力
こんにちは世界
テスト
100テストが完了しました
この行は$aと$bの値を出力しません
これが私のコードです:
c++ - 静的ライブラリと共有ライブラリを混在させる場合のリンカーの依存関係
Linuxでのリンクについて次の質問があります。
Qtを使用するクラスFooがあるとします。このクラスを作成するには、qmakeを使用してMakefileを生成する必要があります。
後で、共有ライブラリであるPerlモジュールにこのクラスFooを使用したいと思います。ただし、それをビルドするには、PerlのMakeMakerを使用して独自のMakefileを生成する必要があります。
私が今やっている方法は、クラスFooを静的ライブラリとしてビルドし、Perlモジュールの共有ライブラリをビルドするときに、Fooの静的ライブラリに対してリンクしていることです。
問題は、Perlモジュールの共有ライブラリを構築するときに、Fooの静的ライブラリがリンクされているすべてのQtライブラリに対してリンクする必要があることです。
したがって、問題は次のとおりです。
このアプローチは意味がありますか?!
Perlモジュールの共有ライブラリを構築するときにすべての依存関係を指定する必要がない方法でFooの静的ライブラリを構築することは可能ですか?(これらすべての依存関係をモジュールのMakefileに追加するのはやや難しいため)
Fooのライブラリが静的ではなく共有されている場合、それは何か違いがありますか?
perl - Perl XSコードで疑似ファイルハンドルを操作する方法は?
write(ctx, buffer, count)
/read(ctx, buffer, count)
インターフェイスを提供するものなら何でも動作できるシリアル化/逆シリアル化ライブラリのXSグルーコードを書き込もうとしています。取得した疑似ファイルハンドルを使用できるようにしたい
したがって、FILE*
マッピングの使用は機能しないようです。良いドキュメントが見つからなかったので、遊んで次のXSスニペットにたどり着きました。
それは私が望むことをしているようですが、これはPerlがXSコードのファイルハンドルと見なす可能性のあるすべてを処理する適切な方法ですか?
c - サンプル C プログラムは動作するが、既存のマルチスレッド C++ プログラムが Perl 5.16.0 の Perl_sv_upgrade で異常終了する
Perl 5.16.0 では、サンプル C プログラムは動作していますが、既存のマルチスレッド プログラムは で中断していPerl_sv_upgrade
ます。マルチスレッド プログラムは Perl 5.8.8 で正常に動作します。同じコードは、Perl 5.16.0 を使用する Linux と Solaris で機能します。
sv
Linux と Hp-PAの引数の値を比較すると、 Hp-PA の場合のsv
値ですNULL
。誰かが前にこの問題に気づきましたか。私にお知らせください?
デバッグしてsv
値を確認した後の Linux スタック トレース:
gdb での中止の分析中に sv 値を確認した後の HP-PA スタック トレース:
perl - PerlIO* を返すこの XS コードはなぜリーキーなのですか?
私は、書き込み可能なストリーム インターフェイスとして、ライブラリの一部を Perl コードに公開する XS コードを書き込もうとしています。以下の
get_stream
関数は、PerlIO オブジェクトを準備して返すコンストラクタであると想定されています。Write
メソッドとメソッドだけが必要だと考えた
Close
ので、他の関数スロットはすべて空白のままにしました。
このように提供されたインターフェースを使用すると...
...mylib_write
関数が呼び出されるので、これまでのところ完全に失敗していません。$fh
(debug printf ステートメントを挿入することでこれを確認しました。) しかし、PerlIO オブジェクトがスコープ外になったときに閉じられるようにしたいと思います
open
。しかし、現時点では、このmylib_close
関数はインタープリターのシャットダウン中にのみ呼び出されます。
直接呼び出すとclose
正常に機能しますが、に設定$fh
するとundef
機能しません。
更新:池上のアドバイスに従って、 と を使用Devel::Peek::Dump
しsv_dump
たところ、返されたハンドルget_stream
関数が を指す「RV」であることがわかりましたSV = PVGV(...)
。グロブ ( PVGV
) の参照カウンターが 3 に設定されていますが、これは正しくないようです。
追加した
これにより症状が治り
ます。ブロックの最後で範囲外になるclose
と、関数が呼び出されます。$fh
しかし、私はまだ根本的な問題をよく理解していません。
OUTPUT
これは、セクション用に生成された C コードです。
GV の参照カウントはどのようにして 3 になるのですか?
c - perlembed/perlcallの例無制限のメモリ増加-valgrindはリークは不可能だと言っています
すべて。私はしばらくの間これに頭をぶつけてきました...私は基本的にperlembed+perlcallと多かれ少なかれevpsgiからそれを「借りた」例をまとめようとしています。問題は、1000回の反復ごとにサイズが約1MB大きくなることです。これは、長期間有効なプロセスで実行する場合の最大の状況ではありません(これは私が使用しているユースケースです)。
タイトルにあるように、valgrindを使用して実行すると、リークの可能性はないと報告されます。--trace-malloc = yesを指定して実行しましたが、freeは、大量の呼び出しの最後にのみ呼び出されるようです。これはperlのMOかもしれないと理解していますが、少なくともメモリを再利用し、OSがプロセスを終了するまで成長しなかったとしたらいいでしょう。
sv_2mortalのエントリには、バッファが「盗まれる」可能性があることが記載されていますが、コードにsv_2mortalの呼び出しを追加しましたが、変更はありませんでした。
さらに面倒なことはせずに、ここにコードがあります。貨物の扱いはご容赦ください。前もって感謝します!
perl - XSコード内の空の参照を祝福しながらリークする
私はこれに相当する XS を実行しようとしています:
この種のコンストラクタは、 として呼び出されたときにそのベースを「自動有効化」するRefTestPP->new()
か、 のように指定された参照をベースとして使用することになっていRefTestPP->new({ stuff => 123 });
ます。
ただし、説明のつかないリークが発生しています。これが私のRefTest.xs
ファイルです:
そして、RefTest.t
リークを検出するファイル:
(適切なコンパイルに必要な残りのファイルは、によって生成されるデフォルトですh2xs -A -n RefTest
)
ポイントは:
- コンストラクターにパラメーターとして渡された基本参照は決してリークしません。
- XSコード内で作成されたベース
sv_2mortal(newRV_noinc((SV *) newHV()))
もリークしません。 - で作成されたベース
newRV_noinc(sv_2mortal((SV *) newHV()))
はリークします (そして最終的にはグローバルな破壊中に悪名高いAttempt to free unreferenced scalar: SV 0xdeadbeef
メッセージを引き起こします)。
sv_2mortal(newRV_noinc(...))
と異なる理由はありますnewRV_noinc(sv_2mortal(...))
か?私は単にそれを間違っていますか?
perl - Perl XS コードから結ばれたファイルハンドルを使用するにはどうすればよいですか?
次の最小限の例では、ラッパーを定義していますPerlIO_write
。
を使用しwrite_fh
て作成されたファイルハンドルで関数を使用open $fh, '<', \$buf
すると、期待どおりに機能します。ただし、次のスニペットを使用して作成された結ばれたファイルハンドルは、PerlIO ハンドルに変換されません:
My::TIEFH
必要なメソッドが含まれており、それへの書き込みはprint
$fh $str
期待どおりに機能します。
XS ランドから結ばれたファイルハンドルに書き込むにはどうすればよいですか?
perl - Perl XS ルーチンへの引数として自動有効化されたファイルハンドルをサポート
質問
XS 関数で自動有効化されたファイルハンドル引数をサポートするにはどうすればよいですか?
私はファイル記述子を返す C 関数を XS ラップしています。そのファイル記述子をopen()の方法でperl ファイルハンドル引数として提示したいと思います。例えば、
これまでに行ったこと
現在、XS 関数の上に perl ラッパーを使用しています。
これは Just Fine (tm) で動作しますが、ここでも、実装を完全に XS に移行したいと考えています。
これまでのところsv_2io
、 として型マップされた引数を試してみましたSV *
が、未定義のスカラーで例外がスローされます。最初の引数をFILE *
orPerlIO *
オブジェクトにマッピングしようとはしていません。なぜなら、これらのオブジェクトを "fdreopen" する方法がわからないからです。