Perl - XSでDLLを呼び出す(その4)

今回はXSの仕組みに迫って見ようと思う。

XSファイルの行方を探る

Windowsにおいて、XSファイルは最終的にDLLファイルに変換される。
これを実現しているのは、XSUBPPと言うXSファイルをCファイルに変換するプリプロセッサと、Microsoft Visual C++と言うコンパイラである。
したがって、XSファイルを深く知るためには、XSUBPPが作成したCファイルを良く読むことが肝要である。

Cファイルを良く読む

以下のコードは、Example2::echo_ivサブルーチンの部分を作成されたCファイルから切り出した内容である。

XS(XS_Example2_echo_iv)
{
    dXSARGS;
    if (items != 1)
        Perl_croak(aTHX_ "Usage: Example2::echo_iv(n)");
    {
        IV      n = (IV)SvIV(ST(0));
        IV      RETVAL;
        dXSTARG;
#line 18 "Example2.xs"
        RETVAL = n;
#line 137 "Example2.c"
        XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

上記を見れば一目瞭然で、Perl_croak関数の引き数に注目のメッセージ文字列が渡されており、"if (items != 1)" で引き数の個数が正しいか否かを確認している。
ちなみに、"croak" は「カーカーやガーガーと鳴く動物を指し、転じて不平や不満を言うこと」を意味する。
エラーよりも味はあるが、カタカナで書くとホテルの荷物預り所と間違われる可能性が高い。

謎のメッセージの正体が分かったところで、ついでに他のことにも目を向けて見よう。
items変数は渡された引数の個数を表すようだ。
SvIVマクロはSTマクロの戻り値を整数に変換するようだ。
n引き数に値が代入されていることからSTマクロは引き数を指すものではないか。
RETVAL変数はecho_ivサブルーチンの戻り値のタイプで定義されている。
ST、XSprePUSH、PUSHiマクロの名前から、引き数や戻り値が一種のスタックによって受け渡しされている感じがする。
PUSHiマクロは整数値をスタックに積むようだ。
XSRETURNマクロは名前から察するに戻り置の個数を設定すると思える。
それ以外はもう少し別のサブルーチンを解析して見ないと何ともいえない。

次回は整数の代わりに実数で試して見ようと思う。