This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate change #18420 from maint-5.8:
[perl5.git] / sv.h
diff --git a/sv.h b/sv.h
index da8c275..7c5e6dc 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -125,34 +125,10 @@ perform the upgrade if necessary.  See C<svtype>.
 #define SvFLAGS(sv)    (sv)->sv_flags
 #define SvREFCNT(sv)   (sv)->sv_refcnt
 
-#ifdef USE_5005THREADS
-
-#  if defined(VMS)
-#    define ATOMIC_INC(count) __ATOMIC_INCREMENT_LONG(&count)
-#    define ATOMIC_DEC_AND_TEST(res,count) res=(1==__ATOMIC_DECREMENT_LONG(&count))
- #  else
-#    ifdef EMULATE_ATOMIC_REFCOUNTS
- #      define ATOMIC_INC(count) STMT_START {  \
-         MUTEX_LOCK(&PL_svref_mutex);          \
-         ++count;                              \
-         MUTEX_UNLOCK(&PL_svref_mutex);                \
-       } STMT_END
-#      define ATOMIC_DEC_AND_TEST(res,count) STMT_START {      \
-         MUTEX_LOCK(&PL_svref_mutex);                  \
-         res = (--count == 0);                         \
-         MUTEX_UNLOCK(&PL_svref_mutex);                        \
-       } STMT_END
-#    else
-#      define ATOMIC_INC(count) atomic_inc(&count)
-#      define ATOMIC_DEC_AND_TEST(res,count) (res = atomic_dec_and_test(&count))
-#    endif /* EMULATE_ATOMIC_REFCOUNTS */
-#  endif /* VMS */
-#else
-#  define ATOMIC_INC(count) (++count)
-#  define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))
-#endif /* USE_5005THREADS */
+#define ATOMIC_INC(count) (++count)
+#define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))
 
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
 #  define SvREFCNT_inc(sv)             \
     ({                                 \
        SV *nsv = (SV*)(sv);            \
@@ -161,17 +137,8 @@ perform the upgrade if necessary.  See C<svtype>.
        nsv;                            \
     })
 #else
-#  ifdef USE_5005THREADS
-#    if defined(VMS) && defined(__ALPHA)
-#      define SvREFCNT_inc(sv) \
-          (PL_Sv=(SV*)(sv), (PL_Sv && __ATOMIC_INCREMENT_LONG(&(SvREFCNT(PL_Sv)))), (SV *)PL_Sv)
-#    else
-#      define SvREFCNT_inc(sv) sv_newref((SV*)sv)
-#    endif
-#  else
-#    define SvREFCNT_inc(sv)   \
+#  define SvREFCNT_inc(sv)     \
        ((PL_Sv=(SV*)(sv)), (PL_Sv && ATOMIC_INC(SvREFCNT(PL_Sv))), (SV*)PL_Sv)
-#  endif
 #endif
 
 #define SvREFCNT_dec(sv)       sv_free((SV*)(sv))
@@ -181,7 +148,7 @@ perform the upgrade if necessary.  See C<svtype>.
 
 #define SvUPGRADE(sv, mt) (SvTYPE(sv) >= mt || sv_upgrade(sv, mt))
 
-#define SVs_PADBUSY    0x00000100      /* reserved for tmp or my already */
+#define SVs_PADSTALE   0x00000100      /* lexical has gone out of scope */
 #define SVs_PADTMP     0x00000200      /* in use as tmp */
 #define SVs_PADMY      0x00000400      /* in use a "my" variable */
 #define SVs_TEMP       0x00000800      /* string is stealable? */
@@ -207,7 +174,7 @@ perform the upgrade if necessary.  See C<svtype>.
 #define SVp_POK                0x04000000      /* has valid non-public pointer value */
 #define SVp_SCREAM     0x08000000      /* has been studied? */
 
-#define SVf_UTF8        0x20000000      /* SvPVX is UTF-8 encoded */
+#define SVf_UTF8        0x20000000      /* SvPV is UTF-8 encoded */
 
 #define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE)
 
@@ -216,7 +183,7 @@ perform the upgrade if necessary.  See C<svtype>.
 
 #define SVf_AMAGIC     0x10000000      /* has magical overloaded methods */
 
-#define PRIVSHIFT 8
+#define PRIVSHIFT 8    /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */
 
 /* Some private flags. */
 
@@ -350,12 +317,10 @@ struct xpvfm {
     long       xcv_depth;      /* >= 2 indicates recursive call */
     AV *       xcv_padlist;
     CV *       xcv_outside;
-#ifdef USE_5005THREADS
-    perl_mutex *xcv_mutexp;    /* protects xcv_owner */
-    struct perl_thread *xcv_owner;     /* current owner thread */
-#endif /* USE_5005THREADS */
     cv_flags_t xcv_flags;
-
+    U32                xcv_outside_seq; /* the COP sequence (at the point of our
+                                 * compilation) in the lexically enclosing
+                                 * sub */
     IV         xfm_lines;
 };
 
