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.