理系学生日記

おまえはいつまで学生気分なのか

まだ perlxstut 読んでる

xsubpp

xsubpp は Perl の XS コードを C に変換してくれるコンパイラみたい.というかこれ,man xsubpp の説明そのまんまですけど! これで,C から Perl レベルの値を操作できるし,Perl から C の関数が呼べるようになる.ていうかこれ,man xsubpp の説明そのまんまですけど!

typemap

じゃぁ,Perl の データ型と C のデータ型の変換ルールはどうなってんだろ.perlxstut によると,これは $PERLLIB/ExtUtils/typemap に書いてあるみたい.実際に typemap を開いてみると,こんな感じになってた.

##  第一セクションは C の型と Perl の型の対応表になってる
# basic C types
int                     T_IV
unsigned                T_UV
unsigned int            T_UV
long                    T_IV
unsigned long           T_UV
short                   T_IV
## 略
#############################################################################
## 第2セクションは,xsubpp が 入力パラメータの処理に使う C のコードが入ってる
INPUT
T_SV
        $var = $arg
T_SVREF
        if (SvROK($arg))
            $var = (SV*)SvRV($arg);
        else
            Perl_croak(aTHX_ \"$var is not a reference\")
## 略
#############################################################################
## 第3セクションは,xsubpp が 出力パラメータの処理に使う C のコードが入ってる
OUTPUT
T_SV
        $arg = $var;
T_SVREF
        $arg = newRV((SV*)$var);
T_AVREF
        $arg = newRV((SV*)$var);
T_HVREF
        $arg = newRV((SV*)$var);

変換処理はここに書いてあるのを使ってるわけかー.