ちゃんと勉強してないんだけど、以下メモ的に。
よく見かけるけど全く暗号のようなXSのマクロのうち、小文字dで始まるマクロはどうやら"declare"のdらしい。XSマクロが使う変数の宣言をしてくれる。
例えばPUSHi()というマクロはPerlのスタックに整数を入れてくれるマクロなのだが、"targs"という変数を必要とするので、これを宣言する必要がある。
・・・というのは間違いで、関数の戻り値宣言がvoidなのにPerlスタックにものを入れたいというお茶目な事をしたい場合には必要となる。つまり、
IV
hoge ()
PPCODE:
PUSHi(1);
はOK。
void
hoge ()
PPCODE:
PUSHi(1);
はNG。この前にちゃんと dXSTARG で宣言をいれとく必要がある:
void
hoge ()
PREINIT:
dXSTARG;
PPCODE:
PUSHi(1);
ちなみにdXSTARG;はただの変数宣言なのでPREINITに入れないでも、PPCODEの一番上でも大丈夫。
ここでのポイントはXSで書かれている戻り値というのはあくまでxsubppが処理するコードで厳密にはC コードではないため、戻り値の宣言はあくまでXSの関数内で作成されるコードの「参考」にしかならないということ。例えば戻り値を使いたいと宣言して
IV
hoge()
とするなら、これをSPを使う事が予想されるためにそれに準じたコードを作成してくれるわけだ。でも、別に本当にreturn宣言するわけではなく、あくまでPerl内のスタックを使うだけだから別に
void
hoge()
でもPerlから呼ぶと立派に戻り値がある関数が作れる訳。以上追記。