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);
変換処理はここに書いてあるのを使ってるわけかー.