XSUB の仕組みは、Perl プログラムが C のサブルーティンをアクセスするため の単純な方法です。XSUB には、Perl プログラムからの引数を入れるスタックと、 Perl のデータ構造を C の同等なものにマッピングする方法を用意しています。
スタック引数は、ST(n) というマクロでアクセスできます。これは、n 番目のス タック引数を返すものです。引数 0 は、Perl のサブルーティン呼び出しで渡さ れた、最初の引数です。これらの引数は SV* で、SV* が使われるところであれ ば、どこでも使うことができます。
ほとんどの場合には、C ルーティンからの出力は、RETVAL とOUTPUT: ディレク ティブを使って扱うことができます。しかし、引数スタックのスペースがすべて の返却値を扱うのに、十分でなくなる場合があります。例としては、引数をとら ないで、ローカルなタイムゾーンと、夏時間の省略形の二つの返却値を返す、 POSIX tzname() の呼び出しがあります。
このような状況を扱うためには、PPCODE: ディレクティブを使い、
EXTEND(sp, num);
というマクロを使ってスタックを拡張します。ここで、sp はスタックポインタ で、num はスタックを拡張すべき要素の数です。
スタック上に場所を確保したならば、IV、倍精度、文字列、SV ポインタをプッ シュする、
PUSHi(IV) PUSHn(double) PUSHp(char*, I32) PUSHs(SV*)
というマクロを使って、値をスタックへプッシュします。
これで、tzname をよぶ Perl プログラムでは、二つの値は、
($standard_abbrev, $summer_abbrev) = POSIX::tzname;
というように代入できます。スタックに値を積む、別の (おそらく、より簡単な) 方法は、
XPUSHi(IV) XPUSHn(double) XPUSHp(char*, I32) XPUSHs(SV*)
というマクロを使うものです。こちらのマクロは、必要ならば、自動的にスタッ クを調整してくれます。
Go to the first, previous, next, last section, table of contents.