X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/7948fc082b7916e5f602700f36d83fdcf421314c..e9c9ffcae4a8b5820dabb04674b85bb5195fcfc4:/cv.h diff --git a/cv.h b/cv.h index 53c4733..7979a05 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, 2007, by Larry Wall and others + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, + * 2002, 2003, 2004, 2005, 2006, 2007, 2008 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. @@ -12,16 +12,10 @@ struct xpvcv { _XPV_HEAD; - _XPVMG_HEAD; _XPVCV_COMMON; + I32 xcv_depth; /* >= 2 indicates recursive call */ }; -typedef struct { - _XPV_ALLOCATED_HEAD; - _XPVMG_HEAD; - _XPVCV_COMMON; -} xpvcv_allocated; - /* =head1 Handy Values @@ -42,13 +36,14 @@ Returns the stash of the CV. # define Nullcv Null(CV*) #endif -#define CvSTASH(sv) ((XPVCV*)SvANY(sv))->xcv_stash -#define CvSTART(sv) ((XPVCV*)SvANY(sv))->xcv_start_u.xcv_start -#define CvROOT(sv) ((XPVCV*)SvANY(sv))->xcv_root_u.xcv_root -#define CvXSUB(sv) ((XPVCV*)SvANY(sv))->xcv_root_u.xcv_xsub -#define CvXSUBANY(sv) ((XPVCV*)SvANY(sv))->xcv_start_u.xcv_xsubany -#define CvGV(sv) ((XPVCV*)SvANY(sv))->xcv_gv -#define CvFILE(sv) ((XPVCV*)SvANY(sv))->xcv_file +#define CvSTASH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash +#define CvSTART(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start +#define CvROOT(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root +#define CvXSUB(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub +#define CvXSUBANY(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany +#define CvGV(sv) (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv) +#define CvGV_set(cv,gv) Perl_cvgv_set(aTHX_ cv, gv) +#define CvFILE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file #ifdef USE_ITHREADS # define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = savepv(CopFILE(cop))) #else @@ -56,36 +51,35 @@ Returns the stash of the CV. #endif #define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv))) #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define CvDEPTH(sv) (*({const CV *_cvdepth = (CV *)sv; \ - assert(SvTYPE(_cvdepth) == SVt_PVCV || \ - SvTYPE(_cvdepth) == SVt_PVFM); \ - &((XPVCV*)SvANY(_cvdepth))->xiv_u.xivu_i32; \ +# define CvDEPTH(sv) (*({const CV *const _cvdepth = (const CV *)sv; \ + assert(SvTYPE(_cvdepth) == SVt_PVCV); \ + &((XPVCV*)SvANY(_cvdepth))->xcv_depth; \ })) #else -# define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xiv_u.xivu_i32 +# define CvDEPTH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_depth #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 -#define CvOUTSIDE_SEQ(sv) ((XPVCV*)SvANY(sv))->xcv_outside_seq +#define CvPADLIST(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist +#define CvOUTSIDE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside +#define CvFLAGS(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags +#define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq #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_LVALUE 0x0002 /* CV return value can be used as lvalue */ +#define CVf_CONST 0x0004 /* inlinable sub */ +#define CVf_ISXSUB 0x0008 /* CV is an XSUB, not pure perl. */ #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_ANON 0x0080 /* CV is not pointed to by a GV */ #define CVf_UNIQUE 0x0100 /* sub is only called once (eg PL_main_cv, * 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_ISXSUB 0x0800 /* CV is an XSUB, not pure perl. */ +#define CVf_CVGV_RC 0x0400 /* CvGV is reference counted */ /* This symbol for optimised communication between toke.c and op.c: */ -#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LOCKED|CVf_LVALUE) +#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE) #define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) #define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) @@ -111,10 +105,6 @@ Returns the stash of the CV. #define CvMETHOD_on(cv) (CvFLAGS(cv) |= CVf_METHOD) #define CvMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_METHOD) -#define CvLOCKED(cv) (CvFLAGS(cv) & CVf_LOCKED) -#define CvLOCKED_on(cv) (CvFLAGS(cv) |= CVf_LOCKED) -#define CvLOCKED_off(cv) (CvFLAGS(cv) &= ~CVf_LOCKED) - #define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE) #define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE) #define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE) @@ -140,6 +130,10 @@ Returns the stash of the CV. #define CvISXSUB_on(cv) (CvFLAGS(cv) |= CVf_ISXSUB) #define CvISXSUB_off(cv) (CvFLAGS(cv) &= ~CVf_ISXSUB) +#define CvCVGV_RC(cv) (CvFLAGS(cv) & CVf_CVGV_RC) +#define CvCVGV_RC_on(cv) (CvFLAGS(cv) |= CVf_CVGV_RC) +#define CvCVGV_RC_off(cv) (CvFLAGS(cv) &= ~CVf_CVGV_RC) + /* Flags for newXS_flags */ #define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */