X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sv.h;h=15d90a9e0680c7b6295ea73801ced65e2ace2523;hb=646ca15d5cf720a2af3a258d7092a967f3a80550;hp=69aad463ad6e16461c705089a4133e89a9bc28cb;hpb=199f3245d0efbd4bc138ab358c5f5889c79d7083;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sv.h b/sv.h index 69aad46..15d90a9 100644 --- a/sv.h +++ b/sv.h @@ -69,11 +69,11 @@ struct STRUCT_SV { /* struct sv { */ 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 */ @@ -89,11 +89,11 @@ struct gv { 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; }; @@ -102,11 +102,11 @@ struct cv { 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; }; @@ -115,11 +115,11 @@ struct av { 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; }; @@ -128,11 +128,11 @@ struct hv { 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; }; @@ -141,11 +141,11 @@ struct io { 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; }; @@ -225,7 +225,10 @@ perform the upgrade if necessary. See C. #define SVf_ROK 0x00080000 /* has a valid reference pointer */ #define SVf_FAKE 0x00100000 /* glob or lexical is just a copy */ -#define SVf_OOK 0x00200000 /* has valid offset value */ +#define SVf_OOK 0x00200000 /* has valid offset value + For a PVHV this means that a + hv_aux struct is present after the + main array */ #define SVf_BREAK 0x00400000 /* refcnt is artificially low - used * by SV's in final arena cleanup */ #define SVf_READONLY 0x00800000 /* may not be modified */ @@ -275,8 +278,8 @@ perform the upgrade if necessary. See C. #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 */ }; @@ -284,74 +287,85 @@ struct xpv { 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 */ @@ -370,19 +384,14 @@ struct xpvlv { }; 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 */ @@ -394,19 +403,14 @@ struct xpvgv { }; 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 */ @@ -420,19 +424,14 @@ struct xpvbm { 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 */ @@ -454,19 +453,14 @@ struct xpvfm { }; 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 */ @@ -642,31 +636,35 @@ See C. Access the character as *(SvEND(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. +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. +With future Perls, however, it will be more efficient to use +C instead of the lvalue assignment to C. =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. =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. =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. =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. =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. =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. =for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len -Set the current length of the string which is in the SV. See C. +Set the current length of the string which is in the SV. See C +and C. =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. =cut */ @@ -865,9 +863,9 @@ in gv.h: */ #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) @@ -875,10 +873,10 @@ in gv.h: */ #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 @@ -900,10 +898,10 @@ in gv.h: */ #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)) @@ -937,13 +935,13 @@ in gv.h: */ (((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 @@ -1267,7 +1265,7 @@ Like C but doesn't process magic. ? (({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) \ : \ @@ -1295,7 +1293,7 @@ Like C but doesn't process magic. : 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) \ : \