Hi.
I can't fully understand why there is need to mark values returned from XS-method as "mortal" if they are referenced (owned) by object itself.
Let's dance (sorry for long dump): Getter.pm: ========== sub new { bless( [ $_[1] ], __PACKAGE__); } sub get_perl { $_[0]->[0]; }
Getter.xs: ========== MODULE = Getter PACKAGE = Getter PROTOTYPES: DISABLE
void get_xs1(self) SV *self; PREINIT: SV **pSV; PPCODE: pSV = av_fetch((AV*)SvRV(self), 0, 0);
ST(0) = sv_2mortal(*pSV); SvREFCNT_inc( ST(0) ); sv_dump( ST(0) ); XSRETURN(1);
void get_xs2(self) SV *self; PREINIT: SV **pSV; PPCODE: pSV = av_fetch((AV*)SvRV(self), 0, 0);
ST(0) = sv_mortalcopy(*pSV); sv_dump( ST(0) ); XSRETURN(1);
void get_xs3(self) SV *self; PREINIT: SV **pSV; PPCODE: pSV = av_fetch((AV*)SvRV(self), 0, 0);
ST(0) = *pSV; sv_dump( ST(0) ); XSRETURN(1);
demo.pl: ======= my $arr = Getter->new(222);
warn "\n==> PURE\n"; Dump($arr->[0]); warn "\n==> PERL\n"; my $v0 = $arr->get_perl; Dump($v0); warn "\n==> XS1\n"; my $v1 = $arr->get_xs1; Dump($v1); warn "\n==> XS2\n"; my $v2 = $arr->get_xs2; Dump($v2); warn "\n==> XS3\n"; my $v3 = $arr->get_xs3; Dump($v3);
Results: ======== ==> PURE SV = IV(0x1ab70b0) at 0x15d5c64 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 222
==> PERL SV = IV(0x1ab70b8) at 0x1aef464 REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 222
==> XS1 SV = IV(0x1ab70b0) at 0x15d5c64 REFCNT = 2 FLAGS = (TEMP,IOK,pIOK) IV = 222 SV = IV(0x1ab70b4) at 0x1ace44c REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 222
==> XS2 SV = IV(0x1ab70bc) at 0x15d5c70 REFCNT = 1 FLAGS = (TEMP,IOK,pIOK) IV = 222 SV = IV(0x1ab70c0) at 0x1aef5c0 REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 222
==> XS3 SV = IV(0x1ab70b0) at 0x15d5c64 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 222 SV = IV(0x1ab70bc) at 0x1aef620 REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 222
So we see that returned value is _always_ double-copied. It's marvellous.
Just two questions: 1. What is _exact_ XS-equivalent of "sub { $_[0]->[0];}" ? 2. Is it safe use get_xs3()?
-- Sergey Skvortsov mailto: [EMAIL PROTECTED]