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]

Reply via email to