Go to the first, previous, next, last section, table of contents.


PPCODE: キーワード

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.

検索式: