Chip noticed that the intended optionality of the 'IV' was
[p5sagit/p5-mst-13.2.git] / pad.c
diff --git a/pad.c b/pad.c
index 560638f..2d716be 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -111,7 +111,7 @@ can be OR'ed together:
 */
 
 PADLIST *
-Perl_pad_new(pTHX_ padnew_flags flags)
+Perl_pad_new(pTHX_ int flags)
 {
     AV *padlist, *padname, *pad, *a0;
 
@@ -378,9 +378,7 @@ Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype)
     if (PL_pad_reset_pending)
        pad_reset();
     if (tmptype & SVs_PADMY) {
-       do {
-           sv = *av_fetch(PL_comppad, AvFILLp(PL_comppad) + 1, TRUE);
-       } while (SvPADBUSY(sv));                /* need a fresh one */
+       sv = *av_fetch(PL_comppad, AvFILLp(PL_comppad) + 1, TRUE);
        retval = AvFILLp(PL_comppad);
     }
     else {
@@ -554,13 +552,8 @@ Perl_pad_findmy(pTHX_ char *name)
            continue;
        }
        else {
-           if (
-                  (   seq >  (U32)I_32(SvNVX(sv))      /* min */
-                   && seq <= (U32)SvIVX(sv))           /* max */
-               ||
-                   /* 'our' is visible before introduction */
-                   (!SvIVX(sv) && (SvFLAGS(sv) & SVpad_OUR))
-           )
+           if (   seq >  (U32)I_32(SvNVX(sv))  /* min */
+               && seq <= (U32)SvIVX(sv))       /* max */
                return off;
        }
     }
@@ -916,7 +909,7 @@ Perl_pad_leavemy(pTHX)
            if ((sv = svp[off]) && sv != &PL_sv_undef
                    && !SvFAKE(sv) && ckWARN_d(WARN_INTERNAL))
                Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
-                                       "%s never introduced", SvPVX(sv));
+                                       "%"SVf" never introduced", sv);
        }
     }
     /* "Deintroduce" my variables that are leaving with this scope. */
@@ -1120,13 +1113,15 @@ Perl_pad_free(pTHX_ PADOFFSET po)
     if (PL_curpad[po] && PL_curpad[po] != &PL_sv_undef) {
        SvPADTMP_off(PL_curpad[po]);
 #ifdef USE_ITHREADS
+       /* SV could be a shared hash key (eg bugid #19022) */
+       if (
 #ifdef PERL_COPY_ON_WRITE
-       if (SvIsCOW(PL_curpad[po])) {
-           sv_force_normal_flags(PL_curpad[po], SV_COW_DROP_PV);
-       } else
+           !SvIsCOW(PL_curpad[po])
+#else
+           !SvFAKE(PL_curpad[po])
 #endif
+           )
            SvREADONLY_off(PL_curpad[po]);      /* could be a freed constant */
-
 #endif
     }
     if ((I32)po < PL_padix)
@@ -1342,8 +1337,7 @@ S_cv_clone2(pTHX_ CV *proto, CV *outside)
                    sv = (SV*)newHV();
                else
                    sv = NEWSV(0, 0);
-               if (!SvPADBUSY(sv))
-                   SvPADMY_on(sv);
+               SvPADMY_on(sv);
                PL_curpad[ix] = sv;
            }
        }