This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop setting PADMY; renumber PADSTALE
authorFather Chrysostomos <sprout@cpan.org>
Tue, 23 Sep 2014 03:25:29 +0000 (20:25 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 25 Sep 2014 05:05:32 +0000 (22:05 -0700)
The PADMY flag was originally used on values stored in pads as a way
to mark those slots ase being in use already during pad allocation.
That changed for the most part all the way back in bbce6d6978
(perl5.003_09), but vestiges still remained, because some ops used
PADMY for their targets.  I removed the last one yesterday in
14d91147.  So the PADMY flag now serves no purpose.

At run time, the sole purpose of PADMY is to determine the meaning of
the flag bit shared by PADTMP and PADSTALE.  If PADMY is set, the flag
means the latter.  Instead of that more complicated check, we can just
renumber PADSTALE to use the PADMY bit and assume that anything not
PADTMP is PADMY.

This commit changes the flags and does just enough to get
tests passing (except Peek.t).

fixup for padmy flag renumbering

inline.h
pad.c
scope.c
sv.h

index ad6edf2..873055d 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -170,13 +170,13 @@ S_SvPADTMP_off(SV *sv)
 PERL_STATIC_INLINE U32
 S_SvPADSTALE_on(SV *sv)
 {
-    assert(SvFLAGS(sv) & SVs_PADMY);
+    assert(!(SvFLAGS(sv) & SVs_PADTMP));
     return SvFLAGS(sv) |= SVs_PADSTALE;
 }
 PERL_STATIC_INLINE U32
 S_SvPADSTALE_off(SV *sv)
 {
-    assert(SvFLAGS(sv) & SVs_PADMY);
+    assert(!(SvFLAGS(sv) & SVs_PADTMP));
     return SvFLAGS(sv) &= ~SVs_PADSTALE;
 }
 #if defined(PERL_CORE) || defined (PERL_EXT)
diff --git a/pad.c b/pad.c
index cda443b..8cb4604 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -738,7 +738,7 @@ Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype)
                   AvARRAY(PL_comppad), PL_curpad);
     if (PL_pad_reset_pending)
        pad_reset();
-    if (tmptype & SVs_PADMY) {
+    if (tmptype == SVs_PADMY) { /* Not & because this ‘flag’ is 0.  */
        /* For a my, simply push a null SV onto the end of PL_comppad. */
        sv = *av_fetch(PL_comppad, AvFILLp(PL_comppad) + 1, TRUE);
        retval = AvFILLp(PL_comppad);
diff --git a/scope.c b/scope.c
index 5eb9ddb..c3f32d2 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -1052,7 +1052,6 @@ Perl_leave_scope(pTHX_ I32 base)
                     SvPADSTALE_on(sv); /* mark as no longer live */
                 }
                 else { /* Someone has a claim on this, so abandon it. */
-                    assert(  SvFLAGS(sv) & SVs_PADMY);
                     assert(!(SvFLAGS(sv) & SVs_PADTMP));
                     switch (SvTYPE(sv)) {      /* Console ourselves with a new value */
                     case SVt_PVAV:     *svp = MUTABLE_SV(newAV());     break;
diff --git a/sv.h b/sv.h
index 8876449..4b6bace 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -363,11 +363,10 @@ perform the upgrade if necessary.  See C<svtype>.
                                       expanded to a real GV */
 #define SVpad_NAMELIST SVp_SCREAM  /* AV is a padnamelist */
 #define SVf_PROTECT    0x00010000  /* very read-only */
-#define SVs_PADTMP     0x00020000  /* in use as tmp; only if ! SVs_PADMY */
-#define SVs_PADSTALE   0x00020000  /* lexical has gone out of scope;
-                                       only valid for SVs_PADMY */
+#define SVs_PADTMP     0x00020000  /* in use as tmp */
 #define SVpad_TYPED    0x00020000  /* pad name is a Typed Lexical */
-#define SVs_PADMY      0x00040000  /* in use a "my" variable */
+#define SVs_PADSTALE   0x00040000  /* lexical has gone out of scope;
+                                       only used when !PADTMP */
 #define SVpad_OUR      0x00040000  /* pad name is "our" instead of "my" */
 #define SVs_TEMP       0x00080000  /* mortal (implies string is stealable) */
 #define SVs_OBJECT     0x00100000  /* is "blessed" */
@@ -1051,14 +1050,12 @@ sv_force_normal does nothing.
 
 #define SvTHINKFIRST(sv)       (SvFLAGS(sv) & SVf_THINKFIRST)
 
-#define SvPADMY(sv)            (SvFLAGS(sv) & SVs_PADMY)
-#define SvPADMY_on(sv)         (SvFLAGS(sv) |= SVs_PADMY)
+#define SVs_PADMY              0
+#define SvPADMY(sv)            !(SvFLAGS(sv) & SVs_PADTMP)
+#define SvPADMY_on(sv)         SvPADTMP_off(sv)
 
-/* SVs_PADTMP and SVs_PADSTALE share the same bit, mediated by SVs_PADMY */
-
-#define SvPADTMP(sv)   ((SvFLAGS(sv) & (SVs_PADMY|SVs_PADTMP)) == SVs_PADTMP)
-#define SvPADSTALE(sv) ((SvFLAGS(sv) & (SVs_PADMY|SVs_PADSTALE)) \
-                                   == (SVs_PADMY|SVs_PADSTALE))
+#define SvPADTMP(sv)           (SvFLAGS(sv) & (SVs_PADTMP))
+#define SvPADSTALE(sv)         (SvFLAGS(sv) & (SVs_PADSTALE))
 
 #define SvPADTMP_on(sv)                S_SvPADTMP_on(MUTABLE_SV(sv))
 #define SvPADTMP_off(sv)       S_SvPADTMP_off(MUTABLE_SV(sv))