On Thu, Jan 5, 2012 at 16:02, Andrew Dunstan <and...@dunslane.net> wrote:
> Fix breakage from earlier plperl fix.
>
> Apparently the perl garbage collector was a bit too eager, so here
> we control when the new SV is garbage collected.

I know im a little late to the party...

I can't help but think this seems a bit inefficient for the common
case. Would it be worth only copying the sv when its a glob or
readonly? Something like the below? I tested a few more svtypes that
were easy to make (code, regexp) and everything seems peachy.

[ BTW it seems readonly in general is fine, for example elog(ERROR,
1); worked previously as well as elog(ERROR, "1");. Both of those sv's
are readonly. ISTM, at least on my version of perl (5.14.2), globs and
readonly vstrings seem to be the problem children. I think we could
get away with testing if its a glob or vstring. But I don't have time
right now to test all the way back to perl 5.8 and everything
in-between, Ill find it if anyone is interested.  ]

--

*** a/src/pl/plperl/plperl_helpers.h
--- b/src/pl/plperl/plperl_helpers.h
***************
*** 47,53 **** sv2cstr(SV *sv)
  {
        char       *val, *res;
        STRLEN          len;
-       SV         *nsv;

        /*
         * get a utf8 encoded char * out of perl. *note* it may not be valid 
utf8!
--- 47,52 ----
***************
*** 58,65 **** sv2cstr(SV *sv)
         * sv before passing it to SvPVutf8(). The copy is garbage collected
         * when we're done with it.
         */
!       nsv = newSVsv(sv);
!       val = SvPVutf8(nsv, len);

        /*
         * we use perl's length in the event we had an embedded null byte to 
ensure
--- 57,68 ----
         * sv before passing it to SvPVutf8(). The copy is garbage collected
         * when we're done with it.
         */
!       if(SvTYPE(sv) == SVt_PVGV || SvREADONLY(sv))
!               sv = newSVsv(sv);
!       else
!               SvREFCNT_inc(sv);
!
!       val = SvPVutf8(sv, len);

        /*
         * we use perl's length in the event we had an embedded null byte to 
ensure
***************
*** 68,74 **** sv2cstr(SV *sv)
        res =  utf_u2e(val, len);

        /* safe now to garbage collect the new SV */
!       SvREFCNT_dec(nsv);

        return res;
  }
--- 71,77 ----
        res =  utf_u2e(val, len);

        /* safe now to garbage collect the new SV */
!       SvREFCNT_dec(sv);

        return res;
  }

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to