Rejig the location of the cache assertion code in Perl_sv_pos_b2u().
[p5sagit/p5-mst-13.2.git] / sv.h
diff --git a/sv.h b/sv.h
index fc49f23..cf2f656 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -214,7 +214,7 @@ perform the upgrade if necessary.  See C<svtype>.
     ({                                 \
        if (sv)                         \
             (SvREFCNT(sv))++;          \
-       sv;                             \
+       (SV *)(sv);                             \
     })
 #  define SvREFCNT_inc_NN(sv)          \
     ({                                 \
@@ -307,8 +307,9 @@ perform the upgrade if necessary.  See C<svtype>.
                                              fact an offset [SvREPADTMP(sv)]
                                           5: On a pad name SV, that slot in the
                                              frame AV is a REFCNT'ed reference
-                                             to a lexical from "outside".
-                                       */
+                                             to a lexical from "outside". */
+#define SVphv_REHASH   SVf_FAKE        /* 6: On a PVHV, hash values are being
+                                             recalculated */
 #define SVf_OOK                0x02000000      /* has valid offset value
                                           For a PVHV this means that a
                                           hv_aux struct is present after the
@@ -334,8 +335,6 @@ perform the upgrade if necessary.  See C<svtype>.
 /* Some private flags. */
 
 /* PVHV */
-#define SVphv_REHASH   0x10000000      /* PVHV is recalculating hash values */
-/* PVHV */
 #define SVphv_SHAREKEYS 0x20000000     /* PVHV
                                           keys live on shared string table */
 /* PVNV, PVMG, PVGV, presumably only inside pads */
@@ -395,6 +394,7 @@ struct xpviv {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
 };
 
@@ -409,6 +409,7 @@ typedef struct {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
 } xpviv_allocated;
 #endif
@@ -426,6 +427,7 @@ struct xpvuv {
        IV      xuvu_iv;
        UV      xuvu_uv;        /* unsigned value or pv offset */
        void *  xuvu_p1;
+       HEK *   xivu_namehek;
     }          xuv_u;
 };
 
@@ -443,6 +445,7 @@ struct xpvnv {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
 };
 
@@ -459,6 +462,7 @@ struct xpvmg {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -479,6 +483,7 @@ struct xpvlv {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;   /* GvNAME */
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -486,10 +491,6 @@ struct xpvlv {
     } xmg_u;
     HV*                xmg_stash;      /* class package */
 
-    /* a full glob fits into this */
-    char*      xgv_name;
-    STRLEN     xgv_namelen;
-
     STRLEN     xlv_targoff;
     STRLEN     xlv_targlen;
     SV*                xlv_targ;
@@ -505,10 +506,11 @@ struct xpvgv {
     STRLEN     xpv_cur;        /* xgv_flags */
     STRLEN     xpv_len;        /* 0 */
     union {
-       IV      xivu_iv;        /* integer value or pv offset */
+       IV      xivu_iv;
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;   /* GvNAME */
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -516,8 +518,6 @@ struct xpvgv {
     } xmg_u;
     HV*                xmg_stash;      /* class package */
 
-    char*      xgv_name;
-    STRLEN     xgv_namelen;
 };
 
 struct xpvbm {
@@ -532,6 +532,7 @@ struct xpvbm {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -560,6 +561,7 @@ struct xpvfm {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -595,6 +597,7 @@ typedef struct {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -634,6 +637,7 @@ struct xpvio {
        UV      xivu_uv;
        void *  xivu_p1;
        I32     xivu_i32;
+       HEK *   xivu_namehek;
     }          xiv_u;
     union {
        MAGIC*  xmg_magic;      /* linked list of magicalness */
@@ -861,11 +865,11 @@ Set the actual length of the string which is in the SV.  See C<SvIV_set>.
 
 #define SvOK(sv)               (SvFLAGS(sv) & SVf_OK)
 #define SvOK_off(sv)           (assert_not_ROK(sv) assert_not_glob(sv) \
-                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+                                SvFLAGS(sv) &= ~(SVf_OK|               \
                                                  SVf_IVisUV|SVf_UTF8), \
                                                        SvOOK_off(sv))
 #define SvOK_off_exc_UV(sv)    (assert_not_ROK(sv)                     \
-                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+                                SvFLAGS(sv) &= ~(SVf_OK|               \
                                                  SVf_UTF8),            \
                                                        SvOOK_off(sv))
 
@@ -934,11 +938,11 @@ in gv.h: */
                                 SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 #define SvPOK_off(sv)          (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
 #define SvPOK_only(sv)         (assert_not_ROK(sv) assert_not_glob(sv) \
-                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+                                SvFLAGS(sv) &= ~(SVf_OK|               \
                                                  SVf_IVisUV|SVf_UTF8), \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 #define SvPOK_only_UTF8(sv)    (assert_not_ROK(sv) assert_not_glob(sv) \
-                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+                                SvFLAGS(sv) &= ~(SVf_OK|               \
                                                  SVf_IVisUV),          \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 
@@ -954,7 +958,7 @@ in gv.h: */
 
 #define SvROK(sv)              (SvFLAGS(sv) & SVf_ROK)
 #define SvROK_on(sv)           (SvFLAGS(sv) |= SVf_ROK)
-#define SvROK_off(sv)          (SvFLAGS(sv) &= ~(SVf_ROK|SVf_AMAGIC))
+#define SvROK_off(sv)          (SvFLAGS(sv) &= ~(SVf_ROK))
 
 #define SvMAGICAL(sv)          (SvFLAGS(sv) & (SVs_GMG|SVs_SMG|SVs_RMG))
 #define SvMAGICAL_on(sv)       (SvFLAGS(sv) |= (SVs_GMG|SVs_SMG|SVs_RMG))
@@ -972,17 +976,24 @@ in gv.h: */
 #define SvRMAGICAL_on(sv)      (SvFLAGS(sv) |= SVs_RMG)
 #define SvRMAGICAL_off(sv)     (SvFLAGS(sv) &= ~SVs_RMG)
 
-#define SvAMAGIC(sv)           (SvFLAGS(sv) & SVf_AMAGIC)
-#define SvAMAGIC_on(sv)                (SvFLAGS(sv) |= SVf_AMAGIC)
-#define SvAMAGIC_off(sv)       (SvFLAGS(sv) &= ~SVf_AMAGIC)
+#define SvAMAGIC(sv)           (SvROK(sv) && (SvFLAGS(SvRV(sv)) & SVf_AMAGIC))
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define SvAMAGIC_on(sv)      ({ SV *kloink = sv;                     \
+                                  assert(SvROK(kloink));               \
+                                  SvFLAGS(SvRV(kloink)) |= SVf_AMAGIC; \
+                               })
+#  define SvAMAGIC_off(sv)     ({ SV *kloink = sv;                     \
+                                  if(SvROK(kloink))                    \
+                                       SvFLAGS(SvRV(kloink)) &= ~SVf_AMAGIC;\
+                               })
+#else
+#  define SvAMAGIC_on(sv)      (SvFLAGS(SvRV(sv)) |= SVf_AMAGIC)
+#  define SvAMAGIC_off(sv) \
+       (SvROK(sv) && (SvFLAGS(SvRV(sv)) &= ~SVf_AMAGIC))
+#endif
 
-#define SvGAMAGIC(sv)           (SvFLAGS(sv) & (SVs_GMG|SVf_AMAGIC))
+#define SvGAMAGIC(sv)           (SvGMAGICAL(sv) || SvAMAGIC(sv))
 
-/*
-#define Gv_AMG(stash) \
-        (HV_AMAGICmb(stash) && \
-         ((!HV_AMAGICbad(stash) && HV_AMAGIC(stash)) || Gv_AMupdate(stash)))
-*/
 #define Gv_AMG(stash)           (PL_amagic_generation && Gv_AMupdate(stash))
 
 #define SvWEAKREF(sv)          ((SvFLAGS(sv) & (SVf_ROK|SVprv_WEAKREF)) \
@@ -1649,7 +1660,7 @@ Like C<sv_catsv> but doesn't process magic.
 
 #define CAN_COW_MASK   (SVs_OBJECT|SVs_GMG|SVs_SMG|SVs_RMG|SVf_IOK|SVf_NOK| \
                         SVf_POK|SVf_ROK|SVp_IOK|SVp_NOK|SVp_POK|SVf_FAKE| \
-                        SVf_OOK|SVf_BREAK|SVf_READONLY|SVf_AMAGIC)
+                        SVf_OOK|SVf_BREAK|SVf_READONLY)
 #define CAN_COW_FLAGS  (SVp_POK|SVf_POK)
 
 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) \