Down with C++ reserved names
[p5sagit/p5-mst-13.2.git] / pp.c
diff --git a/pp.c b/pp.c
index 12f5bfb..37b0c31 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -159,7 +159,7 @@ PP(pp_rv2gv)
                if (SvREADONLY(sv))
                    Perl_croak(aTHX_ PL_no_modify);
                if (PL_op->op_private & OPpDEREF) {
-                   char *name;
+                   const char *name;
                    GV *gv;
                    if (cUNOP->op_targ) {
                        STRLEN len;
@@ -502,7 +502,7 @@ PP(pp_ref)
 {
     dSP; dTARGET;
     SV *sv;
-    char *pv;
+    const char *pv;
 
     sv = POPs;
 
@@ -528,7 +528,7 @@ PP(pp_bless)
     else {
        SV *ssv = POPs;
        STRLEN len;
-       char *ptr;
+       const char *ptr;
 
        if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
            Perl_croak(aTHX_ "Attempt to bless into a reference");
@@ -548,7 +548,7 @@ PP(pp_gelem)
     GV *gv;
     SV *sv;
     SV *tmpRef;
-    char *elem;
+    const char *elem;
     dSP;
     STRLEN n_a;
 
@@ -597,7 +597,7 @@ PP(pp_gelem)
            break;
        case 'P':
            if (strEQ(elem2, "ACKAGE")) {
-               char *name = HvNAME(GvSTASH(gv));
+               const char *name = HvNAME(GvSTASH(gv));
                sv = newSVpv(name ? name : "__ANON__", 0);
            }
            break;
@@ -2995,11 +2995,11 @@ PP(pp_substr)
     I32 pos;
     I32 rem;
     I32 fail;
-    I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
-    char *tmps;
-    I32 arybase = PL_curcop->cop_arybase;
+    const I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
+    const char *tmps;
+    const I32 arybase = PL_curcop->cop_arybase;
     SV *repl_sv = NULL;
-    char *repl = 0;
+    const char *repl = 0;
     STRLEN repl_len;
     int num_args = PL_op->op_private & 7;
     bool repl_need_utf8_upgrade = FALSE;
@@ -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);