概要
休み明け一発目から古のperlを使った謎モジュールのビルドエラーの確認作業になった。cもmakefileもそれなりに読めるし余裕だろって思ってたらそんなことはなかったのでメモ
XSでハマったというよりはそもそもXSが何なのかをそんなに理解してなかったので理解用に書く
XSとは
XS は Perl と(Perl と一緒に使いたい)C のコード(または C ライブラリ)との 間の拡張インターフェースを作るのに使われるインターフェース記述 ファイルフォーマットです。 XS インターフェースはライブラリと動的または静的にリンクされて、 Perl とリンクすることのできる新しいライブラリを生成します。 XS インターフェース記述はは XS 言語で書かれており、 Perl 拡張インターフェースのコアコンポーネントです。
XSはCをベースに独自のマクロを持った言語。PerlからCコードを呼び出すぐらいにしかわかってなかったけどリファレンス読むと思ったより高機能なのが分かる
使ってみる
minilという雛形生成ツールを使って最小コードのxsを生成してみた。
ぱっと見はC。SVとかその辺はそのままperlの用語に紐づく形となっている
#ifdef __cplusplus extern "C" { #endif #define PERL_NO_GET_CONTEXT /* we want efficiency */ #include <EXTERN.h> #include <perl.h> #include <XSUB.h> #ifdef __cplusplus } /* extern "C" */ #endif #define NEED_newSVpvn_flags #include "ppport.h" MODULE = Acme::MyModuele PACKAGE = Acme::MyModuele PROTOTYPES: DISABLE void hello() CODE: { ST(0) = newSVpvs_flags("Hello, world!", SVs_TEMP); }
SVの操作
XSからPerlのデータを操作する方法
SV の中身をダンプして出力
sv_dump(sv)
新しい SV をつくりたい。整数値から SV をつくりたい
SV* sv = newSViv(5963);
符号なし整数値から SV をつくりたい
SV* sv = newSVuv(5963);
文字列から SV をつくりたい
SV* sv = newSVpvn("hello", strlen("hello"));
SV から SV をつくりたい
SV* new_sv = newSVsv(sv);
SV の値が真か偽かがしりたい
bool b = SvTRUE(sv);
sprintf したい。
SV* sv = newSVpvf("%d", 3);
参照カウンターをインクリメントしたい
SvREFCNT_inc(sv);
参照カウンターをデクリメントしたい
SvREFCNT_dec(sv);