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
was: [ANNOUNCE] ExtUtils::MakeMaker 5.48_03
[perl5.git]
/
doop.c
diff --git
a/doop.c
b/doop.c
index
755cbfd
..
8b02034
100644
(file)
--- a/
doop.c
+++ b/
doop.c
@@
-92,7
+92,7
@@
S_do_trans_simple(pTHX_ SV *sv)
}
STATIC I32
}
STATIC I32
-S_do_trans_count(pTHX_ SV *sv)
/* SPC - OK */
+S_do_trans_count(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
{
U8 *s;
U8 *send;
@@
-130,7
+130,7
@@
S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
}
STATIC I32
}
STATIC I32
-S_do_trans_complex(pTHX_ SV *sv)
/* SPC - NOT OK */
+S_do_trans_complex(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
{
U8 *s;
U8 *send;
@@
-141,7
+141,7
@@
S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
I32 grows = PL_op->op_private & OPpTRANS_GROWS;
I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT;
I32 del = PL_op->op_private & OPpTRANS_DELETE;
I32 grows = PL_op->op_private & OPpTRANS_GROWS;
I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT;
I32 del = PL_op->op_private & OPpTRANS_DELETE;
- STRLEN len, rlen;
+ STRLEN len, rlen
= 0
;
short *tbl;
I32 ch;
short *tbl;
I32 ch;
@@
-292,7
+292,7
@@
S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
}
STATIC I32
}
STATIC I32
-S_do_trans_simple_utf8(pTHX_ SV *sv)
/* SPC - OK */
+S_do_trans_simple_utf8(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
{
U8 *s;
U8 *send;
@@
-308,7
+308,7
@@
S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
- UV final;
+ UV final
= 0
;
UV uv;
I32 isutf8;
U8 hibit = 0;
UV uv;
I32 isutf8;
U8 hibit = 0;
@@
-386,18
+386,15
@@
S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
}
SvSETMAGIC(sv);
SvUTF8_on(sv);
}
SvSETMAGIC(sv);
SvUTF8_on(sv);
- /* Downgrading just 'cos it will is suspect - NI-S */
- if (!isutf8 && !(PL_hints & HINT_UTF8))
- sv_utf8_downgrade(sv, TRUE);
return matches;
}
STATIC I32
return matches;
}
STATIC I32
-S_do_trans_count_utf8(pTHX_ SV *sv)
/* SPC - OK */
+S_do_trans_count_utf8(pTHX_ SV *sv)
{
U8 *s;
{
U8 *s;
- U8 *start, *send;
+ U8 *start
= 0
, *send;
I32 matches = 0;
STRLEN len;
I32 matches = 0;
STRLEN len;
@@
-434,7
+431,7
@@
S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
}
STATIC I32
}
STATIC I32
-S_do_trans_complex_utf8(pTHX_ SV *sv)
/* SPC - NOT OK */
+S_do_trans_complex_utf8(pTHX_ SV *sv)
{
U8 *s;
U8 *start, *send;
{
U8 *s;
U8 *start, *send;
@@
-448,7
+445,7
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
- UV final;
+ UV final
= 0
;
bool havefinal = FALSE;
UV uv;
STRLEN len;
bool havefinal = FALSE;
UV uv;
STRLEN len;
@@
-590,8
+587,6
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
SvCUR_set(sv, d - dstart);
}
SvUTF8_on(sv);
SvCUR_set(sv, d - dstart);
}
SvUTF8_on(sv);
- if (!isutf8 && !(PL_hints & HINT_UTF8))
- sv_utf8_downgrade(sv, TRUE);
SvSETMAGIC(sv);
return matches;
SvSETMAGIC(sv);
return matches;
@@
-604,9
+599,12
@@
Perl_do_trans(pTHX_ SV *sv)
I32 hasutf = (PL_op->op_private &
(OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
I32 hasutf = (PL_op->op_private &
(OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
- if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
- Perl_croak(aTHX_ PL_no_modify);
-
+ if (SvREADONLY(sv)) {
+ if (SvFAKE(sv))
+ sv_force_normal(sv);
+ if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
(void)SvPV(sv, len);
if (!len)
return 0;
(void)SvPV(sv, len);
if (!len)
return 0;
@@
-646,9
+644,11
@@
Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **s
register I32 items = sp - mark;
register STRLEN len;
STRLEN delimlen;
register I32 items = sp - mark;
register STRLEN len;
STRLEN delimlen;
- register char *delim = SvPV(del, delimlen);
STRLEN tmplen;
STRLEN tmplen;
+ (void) SvPV(del, delimlen); /* stringify and get the delimlen */
+ /* SvCUR assumes it's SvPOK() and woe betide you if it's not. */
+
mark++;
len = (items > 0 ? (delimlen * (items - 1) ) : 0);
(void)SvUPGRADE(sv, SVt_PV);
mark++;
len = (items > 0 ? (delimlen * (items - 1) ) : 0);
(void)SvUPGRADE(sv, SVt_PV);
@@
-667,14
+667,16
@@
Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **s
++mark;
}
++mark;
}
+ sv_setpv(sv, "");
+ if (PL_tainting && SvMAGICAL(sv))
+ SvTAINTED_off(sv);
+
if (items-- > 0) {
if (items-- > 0) {
- sv_setpv(sv, "");
if (*mark)
sv_catsv(sv, *mark);
mark++;
}
if (*mark)
sv_catsv(sv, *mark);
mark++;
}
- else
- sv_setpv(sv,"");
+
if (delimlen) {
for (; items > 0; items--,mark++) {
sv_catsv(sv,del);
if (delimlen) {
for (; items > 0; items--,mark++) {
sv_catsv(sv,del);
@@
-695,6
+697,9
@@
Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
char *pat = SvPV(*sarg, patlen);
bool do_taint = FALSE;
char *pat = SvPV(*sarg, patlen);
bool do_taint = FALSE;
+ SvUTF8_off(sv);
+ if (DO_UTF8(*sarg))
+ SvUTF8_on(sv);
sv_vsetpvfn(sv, pat, patlen, Null(va_list*), sarg + 1, len - 1, &do_taint);
SvSETMAGIC(sv);
if (do_taint)
sv_vsetpvfn(sv, pat, patlen, Null(va_list*), sarg + 1, len - 1, &do_taint);
SvSETMAGIC(sv);
if (do_taint)
@@
-948,8
+953,14
@@
Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
do_chop(astr,hv_iterval(hv,entry));
return;
}
do_chop(astr,hv_iterval(hv,entry));
return;
}
- else if (SvREADONLY(sv))
- Perl_croak(aTHX_ PL_no_modify);
+ else if (SvREADONLY(sv)) {
+ if (SvFAKE(sv)) {
+ /* SV is copy-on-write */
+ sv_force_normal_flags(sv, 0);
+ }
+ if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
s = SvPV(sv, len);
if (len && !SvPOK(sv))
s = SvPV_force(sv, len);
s = SvPV(sv, len);
if (len && !SvPOK(sv))
s = SvPV_force(sv, len);
@@
-989,6
+1000,7
@@
Perl_do_chomp(pTHX_ register SV *sv)
{
register I32 count;
STRLEN len;
{
register I32 count;
STRLEN len;
+ STRLEN n_a;
char *s;
if (RsSNARF(PL_rs))
char *s;
if (RsSNARF(PL_rs))
@@
-1017,11
+1029,15
@@
Perl_do_chomp(pTHX_ register SV *sv)
count += do_chomp(hv_iterval(hv,entry));
return count;
}
count += do_chomp(hv_iterval(hv,entry));
return count;
}
- else if (SvREADONLY(sv))
- Perl_croak(aTHX_ PL_no_modify);
+ else if (SvREADONLY(sv)) {
+ if (SvFAKE(sv)) {
+ /* SV is copy-on-write */
+ sv_force_normal_flags(sv, 0);
+ }
+ if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
s = SvPV(sv, len);
s = SvPV(sv, len);
- if (len && !SvPOKp(sv))
- s = SvPV_force(sv, len);
if (s && len) {
s += --len;
if (RsPARA(PL_rs)) {
if (s && len) {
s += --len;
if (RsPARA(PL_rs)) {
@@
-1052,12
+1068,13
@@
Perl_do_chomp(pTHX_ register SV *sv)
count += rslen;
}
}
count += rslen;
}
}
-
*s = '\0'
;
+
s = SvPV_force(sv, n_a)
;
SvCUR_set(sv, len);
SvCUR_set(sv, len);
+ *SvEND(sv) = '\0';
SvNIOK_off(sv);
SvNIOK_off(sv);
+ SvSETMAGIC(sv);
}
nope:
}
nope:
- SvSETMAGIC(sv);
return count;
}
return count;
}
@@
-1080,7
+1097,7
@@
Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
char *rsave;
bool left_utf = DO_UTF8(left);
bool right_utf = DO_UTF8(right);
char *rsave;
bool left_utf = DO_UTF8(left);
bool right_utf = DO_UTF8(right);
- I32 needlen;
+ I32 needlen
= 0
;
if (left_utf && !right_utf)
sv_utf8_upgrade(right);
if (left_utf && !right_utf)
sv_utf8_upgrade(right);
@@
-1291,7
+1308,7
@@
Perl_do_kv(pTHX)
if (PL_op->op_flags & OPf_MOD || LVRET) { /* lvalue */
if (SvTYPE(TARG) < SVt_PVLV) {
sv_upgrade(TARG, SVt_PVLV);
if (PL_op->op_flags & OPf_MOD || LVRET) { /* lvalue */
if (SvTYPE(TARG) < SVt_PVLV) {
sv_upgrade(TARG, SVt_PVLV);
- sv_magic(TARG, Nullsv,
'k'
, Nullch, 0);
+ sv_magic(TARG, Nullsv,
PERL_MAGIC_nkeys
, Nullch, 0);
}
LvTYPE(TARG) = 'k';
if (LvTARG(TARG) != (SV*)keys) {
}
LvTYPE(TARG) = 'k';
if (LvTARG(TARG) != (SV*)keys) {
@@
-1303,7
+1320,7
@@
Perl_do_kv(pTHX)
RETURN;
}
RETURN;
}
- if (! SvTIED_mg((SV*)keys,
'P'
))
+ if (! SvTIED_mg((SV*)keys,
PERL_MAGIC_tied
))
i = HvKEYS(keys);
else {
i = 0;
i = HvKEYS(keys);
else {
i = 0;