The old COW code needs to use SvPVX_mutable when doing copy-on-write.
[p5sagit/p5-mst-13.2.git] / pp_ctl.c
index 8fd89c0..032d716 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -78,9 +78,7 @@ PP(pp_regcomp)
 {
     dSP;
     register PMOP *pm = (PMOP*)cLOGOP->op_other;
-    register char *t;
     SV *tmpstr;
-    STRLEN len;
     MAGIC *mg = Null(MAGIC*);
 
     /* prevent recompiling under /o and ithreads. */
@@ -129,7 +127,8 @@ PP(pp_regcomp)
        PM_SETRE(pm, ReREFCNT_inc(re));
     }
     else {
-       t = SvPV(tmpstr, len);
+       STRLEN len;
+       const char *t = SvPV_const(tmpstr, len);
 
        /* Check against the last compiled regexp. */
        if (!PM_GETRE(pm) || !PM_GETRE(pm)->precomp ||
@@ -151,7 +150,7 @@ PP(pp_regcomp)
                if (pm->op_pmdynflags & PMdf_UTF8)
                    t = (char*)bytes_to_utf8((U8*)t, &len);
            }
-           PM_SETRE(pm, CALLREGCOMP(aTHX_ t, t + len, pm));
+           PM_SETRE(pm, CALLREGCOMP(aTHX_ (char *)t, (char *)t + len, pm));
            if (!DO_UTF8(tmpstr) && (pm->op_pmdynflags & PMdf_UTF8))
                Safefree(t);
            PL_reginterp_cnt = 0;       /* XXXX Be extra paranoid - needed
@@ -234,7 +233,7 @@ PP(pp_substcont)
            }
            cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
 
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
            if (SvIsCOW(targ)) {
                sv_force_normal_flags(targ, SV_COW_DROP_PV);
            } else
@@ -309,7 +308,7 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
     U32 i;
 
     if (!p || p[1] < rx->nparens) {
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
        i = 7 + rx->nparens * 2;
 #else
        i = 6 + rx->nparens * 2;
@@ -324,7 +323,7 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
     *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
     RX_MATCH_COPIED_off(rx);
 
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
     *p++ = PTR2UV(rx->saved_copy);
     rx->saved_copy = Nullsv;
 #endif
@@ -349,7 +348,7 @@ Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
     RX_MATCH_COPIED_set(rx, *p);
     *p++ = 0;
 
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
     if (rx->saved_copy)
        SvREFCNT_dec (rx->saved_copy);
     rx->saved_copy = INT2PTR(SV*,*p);
@@ -373,7 +372,7 @@ Perl_rxres_free(pTHX_ void **rsp)
 
     if (p) {
        Safefree(INT2PTR(char*,*p));
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
        if (p[1]) {
            SvREFCNT_dec (INT2PTR(SV*,p[1]));
        }
@@ -389,17 +388,15 @@ PP(pp_formline)
     register SV *tmpForm = *++MARK;
     register U32 *fpc;
     register char *t;
-    register char *f;
-    register char *s;
-    register char *send;
+    const char *f;
     register I32 arg;
     register SV *sv = Nullsv;
-    char *item = Nullch;
+    const char *item = Nullch;
     I32 itemsize  = 0;
     I32 fieldsize = 0;
     I32 lines = 0;
     bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
-    char *chophere = Nullch;
+    const char *chophere = Nullch;
     char *linemark = Nullch;
     NV value;
     bool gotsome = FALSE;
@@ -429,11 +426,9 @@ PP(pp_formline)
        targ_is_utf8 = TRUE;
     t = SvGROW(PL_formtarget, len + fudge + 1);  /* XXX SvCUR bad */
     t += len;
-    f = SvPV(tmpForm, len);
+    f = SvPV_const(tmpForm, len);
     /* need to jump to the next word */
-    s = f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN;
-
-    fpc = (U32*)s;
+    fpc = (U32*)(f + len + WORD_ALIGN - SvCUR(tmpForm) % WORD_ALIGN);
 
     for (;;) {
        DEBUG_f( {
@@ -512,127 +507,134 @@ PP(pp_formline)
            break;
 
        case FF_CHECKNL:
-           item = s = SvPV(sv, len);
-           itemsize = len;
-           if (DO_UTF8(sv)) {
-               itemsize = sv_len_utf8(sv);
-               if (itemsize != (I32)len) {
-                   I32 itembytes;
-                   if (itemsize > fieldsize) {
-                       itemsize = fieldsize;
-                       itembytes = itemsize;
-                       sv_pos_u2b(sv, &itembytes, 0);
-                   }
-                   else
-                       itembytes = len;
-                   send = chophere = s + itembytes;
-                   while (s < send) {
-                       if (*s & ~31)
-                           gotsome = TRUE;
-                       else if (*s == '\n')
-                           break;
-                       s++;
+           {
+               const char *send;
+               const char *s = item = SvPV_const(sv, len);
+               itemsize = len;
+               if (DO_UTF8(sv)) {
+                   itemsize = sv_len_utf8(sv);
+                   if (itemsize != (I32)len) {
+                       I32 itembytes;
+                       if (itemsize > fieldsize) {
+                           itemsize = fieldsize;
+                           itembytes = itemsize;
+                           sv_pos_u2b(sv, &itembytes, 0);
+                       }
+                       else
+                           itembytes = len;
+                       send = chophere = s + itembytes;
+                       while (s < send) {
+                           if (*s & ~31)
+                               gotsome = TRUE;
+                           else if (*s == '\n')
+                               break;
+                           s++;
+                       }
+                       item_is_utf8 = TRUE;
+                       itemsize = s - item;
+                       sv_pos_b2u(sv, &itemsize);
+                       break;
                    }
-                   item_is_utf8 = TRUE;
-                   itemsize = s - item;
-                   sv_pos_b2u(sv, &itemsize);
-                   break;
                }
+               item_is_utf8 = FALSE;
+               if (itemsize > fieldsize)
+                   itemsize = fieldsize;
+               send = chophere = s + itemsize;
+               while (s < send) {
+                   if (*s & ~31)
+                       gotsome = TRUE;
+                   else if (*s == '\n')
+                       break;
+                   s++;
+               }
+               itemsize = s - item;
+               break;
            }
-           item_is_utf8 = FALSE;
-           if (itemsize > fieldsize)
-               itemsize = fieldsize;
-           send = chophere = s + itemsize;
-           while (s < send) {
-               if (*s & ~31)
-                   gotsome = TRUE;
-               else if (*s == '\n')
-                   break;
-               s++;
-           }
-           itemsize = s - item;
-           break;
 
        case FF_CHECKCHOP:
-           item = s = SvPV(sv, len);
-           itemsize = len;
-           if (DO_UTF8(sv)) {
-               itemsize = sv_len_utf8(sv);
-               if (itemsize != (I32)len) {
-                   I32 itembytes;
-                   if (itemsize <= fieldsize) {
-                       send = chophere = s + itemsize;
-                       while (s < send) {
-                           if (*s == '\r') {
-                               itemsize = s - item;
-                               chophere = s;
-                               break;
-                           }
-                           if (*s++ & ~31)
-                               gotsome = TRUE;
-                       }
-                   }
-                   else {
-                       itemsize = fieldsize;
-                       itembytes = itemsize;
-                       sv_pos_u2b(sv, &itembytes, 0);
-                       send = chophere = s + itembytes;
-                       while (s < send || (s == send && isSPACE(*s))) {
-                           if (isSPACE(*s)) {
-                               if (chopspace)
+           {
+               const char *s = item = SvPV_const(sv, len);
+               itemsize = len;
+               if (DO_UTF8(sv)) {
+                   itemsize = sv_len_utf8(sv);
+                   if (itemsize != (I32)len) {
+                       I32 itembytes;
+                       if (itemsize <= fieldsize) {
+                           const char *send = chophere = s + itemsize;
+                           while (s < send) {
+                               if (*s == '\r') {
+                                   itemsize = s - item;
                                    chophere = s;
-                               if (*s == '\r')
                                    break;
-                           }
-                           else {
-                               if (*s & ~31)
+                               }
+                               if (*s++ & ~31)
                                    gotsome = TRUE;
-                               if (strchr(PL_chopset, *s))
-                                   chophere = s + 1;
                            }
-                           s++;
                        }
-                       itemsize = chophere - item;
-                       sv_pos_b2u(sv, &itemsize);
-                   }
-                   item_is_utf8 = TRUE;
-                   break;
-               }
-           }
-           item_is_utf8 = FALSE;
-           if (itemsize <= fieldsize) {
-               send = chophere = s + itemsize;
-               while (s < send) {
-                   if (*s == '\r') {
-                       itemsize = s - item;
-                       chophere = s;
+                       else {
+                           const char *send;
+                           itemsize = fieldsize;
+                           itembytes = itemsize;
+                           sv_pos_u2b(sv, &itembytes, 0);
+                           send = chophere = s + itembytes;
+                           while (s < send || (s == send && isSPACE(*s))) {
+                               if (isSPACE(*s)) {
+                                   if (chopspace)
+                                       chophere = s;
+                                   if (*s == '\r')
+                                       break;
+                               }
+                               else {
+                                   if (*s & ~31)
+                                       gotsome = TRUE;
+                                   if (strchr(PL_chopset, *s))
+                                       chophere = s + 1;
+                               }
+                               s++;
+                           }
+                           itemsize = chophere - item;
+                           sv_pos_b2u(sv, &itemsize);
+                       }
+                       item_is_utf8 = TRUE;
                        break;
                    }
-                   if (*s++ & ~31)
-                       gotsome = TRUE;
                }
-           }
-           else {
-               itemsize = fieldsize;
-               send = chophere = s + itemsize;
-               while (s < send || (s == send && isSPACE(*s))) {
-                   if (isSPACE(*s)) {
-                       if (chopspace)
+               item_is_utf8 = FALSE;
+               if (itemsize <= fieldsize) {
+                   const char *const send = chophere = s + itemsize;
+                   while (s < send) {
+                       if (*s == '\r') {
+                           itemsize = s - item;
                            chophere = s;
-                       if (*s == '\r')
                            break;
-                   }
-                   else {
-                       if (*s & ~31)
+                       }
+                       if (*s++ & ~31)
                            gotsome = TRUE;
-                       if (strchr(PL_chopset, *s))
-                           chophere = s + 1;
                    }
-                   s++;
                }
-               itemsize = chophere - item;
+               else {
+                   const char *send;
+                   itemsize = fieldsize;
+                   send = chophere = s + itemsize;
+                   while (s < send || (s == send && isSPACE(*s))) {
+                       if (isSPACE(*s)) {
+                           if (chopspace)
+                               chophere = s;
+                           if (*s == '\r')
+                               break;
+                       }
+                       else {
+                           if (*s & ~31)
+                               gotsome = TRUE;
+                           if (strchr(PL_chopset, *s))
+                               chophere = s + 1;
+                       }
+                       s++;
+                   }
+                   itemsize = chophere - item;
+               }
+               break;
            }
-           break;
 
        case FF_SPACE:
            arg = fieldsize - itemsize;
@@ -654,77 +656,81 @@ PP(pp_formline)
            break;
 
        case FF_ITEM:
-           arg = itemsize;
-           s = item;
-           if (item_is_utf8) {
-               if (!targ_is_utf8) {
-                   SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
-                   *t = '\0';
-                   sv_utf8_upgrade(PL_formtarget);
-                   SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
-                   t = SvEND(PL_formtarget);
-                   targ_is_utf8 = TRUE;
-               }
-               while (arg--) {
-                   if (UTF8_IS_CONTINUED(*s)) {
-                       STRLEN skip = UTF8SKIP(s);
-                       switch (skip) {
-                       default:
-                           Move(s,t,skip,char);
-                           s += skip;
-                           t += skip;
-                           break;
-                       case 7: *t++ = *s++;
-                       case 6: *t++ = *s++;
-                       case 5: *t++ = *s++;
-                       case 4: *t++ = *s++;
-                       case 3: *t++ = *s++;
-                       case 2: *t++ = *s++;
-                       case 1: *t++ = *s++;
-                       }
+           {
+               const char *s = item;
+               arg = itemsize;
+               if (item_is_utf8) {
+                   if (!targ_is_utf8) {
+                       SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
+                       *t = '\0';
+                       sv_utf8_upgrade(PL_formtarget);
+                       SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
+                       t = SvEND(PL_formtarget);
+                       targ_is_utf8 = TRUE;
                    }
-                   else {
-                       if ( !((*t++ = *s++) & ~31) )
-                           t[-1] = ' ';
+                   while (arg--) {
+                       if (UTF8_IS_CONTINUED(*s)) {
+                           STRLEN skip = UTF8SKIP(s);
+                           switch (skip) {
+                           default:
+                               Move(s,t,skip,char);
+                               s += skip;
+                               t += skip;
+                               break;
+                           case 7: *t++ = *s++;
+                           case 6: *t++ = *s++;
+                           case 5: *t++ = *s++;
+                           case 4: *t++ = *s++;
+                           case 3: *t++ = *s++;
+                           case 2: *t++ = *s++;
+                           case 1: *t++ = *s++;
+                           }
+                       }
+                       else {
+                           if ( !((*t++ = *s++) & ~31) )
+                               t[-1] = ' ';
+                       }
                    }
+                   break;
                }
-               break;
-           }
-           if (targ_is_utf8 && !item_is_utf8) {
-               SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
-               *t = '\0';
-               sv_catpvn_utf8_upgrade(PL_formtarget, s, arg, nsv);
-               for (; t < SvEND(PL_formtarget); t++) {
+               if (targ_is_utf8 && !item_is_utf8) {
+                   SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
+                   *t = '\0';
+                   sv_catpvn_utf8_upgrade(PL_formtarget, s, arg, nsv);
+                   for (; t < SvEND(PL_formtarget); t++) {
 #ifdef EBCDIC
-                   int ch = *t;
-                   if (iscntrl(ch))
+                       int ch = *t;
+                       if (iscntrl(ch))
 #else
-                   if (!(*t & ~31))
+                           if (!(*t & ~31))
 #endif
-                       *t = ' ';
+                               *t = ' ';
+                   }
+                   break;
                }
-               break;
-           }
-           while (arg--) {
+               while (arg--) {
 #ifdef EBCDIC
-               int ch = *t++ = *s++;
-               if (iscntrl(ch))
+                   int ch = *t++ = *s++;
+                   if (iscntrl(ch))
 #else
-               if ( !((*t++ = *s++) & ~31) )
+                       if ( !((*t++ = *s++) & ~31) )
 #endif
-                   t[-1] = ' ';
+                           t[-1] = ' ';
+               }
+               break;
            }
-           break;
 
        case FF_CHOP:
-           s = chophere;
-           if (chopspace) {
-               while (*s && isSPACE(*s))
-                   s++;
+           {
+               const char *s = chophere;
+               if (chopspace) {
+                   while (*s && isSPACE(*s))
+                       s++;
+               }
+               sv_chop(sv,s);
+               SvSETMAGIC(sv);
+               break;
            }
-           sv_chop(sv,s);
-           SvSETMAGIC(sv);
-           break;
 
        case FF_LINESNGL:
            chopspace = 0;
@@ -733,47 +739,49 @@ PP(pp_formline)
        case FF_LINEGLOB:
            oneline = FALSE;
        ff_line:
-           item = s = SvPV(sv, len);
-           itemsize = len;
-           if ((item_is_utf8 = DO_UTF8(sv)))
-               itemsize = sv_len_utf8(sv);
-           if (itemsize) {
-               bool chopped = FALSE;
-               gotsome = TRUE;
-               send = s + len;
-               chophere = s + itemsize;
-               while (s < send) {
-                   if (*s++ == '\n') {
-                       if (oneline) {
-                           chopped = TRUE;
-                           chophere = s;
-                           break;
-                       } else {
-                           if (s == send) {
-                               itemsize--;
-                               chopped = TRUE;
-                           } else
-                               lines++;
+           {
+               const char *s = item = SvPV_const(sv, len);
+               itemsize = len;
+               if ((item_is_utf8 = DO_UTF8(sv)))
+                   itemsize = sv_len_utf8(sv);
+               if (itemsize) {
+                   bool chopped = FALSE;
+                   const char *const send = s + len;
+                   gotsome = TRUE;
+                   chophere = s + itemsize;
+                   while (s < send) {
+                       if (*s++ == '\n') {
+                           if (oneline) {
+                               chopped = TRUE;
+                               chophere = s;
+                               break;
+                           } else {
+                               if (s == send) {
+                                   itemsize--;
+                                   chopped = TRUE;
+                               } else
+                                   lines++;
+                           }
                        }
                    }
+                   SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
+                   if (targ_is_utf8)
+                       SvUTF8_on(PL_formtarget);
+                   if (oneline) {
+                       SvCUR_set(sv, chophere - item);
+                       sv_catsv(PL_formtarget, sv);
+                       SvCUR_set(sv, itemsize);
+                   } else
+                       sv_catsv(PL_formtarget, sv);
+                   if (chopped)
+                       SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) - 1);
+                   SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
+                   t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
+                   if (item_is_utf8)
+                       targ_is_utf8 = TRUE;
                }
-               SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
-               if (targ_is_utf8)
-                   SvUTF8_on(PL_formtarget);
-               if (oneline) {
-                   SvCUR_set(sv, chophere - item);
-                   sv_catsv(PL_formtarget, sv);
-                   SvCUR_set(sv, itemsize);
-               } else
-                   sv_catsv(PL_formtarget, sv);
-               if (chopped)
-                   SvCUR_set(PL_formtarget, SvCUR(PL_formtarget) - 1);
-               SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
-               t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
-               if (item_is_utf8)
-                   targ_is_utf8 = TRUE;
+               break;
            }
-           break;
 
        case FF_0DECIMAL:
            arg = *fpc++;
@@ -850,30 +858,32 @@ PP(pp_formline)
            break;
 
        case FF_MORE:
-           s = chophere;
-           send = item + len;
-           if (chopspace) {
-               while (*s && isSPACE(*s) && s < send)
-                   s++;
-           }
-           if (s < send) {
-               arg = fieldsize - itemsize;
-               if (arg) {
-                   fieldsize -= arg;
-                   while (arg-- > 0)
-                       *t++ = ' ';
+           {
+               const char *s = chophere;
+               const char *send = item + len;
+               if (chopspace) {
+                   while (*s && isSPACE(*s) && s < send)
+                       s++;
                }
-               s = t - 3;
-               if (strnEQ(s,"   ",3)) {
-                   while (s > SvPVX_const(PL_formtarget) && isSPACE(s[-1]))
-                       s--;
+               if (s < send) {
+                   char *s1;
+                   arg = fieldsize - itemsize;
+                   if (arg) {
+                       fieldsize -= arg;
+                       while (arg-- > 0)
+                           *t++ = ' ';
+                   }
+                   s1 = t - 3;
+                   if (strnEQ(s1,"   ",3)) {
+                       while (s1 > SvPVX_const(PL_formtarget) && isSPACE(s1[-1]))
+                           s1--;
+                   }
+                   *s1++ = '.';
+                   *s1++ = '.';
+                   *s1++ = '.';
                }
-               *s++ = '.';
-               *s++ = '.';
-               *s++ = '.';
+               break;
            }
-           break;
-
        case FF_END:
            *t = '\0';
            SvCUR_set(PL_formtarget, t - SvPVX_const(PL_formtarget));
@@ -1137,11 +1147,11 @@ PP(pp_flop)
        }
        else {
            SV *final = sv_mortalcopy(right);
-           STRLEN len, n_a;
+           STRLEN len;
            const char *tmps = SvPV(final, len);
 
            sv = sv_mortalcopy(left);
-           SvPV_force(sv,n_a);
+           SvPV_force_nolen(sv);
            while (!SvNIOKp(sv) && SvCUR(sv) <= len) {
                XPUSHs(sv);
                if (strEQ(SvPVX_const(sv),tmps))
@@ -1384,7 +1394,6 @@ OP *
 Perl_die_where(pTHX_ const char *message, STRLEN msglen)
 {
     dVAR;
-    STRLEN n_a;
 
     if (PL_in_eval) {
        I32 cxix;
@@ -1399,8 +1408,9 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen)
                if (!SvPOK(err))
                    sv_setpvn(err,"",0);
                else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
-                   e = SvPV(err, n_a);
-                   e += n_a - msglen;
+                   STRLEN len;
+                   e = SvPV(err, len);
+                   e += len - msglen;
                    if (*e != *message || strNE(e,message))
                        e = Nullch;
                }
@@ -1456,7 +1466,7 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen)
            PL_curcop = cx->blk_oldcop;
 
            if (optype == OP_REQUIRE) {
-                const char* msg = SvPVx(ERRSV, n_a);
+                const char* msg = SvPVx_nolen_const(ERRSV);
                 SV *nsv = cx->blk_eval.old_namesv;
                 (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
                                &PL_sv_undef, 0);
@@ -1653,8 +1663,8 @@ PP(pp_caller)
     if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
        && CopSTASH_eq(PL_curcop, PL_debstash))
     {
-       AV *ary = cx->blk_sub.argarray;
-        const int off = AvARRAY(ary) - AvALLOC(ary);
+       AV * const ary = cx->blk_sub.argarray;
+       const int off = AvARRAY(ary) - AvALLOC(ary);
 
        if (!PL_dbargs) {
            GV* tmpgv;
@@ -1705,12 +1715,11 @@ PP(pp_reset)
 {
     dSP;
     const char *tmps;
-    STRLEN n_a;
 
     if (MAXARG < 1)
        tmps = "";
     else
-       tmps = POPpx;
+       tmps = POPpconstx;
     sv_reset(tmps, CopSTASH(PL_curcop));
     PUSHs(&PL_sv_yes);
     RETURN;
@@ -1835,10 +1844,9 @@ PP(pp_enteriter)
                cx->blk_loop.itermax = SvIV(right);
            }
            else {
-               STRLEN n_a;
                cx->blk_loop.iterlval = newSVsv(sv);
-               (void) SvPV_force(cx->blk_loop.iterlval,n_a);
-               (void) SvPV(right,n_a);
+               (void) SvPV_force_nolen(cx->blk_loop.iterlval);
+               (void) SvPV_nolen_const(right);
            }
        }
        else if (PL_op->op_private & OPpITER_REVERSED) {
@@ -2256,7 +2264,6 @@ PP(pp_goto)
 
     if (PL_op->op_flags & OPf_STACKED) {
        SV *sv = POPs;
-       STRLEN n_a;
 
        /* This egregious kludge implements goto &subroutine */
        if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
@@ -2466,7 +2473,7 @@ PP(pp_goto)
            }
        }
        else {
-           label = SvPV(sv,n_a);
+           label = SvPV_nolen_const(sv);
            if (!(do_dump || *label))
                DIE(aTHX_ must_have_label);
        }
@@ -2645,8 +2652,7 @@ PP(pp_cswitch)
     if (PL_multiline)
        PL_op = PL_op->op_next;                 /* can't assume anything */
     else {
-       STRLEN n_a;
-       match = *(SvPVx(GvSV(cCOP->cop_gv), n_a)) & 255;
+       match = *(SvPVx_nolen_const(GvSV(cCOP->cop_gv))) & 255;
        match -= cCOP->uop.scop.scop_offset;
        if (match < 0)
            match = 0;
@@ -2930,7 +2936,6 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
        SV **newsp;                     /* Used by POPBLOCK. */
        PERL_CONTEXT *cx = &cxstack[cxstack_ix];
        I32 optype = 0;                 /* Might be reset by POPEVAL. */
-       STRLEN n_a;
 
        PL_op = saveop;
        if (PL_eval_root) {
@@ -2945,7 +2950,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
        lex_end();
        LEAVE;
        if (optype == OP_REQUIRE) {
-           const char* const msg = SvPVx(ERRSV, n_a);
+           const char* const msg = SvPVx_nolen_const(ERRSV);
            const SV * const nsv = cx->blk_eval.old_namesv;
            (void)hv_store(GvHVn(PL_incgv), SvPVX_const(nsv), SvCUR(nsv),
                           &PL_sv_undef, 0);
@@ -2953,7 +2958,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
                *msg ? msg : "Unknown error\n");
        }
        else if (startop) {
-            const char* msg = SvPVx(ERRSV, n_a);
+            const char* msg = SvPVx_nolen_const(ERRSV);
 
            POPBLOCK(cx,PL_curpm);
            POPEVAL(cx);
@@ -2961,7 +2966,7 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
                       (*msg ? msg : "Unknown error\n"));
        }
        else {
-            const char* msg = SvPVx(ERRSV, n_a);
+            const char* msg = SvPVx_nolen_const(ERRSV);
            if (!*msg) {
                sv_setpv(ERRSV, "Compilation error");
            }
@@ -3054,9 +3059,9 @@ PP(pp_require)
     dVAR; dSP;
     register PERL_CONTEXT *cx;
     SV *sv;
-    char *name;
+    const char *name;
     STRLEN len;
-    char *tryname = Nullch;
+    const char *tryname = Nullch;
     SV *namesv = Nullsv;
     SV** svp;
     const I32 gimme = GIMME_V;
@@ -3084,7 +3089,7 @@ PP(pp_require)
 
            RETPUSHYES;
     }
-    name = SvPV(sv, len);
+    name = SvPV_const(sv, len);
     if (!(name && len > 0 && *name))
        DIE(aTHX_ "Null filename used");
     TAINT_PROPER("require");
@@ -3245,8 +3250,7 @@ PP(pp_require)
                        || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
 #endif
                  ) {
-                   STRLEN n_a;
-                   char *dir = SvPVx(dirsv, n_a);
+                   const char *dir = SvPVx_nolen_const(dirsv);
 #ifdef MACOS_TRADITIONAL
                    char buf1[256];
                    char buf2[256];
@@ -3296,7 +3300,7 @@ PP(pp_require)
     SvREFCNT_dec(namesv);
     if (!tryrsfp) {
        if (PL_op->op_type == OP_REQUIRE) {
-           char *msgstr = name;
+           const char *msgstr = name;
            if (namesv) {                       /* did we lookup @INC? */
                SV *msg = sv_2mortal(newSVpv(msgstr,0));
                SV *dirmsgsv = NEWSV(0, 0);
@@ -3309,8 +3313,7 @@ PP(pp_require)
                    sv_catpv(msg, " (did you run h2ph?)");
                sv_catpv(msg, " (@INC contains:");
                for (i = 0; i <= AvFILL(ar); i++) {
-                   STRLEN n_a;
-                   const char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
+                   const char *dir = SvPVx_nolen_const(*av_fetch(ar, i, TRUE));
                    Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
                    sv_catsv(msg, dirmsgsv);
                }
@@ -3406,7 +3409,7 @@ PP(pp_entereval)
     CV* runcv;
     U32 seq;
 
-    if (!SvPV(sv,len))
+    if (!SvPV_const(sv,len))
        RETPUSHUNDEF;
     TAINT_PROPER("eval");