The old COW code needs to use SvPVX_mutable when doing copy-on-write.
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 1611d1f..bcf6291 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -81,7 +81,7 @@ S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
 {
     MGS* mgs;
     assert(SvMAGICAL(sv));
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
     /* Turning READONLY off for a copy-on-write scalar is a bad idea.  */
     if (SvIsCOW(sv))
       sv_force_normal(sv);
@@ -263,11 +263,11 @@ Perl_mg_length(pTHX_ SV *sv)
     }
 
     if (DO_UTF8(sv)) {
-        U8 *s = (U8*)SvPV(sv, len);
+        const U8 *s = (U8*)SvPV_const(sv, len);
         len = Perl_utf8_length(aTHX_ s, s + len);
     }
     else
-        (void)SvPV(sv, len);
+        (void)SvPV_const(sv, len);
     return len;
 }
 
@@ -494,11 +494,12 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
              getlen:
                if (i > 0 && RX_MATCH_UTF8(rx)) {
                    char *s    = rx->subbeg + s1;
-                   char *send = rx->subbeg + t1;
+                   const U8 *ep;
+                   STRLEN el;
 
                     i = t1 - s1;
-                   if (is_utf8_string((U8*)s, i))
-                       i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
+                   if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
+                       i = el;
                }
                if (i < 0)
                    Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
@@ -555,8 +556,7 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
     }
     magic_get(sv,mg);
     if (!SvPOK(sv) && SvNIOK(sv)) {
-       STRLEN n_a;
-       sv_2pv(sv, &n_a);
+       sv_2pv(sv, 0);
     }
     if (SvPOK(sv))
        return SvCUR(sv);
@@ -820,11 +820,9 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
        sv_setsv(sv,&PL_sv_undef);
        break;
     case '.':
-#ifndef lint
        if (GvIO(PL_last_in_gv)) {
            sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
        }
-#endif
        break;
     case '?':
        {
@@ -852,7 +850,6 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
            s = GvENAME(PL_defoutgv);
        sv_setpv(sv,s);
        break;
-#ifndef lint
     case '=':
        if (GvIOp(PL_defoutgv))
            sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
@@ -865,7 +862,6 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
        if (GvIOp(PL_defoutgv))
            sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
        break;
-#endif
     case ':':
        break;
     case '/':
@@ -956,11 +952,11 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
 {
     dVAR;
     register char *s;
-    char *ptr;
+    const char *ptr;
     STRLEN len, klen;
 
     s = SvPV(sv,len);
-    ptr = MgPV(mg,klen);
+    ptr = MgPV_const(mg,klen);
     my_setenv(ptr, s);
 
 #ifdef DYNAMIC_ENV_FETCH
@@ -1031,9 +1027,8 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
 int
 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
 {
-    STRLEN n_a;
     (void)sv;
-    my_setenv(MgPV(mg,n_a),Nullch);
+    my_setenv(MgPV_nolen_const(mg),Nullch);
     return 0;
 }
 
@@ -1111,9 +1106,8 @@ int
 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
 {
     I32 i;
-    STRLEN n_a;
     /* Are we fetching a signal entry? */
-    i = whichsig(MgPV(mg,n_a));
+    i = whichsig(MgPV_nolen_const(mg));
     if (i > 0) {
        if(PL_psig_ptr[i])
            sv_setsv(sv,PL_psig_ptr[i]);
@@ -1144,8 +1138,7 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
      * refactoring might be in order.
      */
     dVAR;
-    STRLEN n_a;
-    register const char *s = MgPV(mg,n_a);
+    register const char *s = MgPV_nolen_const(mg);
     (void)sv;
     if (*s == '_') {
        SV** svp = 0;
@@ -1605,13 +1598,13 @@ Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
    
     if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
         SV *key;
-        if (HvEITER(hv))
+        if (HvEITER_get(hv))
             /* we are in an iteration so the hash cannot be empty */
             return &PL_sv_yes;
         /* no xhv_eiter so now use FIRSTKEY */
         key = sv_newmortal();
         magic_nextpack((SV*)hv, mg, key);
-        HvEITER(hv) = NULL;     /* need to reset iterator */
+        HvEITER_set(hv, NULL);     /* need to reset iterator */
         return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
     }
    
@@ -1637,12 +1630,11 @@ Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
     I32 i;
     GV* gv;
     SV** svp;
-    STRLEN n_a;
 
     gv = PL_DBline;
     i = SvTRUE(sv);
     svp = av_fetch(GvAV(gv),
-                    atoi(MgPV(mg,n_a)), FALSE);
+                    atoi(MgPV_nolen_const(mg)), FALSE);
     if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
        /* set or clear breakpoint in the relevant control op */
        if (i)
@@ -2646,7 +2638,7 @@ restore_magic(pTHX_ const void *p)
 
     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
     {
-#ifdef PERL_COPY_ON_WRITE
+#ifdef PERL_OLD_COPY_ON_WRITE
        /* While magic was saved (and off) sv_setsv may well have seen
           this SV as a prime candidate for COW.  */
        if (SvIsCOW(sv))