Sergey Skvortsov <[EMAIL PROTECTED]> writes: >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.
There is no such need. Marking things as mortal just arranges for an SvREFCNT_dec() on the FREETMPS that is paired with SAVETMPS inside a ENTER/LEAVE pair. >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); > >my $arr = Getter->new(222); >warn "\n==> XS3\n"; my $v3 = $arr->get_xs3; Dump($v3); > >==> 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. Well it has to be copied because $v3 has its OWN sv in the 'pad'. You can only alias SVs of variables using glob hackery which means they aren't lexicals our $v4; *v4 = \$arr->[0]; > >Just two questions: >1. What is _exact_ XS-equivalent of "sub { $_[0]->[0];}" ? There are several ways to write it but in my style it would be something like: void get_xs4(SV *self) CODE: { if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVAV) { croak("Not an ARRAY reference:%_",self); } else { SV **pSV = av_fetch((AV*)SvRV(self), 0, 0); if (pSV) { ST(0) = *pSV; sv_dump( ST(0) ); XSRETURN(1); } else { XSRETURN_UNDEF; } } } >2. Is it safe use get_xs3()? Not if there are holes in your array.