U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv; /* pointer to another SV */
- char* sv_pv; /* pointer to malloced string */
- SV** sv_array;
+ 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 */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv;
- char* sv_pv;
- SV** sv_array;
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
} sv_u;
};
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv;
- char* sv_pv;
- SV** sv_array;
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
} sv_u;
};
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv;
- char* sv_pv; /* pointer to first array element */
- SV** sv_array;
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv; /* pointer to first array element */
+ SV** svu_array;
} sv_u;
};
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv;
- char* sv_pv;
- SV** sv_array;
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
} sv_u;
};
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
union {
- IV sv_iv;
- UV sv_uv;
- SV* sv_rv;
- char* sv_pv;
- SV** sv_array;
+ IV svu_iv;
+ UV svu_uv;
+ SV* svu_rv;
+ char* svu_pv;
+ SV** svu_array;
} sv_u;
};
#define SVpav_REIFY 0x80000000 /* can become real */
struct xpv {
- IV xpv_dummy; /* This isn't allocated. */
- STRLEN xpv_cur; /* length of sv_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 */
};
typedef struct xpv xpv_allocated;
#else
typedef struct {
- STRLEN xpv_cur; /* length of sv_pv as a C string */
+ STRLEN xpv_cur; /* length of svu_pv as a C string */
STRLEN xpv_len; /* allocated size */
} xpv_allocated;
#endif
struct xpviv {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
+ 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 {
- UV xuv_uv; /* unsigned value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ IV xivu_iv; /* integer value or pv offset */
+ UV xivu_uv;
+ void * xivu_p1;
+ } xiv_u;
};
-#define xnv_nv xnv_u.xnvu_nv
-
/* These structure must match the beginning of struct xpvhv in hv.h. */
struct xpvmg {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 {
- IV xiv_iv; /* integer value or pv offset */
- STRLEN xpv_cur; /* length of sv_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 */
union {
- struct {
- void *xnv_p1;
- union {
- void *xnv_p2;
- IV xnv_i2;
- } xnv_u2;
- } xnv_s;
- NV xnvu_nv; /* numeric value, if any */
- } xnv_u;
+ 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 */
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.
+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 IV pointer in sv to 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.
+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 PV pointer in sv to 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.
+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.
+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.
+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 current 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.
+Set the actual length of the string which is in the SV. See C<SvIV_set>.
=cut
*/
#endif
#ifdef PERL_DEBUG_COW
-#define SvRV(sv) (0 + (sv)->sv_u.sv_rv)
+#define SvRV(sv) (0 + (sv)->sv_u.svu_rv)
#else
-#define SvRV(sv) ((sv)->sv_u.sv_rv)
+#define SvRV(sv) ((sv)->sv_u.svu_rv)
#endif
#define SvRVx(sv) SvRV(sv)
#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.sv_pv)
+#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.sv_pv + ((XPV*)SvANY(sv))->xpv_cur)
+#define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur)
#ifdef DEBUGGING
# ifdef PERL_IN_SV_C
#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.sv_pv)
+#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.sv_pv + ((XPV*)SvANY(sv))->xpv_cur)
+#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))
(((XPVNV*)SvANY(sv))->xnv_nv = (val)); } STMT_END
#define SvPV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- ((sv)->sv_u.sv_pv = (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.sv_rv = (val)); } STMT_END
+ ((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
? (({XPV *nxpv = (XPV*)SvANY(sv); \
nxpv && \
(nxpv->xpv_cur > 1 || \
- (nxpv->xpv_cur && *(sv)->sv_u.sv_pv != '0')); }) \
+ (nxpv->xpv_cur && *(sv)->sv_u.svu_pv != '0')); }) \
? 1 \
: 0) \
: \
: SvPOK(sv) \
? ((PL_Xpv = (XPV*)SvANY(PL_Sv = (sv))) && \
(PL_Xpv->xpv_cur > 1 || \
- (PL_Xpv->xpv_cur && *PL_Sv->sv_u.sv_pv != '0')) \
+ (PL_Xpv->xpv_cur && *PL_Sv->sv_u.svu_pv != '0')) \
? 1 \
: 0) \
: \