/* sv.h
*
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- * 2000, 2001, 2002, 2003, 2004, by Larry Wall and others
+ * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
void* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv; /* pointer to another SV */
+ char* svu_pv; /* pointer to malloced string */
+ SV** svu_array;
+ } sv_u;
+#ifdef DEBUG_LEAKING_SCALARS
+ unsigned sv_debug_optype:9; /* the type of OP that allocated us */
+ unsigned sv_debug_inpad:1; /* was allocated in a pad for an OP */
+ unsigned sv_debug_cloned:1; /* was cloned for an ithread */
+ unsigned sv_debug_line:16; /* the line where we were allocated */
+ char * sv_debug_file; /* the file where we were allocated */
+#endif
};
struct gv {
XPVGV* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
+ } sv_u;
};
struct cv {
XPVCV* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
+ } sv_u;
};
struct av {
XPVAV* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv; /* pointer to first array element */
+ SV** svu_array;
+ } sv_u;
};
struct hv {
XPVHV* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
+ } sv_u;
};
struct io {
XPVIO* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
+ union {
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
+ } sv_u;
};
/*
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
# define SvREFCNT_inc(sv) \
({ \
- SV *_sv = (SV*)(sv); \
+ SV * const _sv = (SV*)(sv); \
if (_sv) \
(SvREFCNT(_sv))++; \
_sv; \
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
# define SvREFCNT_dec(sv) \
({ \
- SV *_sv = (SV*)(sv); \
+ SV * const _sv = (SV*)(sv); \
if (_sv) { \
if (SvREFCNT(_sv)) { \
if (--(SvREFCNT(_sv)) == 0) \
#define SVp_SCREAM 0x08000000 /* has been studied? */
#define SVf_UTF8 0x20000000 /* SvPV is UTF-8 encoded */
+/* Ensure this value does not clash with the GV_ADD* flags in gv.h */
#define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE)
#define SVrepl_EVAL 0x40000000 /* Replacement part of s///e */
+#define SVphv_CLONEABLE 0x08000000 /* for stashes: clone its objects */
#define SVphv_REHASH 0x10000000 /* HV is recalculating hash values */
#define SVphv_SHAREKEYS 0x20000000 /* keys live on shared string table */
#define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */
#define SVprv_WEAKREF 0x80000000 /* Weak reference */
-struct xrv {
- SV * xrv_rv; /* pointer to another SV */
-};
+#define SVpav_REAL 0x40000000 /* free old entries */
+#define SVpav_REIFY 0x80000000 /* can become real */
struct xpv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
};
+#if 0
+typedef struct xpv xpv_allocated;
+#else
+typedef struct {
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+} xpv_allocated;
+#endif
+
struct xpviv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
};
+#if 0
+typedef struct xpviv xpviv_allocated;
+#else
+typedef struct {
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
+} xpviv_allocated;
+#endif
+
+#define xiv_iv xiv_u.xivu_iv
+
struct xpvuv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
- UV xuv_uv; /* unsigned value or pv offset */
+ union {
+ IV xuvu_iv;
+ UV xuvu_uv; /* unsigned value or pv offset */
+ void * xuvu_p1;
+ } xuv_u;
};
+#define xuv_uv xuv_u.xuvu_uv
+
struct xpvnv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
- NV xnv_nv; /* numeric value, if any */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
};
/* These structure must match the beginning of struct xpvhv in hv.h. */
struct xpvmg {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
- NV xnv_nv; /* numeric value, if any */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
};
struct xpvlv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
+ NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
- NV xnv_nv; /* numeric value, if any */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
};
struct xpvgv {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
- STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
};
struct xpvbm {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
- STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
typedef U16 cv_flags_t;
struct xpvfm {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
- STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
};
struct xpvio {
- char * xpv_pv; /* pointer to malloced string */
- STRLEN xpv_cur; /* length of xpv_pv as a C string */
- STRLEN xpv_len; /* allocated size */
- IV xiv_iv; /* integer value or pv offset */
NV xnv_nv; /* numeric value, if any */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
=for apidoc Am|HV*|SvSTASH|SV* sv
Returns the stash of the SV.
+=for apidoc Am|void|SvIV_set|SV* sv|IV val
+Set the value of the IV pointer in sv to val. It is possible to perform
+the same function of this macro with an lvalue assignment to C<SvIVX>.
+With future Perls, however, it will be more efficient to use
+C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
+
+=for apidoc Am|void|SvNV_set|SV* sv|NV val
+Set the value of the NV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvPV_set|SV* sv|char* val
+Set the value of the PV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvUV_set|SV* sv|UV val
+Set the value of the UV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvRV_set|SV* sv|SV* val
+Set the value of the RV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvMAGIC_set|SV* sv|MAGIC* val
+Set the value of the MAGIC pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvSTASH_set|SV* sv|STASH* val
+Set the value of the STASH pointer in sv to val. See C<SvIV_set>.
+
=for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len
-Set the length of the string which is in the SV. See C<SvCUR>.
+Set the current length of the string which is in the SV. See C<SvCUR>
+and C<SvIV_set>.
+
+=for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len
+Set the actual length of the string which is in the SV. See C<SvIV_set>.
=cut
*/
#define SvIOK_on(sv) (SvRELEASE_IVX(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV))
-#define SvIOK_only(sv) ((void)SvOK_off(sv), \
+#define SvIOK_only(sv) (SvOK_off(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
-#define SvIOK_only_UV(sv) ((void)SvOK_off_exc_UV(sv), \
+#define SvIOK_only_UV(sv) (SvOK_off_exc_UV(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
#define SvIOK_UV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
#define SvNOK(sv) (SvFLAGS(sv) & SVf_NOK)
#define SvNOK_on(sv) (SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
#define SvNOK_off(sv) (SvFLAGS(sv) &= ~(SVf_NOK|SVp_NOK))
-#define SvNOK_only(sv) ((void)SvOK_off(sv), \
+#define SvNOK_only(sv) (SvOK_off(sv), \
SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
/*
=cut
*/
+/* Ensure the return value of this macro does not clash with the GV_ADD* flags
+in gv.h: */
#define SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8)
#define SvUTF8_on(sv) (SvFLAGS(sv) |= (SVf_UTF8))
#define SvUTF8_off(sv) (SvFLAGS(sv) &= ~(SVf_UTF8))
#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))
+#define SvOOK_off(sv) ((void)(SvOOK(sv) && sv_backoff(sv)))
#define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE)
#define SvFAKE_on(sv) (SvFLAGS(sv) |= SVf_FAKE)
#define SvREPADTMP_off(sv) (SvFLAGS(sv) &= ~SVf_FAKE)
#endif
-#define SvRV(sv) ((XRV*) SvANY(sv))->xrv_rv
+#ifdef PERL_DEBUG_COW
+#define SvRV(sv) (0 + (sv)->sv_u.svu_rv)
+#else
+#define SvRV(sv) ((sv)->sv_u.svu_rv)
+#endif
#define SvRVx(sv) SvRV(sv)
-#define SvIVX(sv) ((XPVIV*) SvANY(sv))->xiv_iv
+#ifdef PERL_DEBUG_COW
+#define SvIVX(sv) (0 + ((XPVIV*) SvANY(sv))->xiv_iv)
+#define SvUVX(sv) (0 + ((XPVUV*) SvANY(sv))->xuv_uv)
+#define SvNVX(sv) (0 + ((XPVNV*) SvANY(sv))->xnv_nv)
+#define SvPVX(sv) (0 + (sv)->sv_u.svu_pv)
+#define SvCUR(sv) (0 + ((XPV*) SvANY(sv))->xpv_cur)
+#define SvLEN(sv) (0 + ((XPV*) SvANY(sv))->xpv_len)
+#define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+#ifdef DEBUGGING
+# ifdef PERL_IN_SV_C
+/* Can't make this RVALUE because of Perl_sv_unmagic. */
+# define SvMAGIC(sv) (*(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_magic))
+# else
+# define SvMAGIC(sv) (0 + *(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_magic))
+# endif
+#define SvSTASH(sv) (0 + *(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_stash))
+#else
+# ifdef PERL_IN_SV_C
+# define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_magic
+# else
+# define SvMAGIC(sv) (0 + ((XPVMG*) SvANY(sv))->xmg_magic)
+# endif
+#define SvSTASH(sv) (0 + ((XPVMG*) SvANY(sv))->xmg_stash)
+#endif
+#else
+#define SvIVX(sv) ((XPVIV*) SvANY(sv))->xiv_iv
+#define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv
+#define SvNVX(sv) ((XPVNV*) SvANY(sv))->xnv_nv
+#define SvPVX(sv) ((sv)->sv_u.svu_pv)
+#define SvCUR(sv) ((XPV*) SvANY(sv))->xpv_cur
+#define SvLEN(sv) ((XPV*) SvANY(sv))->xpv_len
+#define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+#ifdef DEBUGGING
+#define SvMAGIC(sv) (*(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_magic))
+#define SvSTASH(sv) (*(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_stash))
+#else
+#define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_magic
+#define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
+#endif
+
+#endif
+
#define SvIVXx(sv) SvIVX(sv)
-#define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv
#define SvUVXx(sv) SvUVX(sv)
-#define SvNVX(sv) ((XPVNV*)SvANY(sv))->xnv_nv
#define SvNVXx(sv) SvNVX(sv)
-#define SvPVX(sv) ((XPV*) SvANY(sv))->xpv_pv
#define SvPVXx(sv) SvPVX(sv)
-#define SvCUR(sv) ((XPV*) SvANY(sv))->xpv_cur
-#define SvLEN(sv) ((XPV*) SvANY(sv))->xpv_len
#define SvLENx(sv) SvLEN(sv)
-#define SvEND(sv)(((XPV*) SvANY(sv))->xpv_pv + ((XPV*)SvANY(sv))->xpv_cur)
#define SvENDx(sv) ((PL_Sv = (sv)), SvEND(PL_Sv))
-#ifdef DEBUGGING
-#define SvMAGIC(sv) ((assert(SvTYPE(sv) >= SVt_PVMG)), ((XPVMG*) SvANY(sv))->xmg_magic)
-#define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
-#else
-#define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_magic
-#define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
-#endif
/* Ask a scalar nicely to try to become an IV, if possible.
Not guaranteed to stay returning void */
(void) SvIV(sv); } STMT_END
#define SvIV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
- (SvIVX(sv) = (val)); } STMT_END
+ (((XPVIV*) SvANY(sv))->xiv_iv = (val)); } STMT_END
#define SvNV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
- (SvNVX(sv) = (val)); } STMT_END
+ (((XPVNV*)SvANY(sv))->xnv_nv = (val)); } STMT_END
#define SvPV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- (SvPVX(sv) = (val)); } STMT_END
+ ((sv)->sv_u.svu_pv = (val)); } STMT_END
+#define SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END
+#define SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+ ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#define SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*)SvANY(sv))->xmg_magic = (val)); } STMT_END
+#define SvSTASH_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
#define SvCUR_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- (SvCUR(sv) = (val)); } STMT_END
+ (((XPV*) SvANY(sv))->xpv_cur = (val)); } STMT_END
#define SvLEN_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- (SvLEN(sv) = (val)); } STMT_END
+ (((XPV*) SvANY(sv))->xpv_len = (val)); } STMT_END
#define SvEND_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
(SvCUR(sv) = (val) - SvPVX(sv)); } STMT_END
+#define SvPV_renew(sv,n) \
+ STMT_START { SvLEN_set(sv, n); \
+ SvPV_set((sv), (MEM_WRAP_CHECK_(n,char) \
+ (char*)saferealloc((Malloc_t)SvPVX(sv), \
+ (MEM_SIZE)((n))))); \
+ } STMT_END
+
+#define SvPV_shrink_to_cur(sv) STMT_START { \
+ const STRLEN _lEnGtH = SvCUR(sv) + 1; \
+ SvPV_renew(sv, _lEnGtH); \
+ } STMT_END
+
+#define SvPV_free(sv) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ if (SvLEN(sv)) { \
+ if(SvOOK(sv)) { \
+ Safefree(SvPVX(sv) - SvIVX(sv)); \
+ SvFLAGS(sv) &= ~SVf_OOK; \
+ } else { \
+ Safefree(SvPVX(sv)); \
+ } \
+ } \
+ } STMT_END
+
+#define SvPVX_const(sv) ((const char*)SvPVX(sv))
+
#define BmRARE(sv) ((XPVBM*) SvANY(sv))->xbm_rare
#define BmUSEFUL(sv) ((XPVBM*) SvANY(sv))->xbm_useful
#define BmPREVIOUS(sv) ((XPVBM*) SvANY(sv))->xbm_previous
Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
scalar.
+=for apidoc Am|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
+Like C<sv_catpvn> but doesn't process magic.
+
+=for apidoc Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
+Like C<sv_setsv> but doesn't process magic.
+
+=for apidoc Am|void|sv_catsv_nomg|SV* dsv|SV* ssv
+Like C<sv_catsv> but doesn't process magic.
+
=cut
*/
? (({XPV *nxpv = (XPV*)SvANY(sv); \
nxpv && \
(nxpv->xpv_cur > 1 || \
- (nxpv->xpv_cur && *nxpv->xpv_pv != '0')); }) \
+ (nxpv->xpv_cur && *(sv)->sv_u.svu_pv != '0')); }) \
? 1 \
: 0) \
: \
!sv \
? 0 \
: SvPOK(sv) \
- ? ((PL_Xpv = (XPV*)SvANY(sv)) && \
+ ? ((PL_Xpv = (XPV*)SvANY(PL_Sv = (sv))) && \
(PL_Xpv->xpv_cur > 1 || \
- (PL_Xpv->xpv_cur && *PL_Xpv->xpv_pv != '0')) \
+ (PL_Xpv->xpv_cur && *PL_Sv->sv_u.svu_pv != '0')) \
? 1 \
: 0) \
: \
#define SV_GMAGIC 2
#define SV_COW_DROP_PV 4
#define SV_UTF8_NO_ENCODING 8
+#define SV_NOSTEAL 16
/* We are about to replace the SV's current value. So if it's copy on write
we need to normalise it. Use the SV_COW_DROP_PV flag hint to say that
#define CAN_COW_FLAGS (SVp_POK|SVf_POK)
#else
-# define SvRELEASE_IVX(sv) ((void)SvOOK_off(sv))
+# define SvRELEASE_IVX(sv) SvOOK_off(sv)
#endif /* PERL_COPY_ON_WRITE */
#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) \
Like C<SvSetSV>, but does any set magic required afterwards.
=for apidoc Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
-Like C<SvSetMagicSV>, but does any set magic required afterwards.
+Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
=for apidoc Am|void|SvSHARE|SV* sv
Arranges for sv to be shared between threads if a suitable module
#define SvSetSV_nosteal_and(dst,src,finally) \
STMT_START { \
if ((dst) != (src)) { \
- U32 tMpF = SvFLAGS(src) & SVs_TEMP; \
- SvTEMP_off(src); \
- sv_setsv(dst, src); \
- SvFLAGS(src) |= tMpF; \
+ sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL); \
finally; \
} \
} STMT_END
UV flags;
PerlInterpreter *proto_perl;
};
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */