引数リストを使って直接値を返すことも可能です。ただし、これが実際に望まし い方法であるか、否かについては、まったく別の問題です。
以下の Perl sub `Inc' は、2 つの引数をとり、それぞれをインクリメン トします。
sub Inc
{
++ $_[0] ;
++ $_[1] ;
}
そして、これを呼び出す C 関数です。
static void
call_Inc(a, b)
int a ;
int b ;
{
dSP ;
int count ;
SV * sva ;
SV * svb ;
ENTER ;
SAVETMPS;
sva = sv_2mortal(newSViv(a)) ;
svb = sv_2mortal(newSViv(b)) ;
PUSHMARK(sp) ;
XPUSHs(sva);
XPUSHs(svb);
PUTBACK ;
count = perl_call_pv("Inc", G_DISCARD);
if (count != 0)
croak ("call_Inc : expected 0 return "
"value from 'Inc', got %d\n", count) ;
printf ("%d + 1 = %d\n", a, SvIV(sva)) ;
printf ("%d + 1 = %d\n", b, SvIV(svb)) ;
FREETMPS ;
LEAVE ;
}
perl_call_pv からリターンした後で、スタック上にプッシュされた 2
つのパラメータにアクセスするために、これらのアドレスを記録しておく必要が
あります。このため 2 つの変数 sva と svb を使っています。
これらの値を保持する Perl スタックのエリアは、 perl_call_pv から
制御が戻るときまでに、何ものかによって破壊されていることが十分に有り得る
から、こういった操作が必要になるのです。
Go to the first, previous, next, last section, table of contents.