X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cv.h;h=1b0fc7b612e24a4b689fac3438c5264967d1c60f;hb=024963f8e0e4bfbd631d6878a69f86cabc760a32;hp=9e1dce0499ba11daaa6c858d6256bf1dc5569f3f;hpb=d04ba5897acce6425e3b231fbf36336ea42f8165;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cv.h b/cv.h index 9e1dce0..1b0fc7b 100644 --- a/cv.h +++ b/cv.h @@ -1,7 +1,7 @@ /* cv.h * - * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 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. @@ -11,15 +11,32 @@ /* This structure must the beginning of XPVFM in sv.h */ struct xpvcv { - NV xnv_nv; /* numeric value, if any */ + 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 xp_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { - IV xivu_iv; /* integer value or pv offset */ + IV xivu_iv; UV xivu_uv; void * xivu_p1; + I32 xivu_i32; /* depth, >= 2 indicates recursive call */ + HEK * xivu_namehek; } xiv_u; - MAGIC* xmg_magic; /* magic for scalar array */ + union { + MAGIC* xmg_magic; /* linked list of magicalness */ + HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */ + } xmg_u; HV* xmg_stash; /* class package */ HV * xcv_stash; @@ -33,15 +50,49 @@ struct xpvcv { } xcv_root_u; GV * xcv_gv; char * xcv_file; - long xcv_depth; /* >= 2 indicates recursive call */ PADLIST * xcv_padlist; CV * xcv_outside; - cv_flags_t xcv_flags; U32 xcv_outside_seq; /* the COP sequence (at the point of our * compilation) in the lexically enclosing * sub */ + cv_flags_t xcv_flags; }; +typedef struct { + STRLEN xpv_cur; /* length of xp_pv as a C string */ + STRLEN xpv_len; /* allocated size */ + union { + IV xivu_iv; + UV xivu_uv; + void * xivu_p1; + I32 xivu_i32; /* depth, >= 2 indicates recursive call */ + HEK * xivu_namehek; + } xiv_u; + union { + MAGIC* xmg_magic; /* linked list of magicalness */ + HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */ + } xmg_u; + HV* xmg_stash; /* class package */ + + HV * xcv_stash; + union { + OP * xcv_start; + ANY xcv_xsubany; + } xcv_start_u; + union { + OP * xcv_root; + void (*xcv_xsub) (pTHX_ CV*); + } xcv_root_u; + GV * xcv_gv; + char * xcv_file; + PADLIST * xcv_padlist; + CV * xcv_outside; + U32 xcv_outside_seq; /* the COP sequence (at the point of our + * compilation) in the lexically enclosing + * sub */ + cv_flags_t xcv_flags; +} xpvcv_allocated; + /* =head1 Handy Values @@ -71,7 +122,15 @@ Returns the stash of the CV. # define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop)) #endif #define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv))) -#define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xcv_depth +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# define CvDEPTH(sv) (*({const CV *_cv = (CV *)sv; \ + assert(SvTYPE(_cv) == SVt_PVCV || \ + SvTYPE(_cv) == SVt_PVFM); \ + &((XPVCV*)SvANY(_cv))->xiv_u.xivu_i32; \ + })) +#else +# define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xiv_u.xivu_i32 +#endif #define CvPADLIST(sv) ((XPVCV*)SvANY(sv))->xcv_padlist #define CvOUTSIDE(sv) ((XPVCV*)SvANY(sv))->xcv_outside #define CvFLAGS(sv) ((XPVCV*)SvANY(sv))->xcv_flags @@ -80,24 +139,20 @@ Returns the stash of the CV. #define CVf_METHOD 0x0001 /* CV is explicitly marked as a method */ #define CVf_LOCKED 0x0002 /* CV locks itself or first arg on entry */ #define CVf_LVALUE 0x0004 /* CV return value can be used as lvalue */ -#define CVf_ASSERTION 0x0008 /* CV called only when asserting */ #define CVf_WEAKOUTSIDE 0x0010 /* CvOUTSIDE isn't ref counted */ #define CVf_CLONE 0x0020 /* anon CV uses external lexicals */ #define CVf_CLONED 0x0040 /* a clone of one of those */ #define CVf_ANON 0x0080 /* CvGV() can't be trusted */ #define CVf_UNIQUE 0x0100 /* sub is only called once (eg PL_main_cv, - * require, eval). Not to be confused - * with the GVf_UNIQUE flag associated - * with the :unique attribute */ + * require, eval). */ #define CVf_NODEBUG 0x0200 /* no DB::sub indirection for this CV (esp. useful for special XSUBs) */ #define CVf_CONST 0x0400 /* inlinable sub */ -#define CVf_OLDSTYLE 0x0800 -#define CVf_ISXSUB 0x1000 /* CV is an XSUB, not pure perl. */ +#define CVf_ISXSUB 0x0800 /* CV is an XSUB, not pure perl. */ /* This symbol for optimised communication between toke.c and op.c: */ -#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ASSERTION) +#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LOCKED|CVf_LVALUE) #define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) #define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) @@ -111,12 +166,6 @@ Returns the stash of the CV. #define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON) #define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON) -#ifdef PERL_XSUB_OLDSTYLE -#define CvOLDSTYLE(cv) (CvFLAGS(cv) & CVf_OLDSTYLE) -#define CvOLDSTYLE_on(cv) (CvFLAGS(cv) |= CVf_OLDSTYLE) -#define CvOLDSTYLE_off(cv) (CvFLAGS(cv) &= ~CVf_OLDSTYLE) -#endif - #define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE) #define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE) #define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE) @@ -137,15 +186,11 @@ Returns the stash of the CV. #define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE) #define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE) -#define CvASSERTION(cv) (CvFLAGS(cv) & CVf_ASSERTION) -#define CvASSERTION_on(cv) (CvFLAGS(cv) |= CVf_ASSERTION) -#define CvASSERTION_off(cv) (CvFLAGS(cv) &= ~CVf_ASSERTION) - #define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv)) #define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv)) #define CvEVAL_off(cv) CvUNIQUE_off(cv) -/* BEGIN|CHECK|INIT|END */ +/* BEGIN|CHECK|INIT|UNITCHECK|END */ #define CvSPECIAL(cv) (CvUNIQUE(cv) && SvFAKE(cv)) #define CvSPECIAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_on(cv)) #define CvSPECIAL_off(cv) (CvUNIQUE_off(cv),SvFAKE_off(cv)) @@ -162,6 +207,9 @@ Returns the stash of the CV. #define CvISXSUB_on(cv) (CvFLAGS(cv) |= CVf_ISXSUB) #define CvISXSUB_off(cv) (CvFLAGS(cv) &= ~CVf_ISXSUB) +/* Flags for newXS_flags */ +#define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */ + /* =head1 CV reference counts and CvOUTSIDE