/* sv.h
*
- * Copyright (c) 1991-2002, Larry Wall
+ * Copyright (c) 1991-2003, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
((PL_Sv=(SV*)(sv)), (PL_Sv && ++(SvREFCNT(PL_Sv))), (SV*)PL_Sv)
#endif
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+# define SvREFCNT_dec(sv) \
+ ({ \
+ SV *nsv = (SV*)(sv); \
+ if (nsv) { \
+ if (SvREFCNT(nsv)) { \
+ if (--(SvREFCNT(nsv)) == 0) \
+ Perl_sv_free2(aTHX_ nsv); \
+ } else { \
+ sv_free(nsv); \
+ } \
+ } \
+ })
+#else
#define SvREFCNT_dec(sv) sv_free((SV*)(sv))
+#endif
#define SVTYPEMASK 0xff
#define SvTYPE(sv) ((sv)->sv_flags & SVTYPEMASK)
U8 xbm_rare; /* rarest character in string */
};
-/* This structure much match XPVCV in cv.h */
+/* This structure must match XPVCV in cv.h */
typedef U16 cv_flags_t;
SVp_IOK|SVp_NOK|SVf_IVisUV))
#ifdef __GNUC__
-#define assert_not_ROK(sv) ({assert(!SvROK(sv) || !SvRV(sv))})
+#define assert_not_ROK(sv) ({assert(!SvROK(sv) || !SvRV(sv))}),
#else
-#define assert_not_ROK(sv) 0
+#define assert_not_ROK(sv)
#endif
#define SvOK(sv) (SvFLAGS(sv) & SVf_OK)
-#define SvOK_off(sv) (assert_not_ROK(sv), \
+#define SvOK_off(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
SVf_IVisUV|SVf_UTF8), \
SvOOK_off(sv))
-#define SvOK_off_exc_UV(sv) (assert_not_ROK(sv), \
+#define SvOK_off_exc_UV(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
SVf_UTF8), \
SvOOK_off(sv))
#define SvNOKp(sv) (SvFLAGS(sv) & SVp_NOK)
#define SvNOKp_on(sv) (SvFLAGS(sv) |= SVp_NOK)
#define SvPOKp(sv) (SvFLAGS(sv) & SVp_POK)
-#define SvPOKp_on(sv) (assert_not_ROK(sv), \
+#define SvPOKp_on(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) |= SVp_POK)
#define SvIOK(sv) (SvFLAGS(sv) & SVf_IOK)
#define SvUTF8_off(sv) (SvFLAGS(sv) &= ~(SVf_UTF8))
#define SvPOK(sv) (SvFLAGS(sv) & SVf_POK)
-#define SvPOK_on(sv) (assert_not_ROK(sv), \
+#define SvPOK_on(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) |= (SVf_POK|SVp_POK))
#define SvPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
-#define SvPOK_only(sv) (assert_not_ROK(sv), \
+#define SvPOK_only(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
SVf_IVisUV|SVf_UTF8), \
SvFLAGS(sv) |= (SVf_POK|SVp_POK))
-#define SvPOK_only_UTF8(sv) (assert_not_ROK(sv), \
+#define SvPOK_only_UTF8(sv) (assert_not_ROK(sv) \
SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
SVf_IVisUV), \
SvFLAGS(sv) |= (SVf_POK|SVp_POK))
Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
otherwise.
+=for apidoc Am|bool|SvIsCOW|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
+hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
+COW)
+
+=for apidoc Am|bool|SvIsCOW_shared_hash|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
+scalar.
=cut
*/
# define SvRELEASE_IVX(sv) ((void)((SvFLAGS(sv) & (SVf_OOK|SVf_READONLY|SVf_FAKE)) \
&& Perl_sv_release_IVX(aTHX_ sv)))
# define SvIsCOW_normal(sv) (SvIsCOW(sv) && SvLEN(sv))
+
+#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)
+#define CAN_COW_FLAGS (SVp_POK|SVf_POK)
+
#else
# define SvRELEASE_IVX(sv) ((void)SvOOK_off(sv))
#endif /* PERL_COPY_ON_WRITE */
#define sv_pvn_force(sv, lp) sv_pvn_force_flags(sv, lp, SV_GMAGIC)
#define sv_utf8_upgrade(sv) sv_utf8_upgrade_flags(sv, SV_GMAGIC)
+/* Should be named SvCatPVN_utf8_upgrade? */
+#define sv_catpvn_utf8_upgrade(dsv, sstr, slen, nsv) \
+ STMT_START { \
+ if (!(nsv)) \
+ nsv = sv_2mortal(newSVpvn(sstr, slen)); \
+ else \
+ sv_setpvn(nsv, sstr, slen); \
+ SvUTF8_off(nsv); \
+ sv_utf8_upgrade(nsv); \
+ sv_catsv(dsv, nsv); \
+ } STMT_END
/*
=for apidoc Am|SV*|newRV_inc|SV* sv
#define SvSetMagicSV_nosteal(dst,src) \
SvSetSV_nosteal_and(dst,src,SvSETMAGIC(dst))
+
#if !defined(SKIP_DEBUGGING)
#define SvPEEK(sv) sv_peek(sv)
#else