Fix worrying typo in handy.h :-s
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 9dfcd53..b126ec4 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -1913,7 +1913,7 @@ int
 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
 {
     PERL_UNUSED_ARG(sv);
-    TAINT_IF(mg->mg_len & 1);
+    TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1));
     return 0;
 }
 
@@ -1921,10 +1921,13 @@ int
 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
 {
     PERL_UNUSED_ARG(sv);
-    if (PL_tainted)
-       mg->mg_len |= 1;
-    else
-       mg->mg_len &= ~1;
+    /* update taint status unless we're restoring at scope exit */
+    if (PL_localizing != 2) {
+       if (PL_tainted)
+           mg->mg_len |= 1;
+       else
+           mg->mg_len &= ~1;
+    }
     return 0;
 }
 
@@ -2034,22 +2037,37 @@ Perl_vivify_defelem(pTHX_ SV *sv)
 int
 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
 {
-    AV * const av = (AV*)mg->mg_obj;
-    SV ** const svp = AvARRAY(av);
-    I32 i = AvFILLp(av);
+    AV *const av = (AV*)mg->mg_obj;
+    SV **svp = AvARRAY(av);
     PERL_UNUSED_ARG(sv);
 
-    while (i >= 0) {
-       if (svp[i]) {
-           if (!SvWEAKREF(svp[i]))
-               Perl_croak(aTHX_ "panic: magic_killbackrefs");
-           /* XXX Should we check that it hasn't changed? */
-           SvRV_set(svp[i], 0);
-           SvOK_off(svp[i]);
-           SvWEAKREF_off(svp[i]);
-           svp[i] = Nullsv;
+    if (svp) {
+       SV *const *const last = svp + AvFILLp(av);
+
+       while (svp <= last) {
+           if (*svp) {
+               SV *const referrer = *svp;
+               if (SvWEAKREF(referrer)) {
+                   /* XXX Should we check that it hasn't changed? */
+                   SvRV_set(referrer, 0);
+                   SvOK_off(referrer);
+                   SvWEAKREF_off(referrer);
+               } else if (SvTYPE(referrer) == SVt_PVGV ||
+                          SvTYPE(referrer) == SVt_PVLV) {
+                   /* You lookin' at me?  */
+                   assert(GvSTASH(referrer));
+                   assert(GvSTASH(referrer) == (HV*)sv);
+                   GvSTASH(referrer) = 0;
+               } else {
+                   Perl_croak(aTHX_
+                              "panic: magic_killbackrefs (flags=%"UVxf")",
+                              SvFLAGS(referrer));
+               }
+
+               *svp = Nullsv;
+           }
+           svp++;
        }
-       i--;
     }
     SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
     return 0;
@@ -2200,19 +2218,13 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
        PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
        break;
     case '\011':       /* ^I */ /* NOT \t in EBCDIC */
-       if (PL_inplace)
-           Safefree(PL_inplace);
-       if (SvOK(sv))
-           PL_inplace = savesvpv(sv);
-       else
-           PL_inplace = Nullch;
+       Safefree(PL_inplace);
+       PL_inplace = SvOK(sv) ? savesvpv(sv) : Nullch;
        break;
     case '\017':       /* ^O */
        if (*(mg->mg_ptr+1) == '\0') {
-           if (PL_osname) {
-               Safefree(PL_osname);
-               PL_osname = Nullch;
-           }
+           Safefree(PL_osname);
+           PL_osname = Nullch;
            if (SvOK(sv)) {
                TAINT_PROPER("assigning to $^O");
                PL_osname = savesvpv(sv);