X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sv.h;h=f3ac3e80dbf1ebd22ab3d3a529eb6f4e97c9b5dc;hb=bc641c27709fc92be4f44291a8f5fa3a483662fd;hp=3f061c610a2a6bc15bb8bec1a1d32155d093b2d0;hpb=cd028baaa42beb359f547c3950a019ed6b46fc80;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sv.h b/sv.h index 3f061c6..f3ac3e8 100644 --- a/sv.h +++ b/sv.h @@ -1,7 +1,7 @@ /* sv.h * * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others + * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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. @@ -45,10 +45,10 @@ Type flag for code refs. See C. typedef enum { SVt_NULL, /* 0 */ - SVt_IV, /* 1 */ - SVt_NV, /* 2 */ - SVt_RV, /* 3 */ - SVt_BIND, /* 4 */ + SVt_BIND, /* 1 */ + SVt_IV, /* 2 */ + SVt_NV, /* 3 */ + SVt_RV, /* 4 */ SVt_PV, /* 5 */ SVt_PVIV, /* 6 */ SVt_PVNV, /* 7 */ @@ -292,7 +292,12 @@ perform the upgrade if necessary. See C. #define SVp_NOK 0x00002000 /* has valid non-public numeric value */ #define SVp_POK 0x00004000 /* has valid non-public pointer value */ #define SVp_SCREAM 0x00008000 /* has been studied? */ -#define SVphv_CLONEABLE 0x00008000 /* PVHV (stashes) clone its objects */ +#define SVphv_CLONEABLE SVp_SCREAM /* PVHV (stashes) clone its objects */ +#define SVpgv_GP SVp_SCREAM /* GV has a valid GP */ +#define SVprv_PCS_IMPORTED SVp_SCREAM /* RV is a proxy for a constant + subroutine in another package. Set the + CvIMPORTED_CV_ON() if it needs to be + expanded to a real GV */ #define SVs_PADSTALE 0x00010000 /* lexical has gone out of scope */ #define SVpad_STATE 0x00010000 /* pad name is a "state" var */ @@ -335,7 +340,7 @@ perform the upgrade if necessary. See C. #define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE) #define SVf_OK (SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \ - SVp_IOK|SVp_NOK|SVp_POK|SVp_SCREAM) + SVp_IOK|SVp_NOK|SVp_POK|SVpgv_GP) #define PRIVSHIFT 4 /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */ @@ -384,24 +389,38 @@ struct xpv { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; 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 { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -414,9 +433,6 @@ struct xpviv { } 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 */ @@ -428,7 +444,6 @@ typedef struct { HEK * xivu_namehek; } xiv_u; } xpviv_allocated; -#endif #define xiv_iv xiv_u.xivu_iv @@ -436,6 +451,15 @@ struct xpvuv { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -453,6 +477,15 @@ struct xpvnv { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -470,6 +503,15 @@ struct xpvmg { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -491,6 +533,15 @@ struct xpvlv { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -520,6 +571,15 @@ struct xpvgv { union { NV xnv_nv; HV * xgv_stash; /* The stash of this GV */ + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* xgv_flags */ STRLEN xpv_len; /* 0 */ @@ -546,6 +606,15 @@ struct xpvfm { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -622,6 +691,15 @@ struct xpvio { union { NV xnv_nv; /* numeric value, if any */ HV * xgv_stash; + struct { + U32 xlow; + U32 xhigh; + } xpad_cop_seq; /* used by pad.c for cop_sequence */ + struct { + U32 xbm_previous; /* how many characters in string before rare? */ + U8 xbm_flags; + U8 xbm_rare; /* rarest character in string */ + } xbm_s; /* fields from PVBM */ } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ @@ -856,7 +934,9 @@ Set the actual length of the string which is in the SV. See C. #define assert_not_glob(sv) #endif -#define SvOK(sv) (SvFLAGS(sv) & SVf_OK) +#define SvOK(sv) ((SvTYPE(sv) == SVt_BIND) \ + ? (SvFLAGS(SvRV(sv)) & SVf_OK) \ + : (SvFLAGS(sv) & SVf_OK)) #define SvOK_off(sv) (assert_not_ROK(sv) assert_not_glob(sv) \ SvFLAGS(sv) &= ~(SVf_OK| \ SVf_IVisUV|SVf_UTF8), \ @@ -1012,6 +1092,11 @@ the scalar's value cannot change unless written to. #define SvWEAKREF_on(sv) (SvFLAGS(sv) |= (SVf_ROK|SVprv_WEAKREF)) #define SvWEAKREF_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVprv_WEAKREF)) +#define SvPCS_IMPORTED(sv) ((SvFLAGS(sv) & (SVf_ROK|SVprv_PCS_IMPORTED)) \ + == (SVf_ROK|SVprv_PCS_IMPORTED)) +#define SvPCS_IMPORTED_on(sv) (SvFLAGS(sv) |= (SVf_ROK|SVprv_PCS_IMPORTED)) +#define SvPCS_IMPORTED_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVprv_PCS_IMPORTED)) + #define SvTHINKFIRST(sv) (SvFLAGS(sv) & SVf_THINKFIRST) #define SvPADSTALE(sv) (SvFLAGS(sv) & SVs_PADSTALE) @@ -1335,32 +1420,23 @@ the scalar's value cannot change unless written to. } STMT_END -#define PERL_FBM_TABLE_OFFSET 5 /* Number of bytes between EOS and table */ -#define PERL_FBM_FLAGS_OFFSET_FROM_TABLE -1 -/* how many characters in string before rare? */ -#if (BYTEORDER == 0x4321) || (BYTEORDER == 0x87654321) -# define PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE -2 -# define PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE -3 -#else -# define PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE -2 -# define PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE -3 -#endif -/* rarest character in string */ -#define PERL_FBM_RARE_OFFSET_FROM_TABLE -4 +#define PERL_FBM_TABLE_OFFSET 1 /* Number of bytes between EOS and table */ /* SvPOKp not SvPOK in the assertion because the string can be tainted! eg perl -T -e '/$^X/' */ #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# define BmFLAGS(sv) \ + (*({ SV *const uggh = (SV *) (sv); \ + assert(SvTYPE(uggh) == SVt_PVGV); \ + assert(SvVALID(uggh)); \ + &(((XPVGV*) SvANY(uggh))->xnv_u.xbm_s.xbm_flags); \ + })) # define BmRARE(sv) \ (*({ SV *const uggh = (SV *) (sv); \ assert(SvTYPE(uggh) == SVt_PVGV); \ assert(SvVALID(uggh)); \ - assert(SvCUR(uggh) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_RARE_OFFSET_FROM_TABLE <= SvLEN(uggh)); \ - assert(SvPOKp(uggh)); \ - (U8*)(SvEND(uggh) \ - + PERL_FBM_TABLE_OFFSET + PERL_FBM_RARE_OFFSET_FROM_TABLE); \ + &(((XPVGV*) SvANY(uggh))->xnv_u.xbm_s.xbm_rare); \ })) # define BmUSEFUL(sv) \ (*({ SV *const uggh = (SV *) (sv); \ @@ -1370,39 +1446,18 @@ the scalar's value cannot change unless written to. &(((XPVGV*) SvANY(uggh))->xiv_u.xivu_i32); \ })) # define BmPREVIOUS(sv) \ - ({ SV *const uggh = (SV *) (sv); \ - assert(SvTYPE(uggh) == SVt_PVGV); \ - assert(SvVALID(uggh)); \ - assert(SvPOKp(uggh)); \ - assert(SvCUR(uggh) + PERL_FBM_TABLE_OFFSET <= SvLEN(uggh)); \ - (*(U8*)(SvEND(uggh) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) << 8) \ - | (*(U8*)(SvEND(uggh) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE)); \ - }) + (*({ SV *const uggh = (SV *) (sv); \ + assert(SvTYPE(uggh) == SVt_PVGV); \ + assert(SvVALID(uggh)); \ + &(((XPVGV*) SvANY(uggh))->xnv_u.xbm_s.xbm_previous); \ + })) #else -# define BmRARE(sv) \ - (*(U8*)(SvEND(sv) \ - + PERL_FBM_TABLE_OFFSET + PERL_FBM_RARE_OFFSET_FROM_TABLE)) - -# define BmUSEFUL(sv) ((XPVGV*) SvANY(sv))->xiv_u.xivu_i32 -# define BmPREVIOUS(sv) \ - ((*(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) << 8) \ - | (*(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE))) \ +# define BmFLAGS(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_flags +# define BmRARE(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_rare +# define BmUSEFUL(sv) ((XPVGV*) SvANY(sv))->xiv_u.xivu_i32 +# define BmPREVIOUS(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_previous #endif -#define BmPREVIOUS_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) == SVt_PVGV); \ - assert(SvVALID(sv)); \ - assert(SvPOKp(sv)); \ - assert(SvCUR(sv) + PERL_FBM_TABLE_OFFSET <= SvLEN(sv)); \ - *(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) = (U8)((U32)(val)>>8); \ - *(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \ - + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE) = (U8)(val); \ - } STMT_END #define FmLINES(sv) ((XPVFM*) SvANY(sv))->xfm_lines @@ -1974,8 +2029,21 @@ Returns a pointer to the character buffer. /* If I give every macro argument a different name, then there won't be bugs where nested macros get confused. Been there, done that. */ #define isGV_with_GP(pwadak) \ - (((SvFLAGS(pwadak) & (SVp_POK|SVp_SCREAM)) == SVp_SCREAM) \ + (((SvFLAGS(pwadak) & (SVp_POK|SVpgv_GP)) == SVpgv_GP) \ && (SvTYPE(pwadak) == SVt_PVGV || SvTYPE(pwadak) == SVt_PVLV)) +#define isGV_with_GP_on(sv) STMT_START { \ + assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \ + assert (!SvPOKp(sv)); \ + assert (!SvIOKp(sv)); \ + (SvFLAGS(sv) |= SVpgv_GP); \ + } STMT_END +#define isGV_with_GP_off(sv) STMT_START { \ + assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \ + assert (!SvPOKp(sv)); \ + assert (!SvIOKp(sv)); \ + (SvFLAGS(sv) &= ~SVpgv_GP); \ + } STMT_END + #define SvGROW(sv,len) (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv)) #define SvGROW_mutable(sv,len) \