diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2012-01-05 17:59:19 -0500 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2012-01-05 17:59:19 -0500 |
commit | bd0e74a9ce98c65c94565fb603dcc7b710cd4227 (patch) | |
tree | 71458518f9b1dfcced2850a4da8bed4a5170bc10 /src/pl/plperl/plperl_helpers.h | |
parent | 7e53515480853604aac825bd3e53e7f9716632b4 (diff) | |
download | postgresql-bd0e74a9ce98c65c94565fb603dcc7b710cd4227.tar.gz postgresql-bd0e74a9ce98c65c94565fb603dcc7b710cd4227.zip |
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.
Diffstat (limited to 'src/pl/plperl/plperl_helpers.h')
-rw-r--r-- | src/pl/plperl/plperl_helpers.h | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/pl/plperl/plperl_helpers.h b/src/pl/plperl/plperl_helpers.h index c671820468a..800a408ac4c 100644 --- a/src/pl/plperl/plperl_helpers.h +++ b/src/pl/plperl/plperl_helpers.h @@ -45,25 +45,32 @@ utf_e2u(const char *str) static inline char * sv2cstr(SV *sv) { - char *val; + char *val, *res; STRLEN len; + SV *nsv; /* * get a utf8 encoded char * out of perl. *note* it may not be valid utf8! * * SvPVutf8() croaks nastily on certain things, like typeglobs and - * readonly object such as $^V. That's a perl bug - it's not supposed to - * happen. To avoid crashing the backend, we make a mortal copy of the - * sv before passing it to SvPVutf8(). The copy will be garbage collected - * very soon (see perldoc perlguts). + * readonly objects such as $^V. That's a perl bug - it's not supposed to + * happen. To avoid crashing the backend, we make a copy of the + * sv before passing it to SvPVutf8(). The copy is garbage collected + * when we're done with it. */ - val = SvPVutf8(sv_mortalcopy(sv), len); + nsv = newSVsv(sv); + val = SvPVutf8(nsv, len); /* - * we use perls length in the event we had an embedded null byte to ensure + * we use perl's length in the event we had an embedded null byte to ensure * we error out properly */ - return utf_u2e(val, len); + res = utf_u2e(val, len); + + /* safe now to garbage collect the new SV */ + SvREFCNT_dec(nsv); + + return res; } /* |