X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp.c;h=7185f0312c209ce5ea065639df84b8e0888206f5;hb=f8952f9c0d30f65af1114a6384b97ad7770dce81;hp=12f5bfbde2b285ddb75c982eabb916c752b5325b;hpb=89ebb4a3f2a55825eeed13aaf58db5c73d2140ef;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp.c b/pp.c index 12f5bfb..7185f03 100644 --- a/pp.c +++ b/pp.c @@ -3583,8 +3583,10 @@ PP(pp_uc) SETs(TARG); } else { + STRLEN min = len + 1; + (void)SvUPGRADE(TARG, SVt_PV); - SvGROW(TARG, len + 1); + SvGROW(TARG, min); (void)SvPOK_only(TARG); d = (U8*)SvPVX(TARG); send = s + len; @@ -3592,14 +3594,16 @@ PP(pp_uc) STRLEN u = UTF8SKIP(s); toUPPER_utf8(s, tmpbuf, &ulen); - if (ulen > u) { + if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) { + /* If the eventually required minimum size outgrows + * the available space, we need to grow. */ UV o = d - (U8*)SvPVX(TARG); /* If someone uppercases one million U+03B0s we * SvGROW() one million times. Or we could try - * guess how much to allocate without overdoing. - * Such is life. */ - SvGROW(TARG, SvCUR(TARG) + ulen - u); + * guessing how much to allocate without allocating + * too much. Such is life. */ + SvGROW(TARG, min); d = (U8*)SvPVX(TARG) + o; } Copy(tmpbuf, d, ulen, U8); @@ -3662,8 +3666,10 @@ PP(pp_lc) SETs(TARG); } else { + STRLEN min = len + 1; + (void)SvUPGRADE(TARG, SVt_PV); - SvGROW(TARG, len + 1); + SvGROW(TARG, min); (void)SvPOK_only(TARG); d = (U8*)SvPVX(TARG); send = s + len; @@ -3690,14 +3696,16 @@ PP(pp_lc) * See lib/unicore/SpecialCasing.txt. */ } - if (ulen > u) { + if (ulen > u && (SvLEN(TARG) < (min += ulen - u))) { + /* If the eventually required minimum size outgrows + * the available space, we need to grow. */ UV o = d - (U8*)SvPVX(TARG); /* If someone lowercases one million U+0130s we * SvGROW() one million times. Or we could try - * guess how much to allocate without overdoing. - Such is life. */ - SvGROW(TARG, SvCUR(TARG) + ulen - u); + * guessing how much to allocate without allocating. + * too much. Such is life. */ + SvGROW(TARG, min); d = (U8*)SvPVX(TARG) + o; } Copy(tmpbuf, d, ulen, U8);