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


XSUB と引数スタック

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.

検索式: