今度は G_EVAL を使う例です。以下は、2 つの引数の差を計算する Perl
sub です。結果が負になると、sub は die を呼びます。
sub Subtract
{
my ($a, $b) = @_ ;
die "death can be fatal\n" if $a < $b ;
$a - $b ;
}
これを呼ぶ C の方は、
static void
call_Subtract(a, b)
int a ;
int b ;
{
dSP ;
int count ;
SV * sv ;
ENTER ;
SAVETMPS;
PUSHMARK(sp) ;
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
count = perl_call_pv("Subtract", G_EVAL|G_SCALAR);
/* Check the eval first */
sv = GvSV(gv_fetchpv("@", TRUE, SVt_PV));
if (SvTRUE(sv))
printf ("Uh oh - %s\n", SvPV(sv, na)) ;
SPAGAIN ;
if (count != 1)
croak ("call_Subtract : expected 1 return "
"value from 'Subtract', got %d\n", count) ;
printf ("%d - %d = %d\n", a, b, POPi) ;
PUTBACK ;
FREETMPS ;
LEAVE ;
}
となります。call_Subtract が
call_Subtract(4, 5)
のように呼ばれると、以下のように表示されます。
Uh oh - death can be fatal
注意点
die を捉えるために、 G_EVAL フラグを使用しました。このフラ
グを使用しないと、プログラムは途中終了してしまいます。
sv = GvSV(gv_fetchpv("@", TRUE, SVt_PV));
if (SvTRUE(sv))
printf ("Uh oh - %s\n", SvPVx(sv, na)) ;
という部分は、Perl の書くところの
print "Uh oh - $@\n" if $@ ;と同じことになります。
Go to the first, previous, next, last section, table of contents.