PPCODE: キーワードは、 CODE: キーワードの別形式で、XSUB の
返却値を扱うために、引数スタックを制御するコードを用意していることを
xsubpp コンパイラに伝えるものです。単独の値よりも、値のリストを XSUB か
ら返したいこともあるでしょう。こういった場合には、 PPCODE: を使っ
て、明示的に値のリストをスタックにプッシュしなければなりません。
PPCODE: キーワードと CODE: キーワードは、同一の XSUB 内で
同時に用いることはありません。
次の XSUB では、C の rpcb_gettime() 関数を呼び、この関数からの二
つの出力値 `timep' と `status' を、一つのリストにして Perlに返
しています。
void rpcb_gettime(host)
char * host
PPCODE:
{
time_t timep;
bool_t status;
status = rpcb_gettime( host, &timep );
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSVnv(status)));
PUSHs(sv_2mortal(newSVnv(timep)));
}
実際に rpcb_gettime() を呼ぶためのコードと、返却値を正しく引数ス
タック上に置くためのコードを、用意しておかねばなりません。
この関数の型を void とすることで、 RETVAL 変数が必要ないか、
使われないものであり、作る必要がないものであることを、xsubpp コンパイラ
に伝えることになります。関数型 void は、ほとんどの場合、
PPCODE: ディレクティブといっしょに使われるはずです。
引数スタック上に二つの返却値の場所を確保するために、 EXTEND() マ
クロを使っています。 PPCODE: ディレクティブの指定によって、xsubpp
コンパイラが、sp というスタックポインタを作り、それがEXTEND() マ
クロ内で this ポインタとして使われます。その後、PUSHs() マ
クロで値を順にスタックに積みます。
これで、以下のようにして、Perl から rpcb_gettime() 関数を呼ぶこと
ができるようになりました。
($status, $timep) = rpcb_gettime("localhost");
Go to the first, previous, next, last section, table of contents.