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


例 5: Perl から引数リストを介してデータを返す

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

以下の 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 つの変数 svasvb を使っています。

これらの値を保持する Perl スタックのエリアは、 perl_call_pv から 制御が戻るときまでに、何ものかによって破壊されていることが十分に有り得る から、こういった操作が必要になるのです。


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

検索式: