To: perl5-porters@perl.com
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 360e304..9547da8 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -326,8 +326,13 @@ magic_regdata_cnt(SV *sv, MAGIC *mg)
     register REGEXP *rx;
     char *t;
 
-    if (PL_curpm && (rx = PL_curpm->op_pmregexp))
-       return rx->lastparen;
+    if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
+       if (mg->mg_obj)         /* @+ */
+           return rx->nparens;
+       else                    /* @- */
+           return rx->lastparen;
+    }
+    
     return (U32)-1;
 }
 
@@ -350,9 +355,9 @@ magic_regdatum_get(SV *sv, MAGIC *mg)
            (t = rx->endp[paren]))
            {
                if (mg->mg_obj)         /* @+ */
-                   i = t - rx->subbase;
+                   i = t - rx->subbeg;
                else                    /* @- */
-                   i = s - rx->subbase;
+                   i = s - rx->subbeg;
                sv_setiv(sv,i);
            }
     }
@@ -416,8 +421,10 @@ magic_len(SV *sv, MAGIC *mg)
        return (STRLEN)PL_orslen;
     }
     magic_get(sv,mg);
-    if (!SvPOK(sv) && SvNIOK(sv))
-       sv_2pv(sv, &PL_na);
+    if (!SvPOK(sv) && SvNIOK(sv)) {
+       STRLEN n_a;
+       sv_2pv(sv, &n_a);
+    }
     if (SvPOK(sv))
        return SvCUR(sv);
     return 0;
@@ -840,7 +847,8 @@ magic_setenv(SV *sv, MAGIC *mg)
 int
 magic_clearenv(SV *sv, MAGIC *mg)
 {
-    my_setenv(MgPV(mg,PL_na),Nullch);
+    STRLEN n_a;
+    my_setenv(MgPV(mg,n_a),Nullch);
     return 0;
 }
 
@@ -853,12 +861,13 @@ magic_set_all_env(SV *sv, MAGIC *mg)
     dTHR;
     if (PL_localizing) {
        HE* entry;
+       STRLEN n_a;
        magic_clear_all_env(sv,mg);
        hv_iterinit((HV*)sv);
        while (entry = hv_iternext((HV*)sv)) {
            I32 keylen;
            my_setenv(hv_iterkey(entry, &keylen),
-                     SvPV(hv_iterval((HV*)sv, entry), PL_na));
+                     SvPV(hv_iterval((HV*)sv, entry), n_a));
        }
     }
 #endif
@@ -906,8 +915,9 @@ int
 magic_getsig(SV *sv, MAGIC *mg)
 {
     I32 i;
+    STRLEN n_a;
     /* Are we fetching a signal entry? */
-    i = whichsig(MgPV(mg,PL_na));
+    i = whichsig(MgPV(mg,n_a));
     if (i) {
        if(PL_psig_ptr[i])
            sv_setsv(sv,PL_psig_ptr[i]);
@@ -929,8 +939,9 @@ int
 magic_clearsig(SV *sv, MAGIC *mg)
 {
     I32 i;
+    STRLEN n_a;
     /* Are we clearing a signal entry? */
-    i = whichsig(MgPV(mg,PL_na));
+    i = whichsig(MgPV(mg,n_a));
     if (i) {
        if(PL_psig_ptr[i]) {
            SvREFCNT_dec(PL_psig_ptr[i]);
@@ -1218,11 +1229,12 @@ magic_setdbline(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,PL_na)), FALSE);
+                    atoi(MgPV(mg,n_a)), FALSE);
     if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
        o->op_private = i;
     else
@@ -1339,10 +1351,11 @@ magic_setglob(SV *sv, MAGIC *mg)
 {
     register char *s;
     GV* gv;
+    STRLEN n_a;
 
     if (!SvOK(sv))
        return 0;
-    s = SvPV(sv, PL_na);
+    s = SvPV(sv, n_a);
     if (*s == '*' && s[1])
        s++;
     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
@@ -1542,6 +1555,7 @@ vivify_defelem(SV *sv)
        return;
     if (mg->mg_obj) {
        SV *ahv = LvTARG(sv);
+       STRLEN n_a;
        if (SvTYPE(ahv) == SVt_PVHV) {
            HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
            if (he)
@@ -1553,7 +1567,7 @@ vivify_defelem(SV *sv)
                value = *svp;
        }
        if (!value || value == &PL_sv_undef)
-           croak(PL_no_helem, SvPV(mg->mg_obj, PL_na));
+           croak(PL_no_helem, SvPV(mg->mg_obj, n_a));
     }
     else {
        AV* av = (AV*)LvTARG(sv);
@@ -1690,7 +1704,7 @@ magic_set(SV *sv, MAGIC *mg)
        if (PL_inplace)
            Safefree(PL_inplace);
        if (SvOK(sv))
-           PL_inplace = savepv(SvPV(sv,PL_na));
+           PL_inplace = savepv(SvPV(sv,len));
        else
            PL_inplace = Nullch;
        break;
@@ -1698,7 +1712,7 @@ magic_set(SV *sv, MAGIC *mg)
        if (PL_osname)
            Safefree(PL_osname);
        if (SvOK(sv))
-           PL_osname = savepv(SvPV(sv,PL_na));
+           PL_osname = savepv(SvPV(sv,len));
        else
            PL_osname = Nullch;
        break;
@@ -1728,12 +1742,12 @@ magic_set(SV *sv, MAGIC *mg)
        break;
     case '^':
        Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
-       IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na));
+       IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
        IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
        break;
     case '~':
        Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
-       IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,PL_na));
+       IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
        IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
        break;
     case '=':
@@ -1790,7 +1804,7 @@ magic_set(SV *sv, MAGIC *mg)
     case '#':
        if (PL_ofmt)
            Safefree(PL_ofmt);
-       PL_ofmt = savepv(SvPV(sv,PL_na));
+       PL_ofmt = savepv(SvPV(sv,len));
        break;
     case '[':
        PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
@@ -1898,7 +1912,7 @@ magic_set(SV *sv, MAGIC *mg)
     case ')':
 #ifdef HAS_SETGROUPS
        {
-           char *p = SvPV(sv, PL_na);
+           char *p = SvPV(sv, len);
            Groups_t gary[NGROUPS];
 
            SET_NUMERIC_STANDARD();
@@ -1946,7 +1960,7 @@ magic_set(SV *sv, MAGIC *mg)
        PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
        break;
     case ':':
-       PL_chopset = SvPV_force(sv,PL_na);
+       PL_chopset = SvPV_force(sv,len);
        break;
     case '0':
        if (!PL_origalen) {