This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use the new SV_NOSTEAL flag to avoid the SvTEMP dance in newSVsv
[perl5.git]
/
sv.c
diff --git
a/sv.c
b/sv.c
index
20f344f
..
e9e0eca
100644
(file)
--- a/
sv.c
+++ b/
sv.c
@@
-1,7
+1,7
@@
/* sv.c
*
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
/* sv.c
*
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- * 2000, 2001, 2002, 2003, 2004, by Larry Wall and others
+ * 2000, 2001, 2002, 2003, 2004,
2005,
by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@
-1756,6
+1756,7
@@
You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
bool
Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
{
bool
Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
{
+
char* pv = NULL;
U32 cur = 0;
U32 len = 0;
char* pv = NULL;
U32 cur = 0;
U32 len = 0;
@@
-1953,7
+1954,7
@@
Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
SvSTASH(sv) = stash;
AvALLOC(sv) = 0;
AvARYLEN(sv) = 0;
SvSTASH(sv) = stash;
AvALLOC(sv) = 0;
AvARYLEN(sv) = 0;
- AvFLAGS(sv) =
0
;
+ AvFLAGS(sv) =
AVf_REAL
;
break;
case SVt_PVHV:
SvANY(sv) = new_XPVHV();
break;
case SVt_PVHV:
SvANY(sv) = new_XPVHV();
@@
-3619,14
+3620,13
@@
Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
default: s = "UNKNOWN"; break;
}
tsv = NEWSV(0,0);
default: s = "UNKNOWN"; break;
}
tsv = NEWSV(0,0);
- if (SvOBJECT(sv))
- if (HvNAME(SvSTASH(sv)))
- Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
- else
- Perl_sv_setpvf(aTHX_ tsv, "__ANON__=%s", s);
+ if (SvOBJECT(sv))
{
+ const char *name = HvNAME(SvSTASH(sv));
+ Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
+ name ? name : "__ANON__" , s, PTR2UV(sv));
+ }
else
else
- sv_setpv(tsv, s);
- Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
+ Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", s, PTR2UV(sv));
goto tokensaveref;
}
*lp = strlen(s);
goto tokensaveref;
}
*lp = strlen(s);
@@
-4129,8
+4129,9
@@
function if the source SV needs to be reused. Does not handle 'set' magic.
Loosely speaking, it performs a copy-by-value, obliterating any previous
content of the destination.
If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
Loosely speaking, it performs a copy-by-value, obliterating any previous
content of the destination.
If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
-C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
-implemented in terms of this function.
+C<ssv> if appropriate, else not. If the C<flags> parameter has the
+C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
+and C<sv_setsv_nomg> are implemented in terms of this function.
You probably want to use one of the assortment of wrappers, such as
C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
You probably want to use one of the assortment of wrappers, such as
C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
@@
-4514,6
+4515,8
@@
Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
!(isSwipe =
(sflags & SVs_TEMP) && /* slated for free anyway? */
!(sflags & SVf_OOK) && /* and not involved in OOK hack? */
!(isSwipe =
(sflags & SVs_TEMP) && /* slated for free anyway? */
!(sflags & SVf_OOK) && /* and not involved in OOK hack? */
+ (!(flags & SV_NOSTEAL)) &&
+ /* and we're allowed to steal temps */
SvREFCNT(sstr) == 1 && /* and no other references to it? */
SvLEN(sstr) && /* and really is a string */
/* and won't be needed again, potentially */
SvREFCNT(sstr) == 1 && /* and no other references to it? */
SvLEN(sstr) && /* and really is a string */
/* and won't be needed again, potentially */
@@
-5310,18
+5313,18
@@
Perl_newSV(pTHX_ STRLEN len)
=for apidoc sv_magicext
Adds magic to an SV, upgrading it if necessary. Applies the
=for apidoc sv_magicext
Adds magic to an SV, upgrading it if necessary. Applies the
-supplied vtable and returns pointer to the magic added.
+supplied vtable and returns
a
pointer to the magic added.
-Note that
sv_magicext will allow things that sv_magic
will not.
-In particular
you can add magic to SvREADONLY SVs and an
d more than
-one instance of the same 'how'
+Note that
C<sv_magicext> will allow things that C<sv_magic>
will not.
+In particular
, you can add magic to SvREADONLY SVs, and ad
d more than
+one instance of the same 'how'
.
-I
C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
-if C<namelen> is zero then C<name> is stored as-is and - as another special
-case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
-an C<SV*> and has its REFCNT incremented
+I
f C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
+stored, if C<namlen> is zero then C<name> is stored as-is and - as another
+special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
+to contain an C<SV*> and is stored as-is with its REFCNT incremented.
-(This is now used as a subroutine by
sv_magic
.)
+(This is now used as a subroutine by
C<sv_magic>
.)
=cut
*/
=cut
*/
@@
-5338,10
+5341,10
@@
Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
mg->mg_moremagic = SvMAGIC(sv);
SvMAGIC(sv) = mg;
mg->mg_moremagic = SvMAGIC(sv);
SvMAGIC(sv) = mg;
- /* Some
magic sontains a reference loop, where the sv and object refer to
- each other. To prevent a reference loop that would prevent such
- objects being freed, we look for such loops and if we find one we
- avoid incrementing the object refcount.
+ /* Some
times a magic contains a reference loop, where the sv and
+ object refer to each other. To prevent a reference loop that
+ would prevent such objects being freed, we look for such loops
+ a
nd if we find one we a
void incrementing the object refcount.
Note we cannot do this to avoid self-tie loops as intervening RV must
have its REFCNT incremented to keep it in existence.
Note we cannot do this to avoid self-tie loops as intervening RV must
have its REFCNT incremented to keep it in existence.
@@
-5400,6
+5403,12
@@
Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
then adds a new magic item of type C<how> to the head of the magic list.
Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
then adds a new magic item of type C<how> to the head of the magic list.
+See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
+handling of the C<name> and C<namlen> arguments.
+
+You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
+to add more than one instance of the same 'how'.
+
=cut
*/
=cut
*/
@@
-7849,13
+7858,10
@@
Perl_newSVsv(pTHX_ register SV *old)
return Nullsv;
}
new_SV(sv);
return Nullsv;
}
new_SV(sv);
- if (SvTEMP(old)) {
- SvTEMP_off(old);
- sv_setsv(sv,old);
- SvTEMP_on(old);
- }
- else
- sv_setsv(sv,old);
+ /* SV_GMAGIC is the default for sv_setv()
+ SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
+ with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
+ sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
return sv;
}
return sv;
}
@@
-7963,7
+7969,6
@@
Perl_sv_2io(pTHX_ SV *sv)
{
IO* io;
GV* gv;
{
IO* io;
GV* gv;
- STRLEN n_a;
switch (SvTYPE(sv)) {
case SVt_PVIO:
switch (SvTYPE(sv)) {
case SVt_PVIO:
@@
-7980,7
+7985,7
@@
Perl_sv_2io(pTHX_ SV *sv)
Perl_croak(aTHX_ PL_no_usym, "filehandle");
if (SvROK(sv))
return sv_2io(SvRV(sv));
Perl_croak(aTHX_ PL_no_usym, "filehandle");
if (SvROK(sv))
return sv_2io(SvRV(sv));
- gv = gv_fetch
pv(SvPV(sv,n_a)
, FALSE, SVt_PVIO);
+ gv = gv_fetch
sv(sv
, FALSE, SVt_PVIO);
if (gv)
io = GvIO(gv);
else
if (gv)
io = GvIO(gv);
else
@@
-8006,7
+8011,6
@@
Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
{
GV *gv = Nullgv;
CV *cv = Nullcv;
{
GV *gv = Nullgv;
CV *cv = Nullcv;
- STRLEN n_a;
if (!sv)
return *gvp = Nullgv, Nullcv;
if (!sv)
return *gvp = Nullgv, Nullcv;
@@
-8047,7
+8051,7
@@
Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
else if (isGV(sv))
gv = (GV*)sv;
else
else if (isGV(sv))
gv = (GV*)sv;
else
- gv = gv_fetch
pv(SvPV(sv, n_a)
, lref, SVt_PVCV);
+ gv = gv_fetch
sv(sv
, lref, SVt_PVCV);
*gvp = gv;
if (!gv)
return Nullcv;
*gvp = gv;
if (!gv)
return Nullcv;
@@
-8398,10
+8402,8
@@
char *
Perl_sv_reftype(pTHX_ SV *sv, int ob)
{
if (ob && SvOBJECT(sv)) {
Perl_sv_reftype(pTHX_ SV *sv, int ob)
{
if (ob && SvOBJECT(sv)) {
- if (HvNAME(SvSTASH(sv)))
- return HvNAME(SvSTASH(sv));
- else
- return "__ANON__";
+ char *name = HvNAME(SvSTASH(sv));
+ return name ? name : "__ANON__";
}
else {
switch (SvTYPE(sv)) {
}
else {
switch (SvTYPE(sv)) {
@@
-8899,8
+8901,8
@@
Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
/*
=for apidoc sv_setpvf
/*
=for apidoc sv_setpvf
-Processes its arguments like C<sprintf> and sets an SV to the formatted
-
outpu
t. Does not handle 'set' magic. See C<sv_setpvf_mg>.
+Works like C<sv_catpvf> but copies the text into the SV instead of
+
appending i
t. Does not handle 'set' magic. See C<sv_setpvf_mg>.
=cut
*/
=cut
*/
@@
-8914,7
+8916,16
@@
Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
va_end(args);
}
va_end(args);
}
-/* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
+/*
+=for apidoc sv_vsetpvf
+
+Works like C<sv_vcatpvf> but copies the text into the SV instead of
+appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
+
+Usually used via its frontend C<sv_setpvf>.
+
+=cut
+*/
void
Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
void
Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
@@
-8939,7
+8950,15
@@
Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
va_end(args);
}
va_end(args);
}
-/* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
+/*
+=for apidoc sv_vsetpvf_mg
+
+Like C<sv_vsetpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_setpvf_mg>.
+
+=cut
+*/
void
Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
void
Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
@@
-8988,9
+9007,8
@@
Processes its arguments like C<sprintf> and appends the formatted
output to an SV. If the appended data contains "wide" characters
(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
and characters >255 formatted with %c), the original SV might get
output to an SV. If the appended data contains "wide" characters
(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
and characters >255 formatted with %c), the original SV might get
-upgraded to UTF-8. Handles 'get' magic, but not 'set' magic.
-C<SvSETMAGIC()> must typically be called after calling this function
-to handle 'set' magic.
+upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
+C<sv_catpvf_mg>.
=cut */
=cut */
@@
-9003,7
+9021,16
@@
Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
va_end(args);
}
va_end(args);
}
-/* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
+/*
+=for apidoc sv_vcatpvf
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
+
+Usually used via its frontend C<sv_catpvf>.
+
+=cut
+*/
void
Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
void
Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
@@
-9028,7
+9055,15
@@
Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
va_end(args);
}
va_end(args);
}
-/* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
+/*
+=for apidoc sv_vcatpvf_mg
+
+Like C<sv_vcatpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_catpvf_mg>.
+
+=cut
+*/
void
Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
void
Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
@@
-9040,10
+9075,10
@@
Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
/*
=for apidoc sv_vsetpvfn
/*
=for apidoc sv_vsetpvfn
-Works like C<vcatpvfn> but copies the text into the SV instead of
+Works like C<
sv_
vcatpvfn> but copies the text into the SV instead of
appending it.
appending it.
-Usually used via one of its frontends C<sv_
setpvf> and C<sv_
setpvf_mg>.
+Usually used via one of its frontends C<sv_
vsetpvf> and C<sv_v
setpvf_mg>.
=cut
*/
=cut
*/
@@
-9108,7
+9143,7
@@
missing (NULL). When running with taint checks enabled, indicates via
C<maybe_tainted> if results are untrustworthy (often due to the use of
locales).
C<maybe_tainted> if results are untrustworthy (often due to the use of
locales).
-Usually used via one of its frontends C<sv_
catpvf> and C<sv_
catpvf_mg>.
+Usually used via one of its frontends C<sv_
vcatpvf> and C<sv_v
catpvf_mg>.
=cut
*/
=cut
*/
@@
-9354,6
+9389,11
@@
Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
fill = *q++;
EXPECT_NUMBER(q, width);
fill = *q++;
EXPECT_NUMBER(q, width);
+#ifdef CHECK_FORMAT
+ if ((*q == 'p') && left) {
+ vectorize = (width == 1);
+ }
+#endif
if (vectorize) {
if (vectorarg) {
if (args)
if (vectorize) {
if (vectorarg) {
if (args)
@@
-9545,6
+9585,9
@@
Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
goto string;
case '_':
goto string;
case '_':
+#ifdef CHECK_FORMAT
+ format_sv:
+#endif
/*
* The "%_" hack might have to be changed someday,
* if ISO or ANSI decide to use '_' for something.
/*
* The "%_" hack might have to be changed someday,
* if ISO or ANSI decide to use '_' for something.
@@
-9566,6
+9609,21
@@
Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
/* INTEGERS */
case 'p':
/* INTEGERS */
case 'p':
+#ifdef CHECK_FORMAT
+ if (left) {
+ left = FALSE;
+ if (!width)
+ goto format_sv; /* %-p -> %_ */
+ if (vectorize) {
+ width = 0;
+ goto format_d; /* %-1p -> %vd */
+ }
+ precis = width;
+ has_precis = TRUE;
+ width = 0;
+ goto format_sv; /* %-Np -> %.N_ */
+ }
+#endif
if (alt || vectorize)
goto unknown;
uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
if (alt || vectorize)
goto unknown;
uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
@@
-9578,6
+9636,9
@@
Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
#else
intsize = 'l';
#endif
#else
intsize = 'l';
#endif
+#ifdef CHECK_FORMAT
+ format_d:
+#endif
/* FALL THROUGH */
case 'd':
case 'i':
/* FALL THROUGH */
case 'd':
case 'i':
@@
-10204,7
+10265,9
@@
Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
case 'o':
/* Compiled op trees are readonly, and can thus be
shared without duplication. */
case 'o':
/* Compiled op trees are readonly, and can thus be
shared without duplication. */
+ OP_REFCNT_LOCK;
d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
+ OP_REFCNT_UNLOCK;
break;
case 'n':
d->data[i] = r->data->data[i];
break;
case 'n':
d->data[i] = r->data->data[i];
@@
-10915,7
+10978,9
@@
Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
Perl_rvpv_dup(aTHX_ dstr, sstr, param);
CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
CvSTART(dstr) = CvSTART(sstr);
Perl_rvpv_dup(aTHX_ dstr, sstr, param);
CvSTASH(dstr) = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
CvSTART(dstr) = CvSTART(sstr);
+ OP_REFCNT_LOCK;
CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
+ OP_REFCNT_UNLOCK;
CvXSUB(dstr) = CvXSUB(sstr);
CvXSUBANY(dstr) = CvXSUBANY(sstr);
if (CvCONST(sstr)) {
CvXSUB(dstr) = CvXSUB(sstr);
CvXSUBANY(dstr) = CvXSUBANY(sstr);
if (CvCONST(sstr)) {
@@
-11576,19
+11641,23
@@
perl_clone_using(PerlInterpreter *proto_perl, UV flags,
SvANY(&PL_sv_no) = new_XPVNV();
SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
SvANY(&PL_sv_no) = new_XPVNV();
SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
- SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
+ SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
+ |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
SvCUR(&PL_sv_no) = 0;
SvLEN(&PL_sv_no) = 1;
SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
SvCUR(&PL_sv_no) = 0;
SvLEN(&PL_sv_no) = 1;
+ SvIVX(&PL_sv_no) = 0;
SvNVX(&PL_sv_no) = 0;
ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
SvANY(&PL_sv_yes) = new_XPVNV();
SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
SvNVX(&PL_sv_no) = 0;
ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
SvANY(&PL_sv_yes) = new_XPVNV();
SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
- SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
+ SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
+ |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
SvCUR(&PL_sv_yes) = 1;
SvLEN(&PL_sv_yes) = 2;
SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
SvCUR(&PL_sv_yes) = 1;
SvLEN(&PL_sv_yes) = 2;
+ SvIVX(&PL_sv_yes) = 1;
SvNVX(&PL_sv_yes) = 1;
ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
SvNVX(&PL_sv_yes) = 1;
ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
@@
-12108,9
+12177,6
@@
perl_clone_using(PerlInterpreter *proto_perl, UV flags,
PL_dirty = proto_perl->Tdirty;
PL_localizing = proto_perl->Tlocalizing;
PL_dirty = proto_perl->Tdirty;
PL_localizing = proto_perl->Tlocalizing;
-#ifdef PERL_FLEXIBLE_EXCEPTIONS
- PL_protect = proto_perl->Tprotect;
-#endif
PL_errors = sv_dup_inc(proto_perl->Terrors, param);
PL_hv_fetch_ent_mh = Nullhe;
PL_modcount = proto_perl->Tmodcount;
PL_errors = sv_dup_inc(proto_perl->Terrors, param);
PL_hv_fetch_ent_mh = Nullhe;
PL_modcount = proto_perl->Tmodcount;
@@
-12282,8
+12348,9
@@
Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
FREETMPS;
LEAVE;
SvUTF8_on(sv);
FREETMPS;
LEAVE;
SvUTF8_on(sv);
+ return SvPVX(sv);
}
}
- return SvP
VX(sv)
;
+ return SvP
OKp(sv) ? SvPVX(sv) : NULL
;
}
/*
}
/*
@@
-12333,3
+12400,12
@@
Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
return ret;
}
return ret;
}
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+*/