This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The miniperl skip in utf8cache.t was wrong.
[perl5.git] / sv.h
diff --git a/sv.h b/sv.h
index 7479624..6c77cce 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -176,6 +176,9 @@ typedef enum {
 #if defined(PERL_IN_HV_C) || defined(PERL_IN_XS_APITEST)
 #define HE_SVSLOT      SVt_NULL
 #endif
+#ifdef PERL_IN_SV_C
+#  define SVt_FIRST SVt_NULL   /* the type of SV that new_SV() in sv.c returns */
+#endif
 
 #define PERL_ARENA_ROOTS_SIZE  (SVt_LAST)
 
@@ -191,11 +194,18 @@ typedef struct hek HEK;
     U32                sv_refcnt;      /* how many references to us */ \
     U32                sv_flags        /* what we are */
 
+#if NVSIZE <= IVSIZE
+#  define _NV_BODYLESS_UNION NV svu_nv;
+#else
+#  define _NV_BODYLESS_UNION
+#endif
+
 #define _SV_HEAD_UNION \
     union {                            \
        char*   svu_pv;         /* pointer to malloced string */        \
        IV      svu_iv;                 \
        UV      svu_uv;                 \
+       _NV_BODYLESS_UNION              \
        SV*     svu_rv;         /* pointer to another SV */             \
        struct regexp* svu_rx;          \
        SV**    svu_array;              \
@@ -363,14 +373,14 @@ 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  /* string is stealable? */
+#define SVs_TEMP       0x00080000  /* mortal (implies string is stealable) */
 #define SVs_OBJECT     0x00100000  /* is "blessed" */
+#define SVpad_LVALUE   0x00100000  /* pad name is used as lvalue */
 #define SVs_GMG                0x00200000  /* has magical get method */
 #define SVs_SMG                0x00400000  /* has magical set method */
 #define SVs_RMG                0x00800000  /* has random magical methods */
@@ -382,7 +392,9 @@ perform the upgrade if necessary.  See C<svtype>.
                                          [CvEVAL(cv), CvSPECIAL(cv)]
                                       3: 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".
+                                       4: HV: informally reserved by DAPM
+                                          for vtables */
 #define SVf_OOK                0x02000000  /* has valid offset value. For a PVHV this
                                       means that a hv_aux struct is present
                                       after the main array */
@@ -581,7 +593,10 @@ typedef U32 cv_flags_t;
        HEK *   xcv_hek;                                                \
     }          xcv_gv_u;                                               \
     char *     xcv_file;                                                       \
-    PADLIST *  xcv_padlist;                                                    \
+    union {                                                                    \
+       PADLIST *       xcv_padlist;                                            \
+       void *          xcv_hscxt;                                              \
+    }          xcv_padlist_u;                                                  \
     CV *       xcv_outside;                                                    \
     U32                xcv_outside_seq; /* the COP sequence (at the point of our       \
                                  * compilation) in the lexically enclosing     \
@@ -1049,17 +1064,17 @@ 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)
-
-/* SVs_PADTMP and SVs_PADSTALE share the same bit, mediated by SVs_PADMY */
+#define SVs_PADMY              0
+#define SvPADMY(sv)            !(SvFLAGS(sv) & SVs_PADTMP)
+#ifndef PERL_CORE
+# define SvPADMY_on(sv)                SvPADTMP_off(sv)
+#endif
 
-#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))
+#define SvPADTMP_on(sv)                (SvFLAGS(sv) |= SVs_PADTMP)
+#define SvPADTMP_off(sv)       (SvFLAGS(sv) &= ~SVs_PADTMP)
 #define SvPADSTALE_on(sv)      S_SvPADSTALE_on(MUTABLE_SV(sv))
 #define SvPADSTALE_off(sv)     S_SvPADSTALE_off(MUTABLE_SV(sv))
 
@@ -1129,6 +1144,7 @@ sv_force_normal does nothing.
 #define SvTAIL_on(sv)          (SvFLAGS(sv) |= SVpbm_TAIL)
 #define SvTAIL_off(sv)         (SvFLAGS(sv) &= ~SVpbm_TAIL)
 
+#define SvPAD_NAME(sv) ((SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME)
 
 #define SvPAD_TYPED(sv) \
        ((SvFLAGS(sv) & (SVpad_NAME|SVpad_TYPED)) == (SVpad_NAME|SVpad_TYPED))
@@ -1860,12 +1876,8 @@ Like sv_utf8_upgrade, but doesn't do magic on C<sv>.
 /* if (after resolving magic etc), the SV is found to be overloaded,
  * don't call the overload magic, just return as-is */
 #define SV_SKIP_OVERLOAD       8192
-/* It is not yet clear whether we want this as an API, or what the
- * constants should be named. */
-#ifdef PERL_CORE
-# define SV_CATBYTES           16384
-# define SV_CATUTF8            32768
-#endif
+#define SV_CATBYTES            16384
+#define SV_CATUTF8             32768
 
 /* The core is safe for this COW optimisation. XS code on CPAN may not be.
    So only default to doing the COW setup if we're in the core.