引数リストを使って直接値を返すことも可能です。ただし、これが実際に望まし い方法であるか、否かについては、まったく別の問題です。
以下の 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.