@@ -487,6 +452,9 @@ Unsets the PV status of an SV.
 Tells an SV that it is a string and disables all other OK bits.
 Will also turn off the UTF8 status.
 
+=for apidoc Am|bool|SvVOK|SV* sv
+Returns a boolean indicating whether the SV contains a v-string.
+
 =for apidoc Am|bool|SvOOK|SV* sv
 Returns a boolean indicating whether the SvIVX is a valid offset value for
 the SvPVX.  This hack is used internally to speed up removal of characters
@@ -620,6 +588,7 @@ and leaves the UTF8 status as it was.
                                                  SVf_IVisUV),          \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 
+#define SvVOK(sv)              (SvMAGICAL(sv) && mg_find(sv,'V'))
 #define SvOOK(sv)              (SvFLAGS(sv) & SVf_OOK)
 #define SvOOK_on(sv)           ((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
 #define SvOOK_off(sv)          (SvOOK(sv) && sv_backoff(sv))
@@ -668,14 +637,16 @@ and leaves the UTF8 status as it was.
 
 #define SvTHINKFIRST(sv)       (SvFLAGS(sv) & SVf_THINKFIRST)
 
-#define SvPADBUSY(sv)          (SvFLAGS(sv) & SVs_PADBUSY)
+#define SvPADSTALE(sv)         (SvFLAGS(sv) & SVs_PADSTALE)
+#define SvPADSTALE_on(sv)      (SvFLAGS(sv) |= SVs_PADSTALE)
+#define SvPADSTALE_off(sv)     (SvFLAGS(sv) &= ~SVs_PADSTALE)
 
 #define SvPADTMP(sv)           (SvFLAGS(sv) & SVs_PADTMP)
-#define SvPADTMP_on(sv)                (SvFLAGS(sv) |= SVs_PADTMP|SVs_PADBUSY)
+#define SvPADTMP_on(sv)                (SvFLAGS(sv) |= SVs_PADTMP)
 #define SvPADTMP_off(sv)       (SvFLAGS(sv) &= ~SVs_PADTMP)
 
 #define SvPADMY(sv)            (SvFLAGS(sv) & SVs_PADMY)
-#define SvPADMY_on(sv)         (SvFLAGS(sv) |= SVs_PADMY|SVs_PADBUSY)
+#define SvPADMY_on(sv)         (SvFLAGS(sv) |= SVs_PADMY)
 
 #define SvTEMP(sv)             (SvFLAGS(sv) & SVs_TEMP)
 #define SvTEMP_on(sv)          (SvFLAGS(sv) |= SVs_TEMP)
@@ -996,7 +967,7 @@ otherwise.
 #define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp)
 #define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp)
 
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
 
 #  define SvIVx(sv) ({SV *nsv = (SV*)(sv); SvIV(nsv); })
 #  define SvUVx(sv) ({SV *nsv = (SV*)(sv); SvUV(nsv); })
@@ -1024,28 +995,16 @@ otherwise.
 
 #else /* __GNUC__ */
 
-#  ifdef USE_5005THREADS
-#    define SvIVx(sv) sv_iv(sv)
-#    define SvUVx(sv) sv_uv(sv)
-#    define SvNVx(sv) sv_nv(sv)
-#    define SvPVx(sv, lp) sv_pvn(sv, &lp)
-#    define SvPVutf8x(sv, lp) sv_pvutf8n(sv, &lp)
-#    define SvPVbytex(sv, lp) sv_pvbyten(sv, &lp)
-#    define SvTRUE(sv) SvTRUEx(sv)
-#    define SvTRUEx(sv) sv_true(sv)
-
-#  else /* USE_5005THREADS */
-
 /* These inlined macros use globals, which will require a thread
  * declaration in user code, so we avoid them under threads */
 
-#    define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
-#    define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
-#    define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
-#    define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp))
-#    define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp))
-#    define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp))
-#    define SvTRUE(sv) (                                               \
+#  define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
+#  define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+#  define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
+#  define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp))
+#  define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp))
+#  define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp))
+#  define SvTRUE(sv) (                                         \
     !sv                                                                \
     ? 0                                                                \
     :    SvPOK(sv)                                             \
@@ -1060,8 +1019,7 @@ otherwise.
            :   SvNOK(sv)                                       \
                ? SvNVX(sv) != 0.0                              \
                : sv_2bool(sv) )
-#    define SvTRUEx(sv) ((PL_Sv = (sv)), SvTRUE(PL_Sv))
-#  endif /* USE_5005THREADS */
+#  define SvTRUEx(sv) ((PL_Sv = (sv)), SvTRUE(PL_Sv))
 #endif /* __GNU__ */
 
 #define SvIsCOW(sv)            ((SvFLAGS(sv) & (SVf_FAKE | SVf_READONLY)) == \
@@ -1228,6 +1186,7 @@ Returns a pointer to the character buffer.
 #define CLONEf_COPY_STACKS 1
 #define CLONEf_KEEP_PTR_TABLE 2
 #define CLONEf_CLONE_HOST 4
+#define CLONEf_JOIN_IN 8
 
 struct clone_params {
   AV* stashes;