X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/828dad175cf45f4e83d61df735a510f0314063c8..3ecf39046a28b9312241175fa5493a56fb1529e2:/cv.h?ds=sidebyside diff --git a/cv.h b/cv.h index 290019d..6fdf5cb 100644 --- a/cv.h +++ b/cv.h @@ -12,8 +12,8 @@ struct xpvcv { _XPV_HEAD; - _XPVMG_HEAD; _XPVCV_COMMON; + I32 xcv_depth; /* >= 2 indicates recursive call */ }; /* @@ -36,12 +36,14 @@ Returns the stash of the CV. # define Nullcv Null(CV*) #endif -#define CvSTASH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash +#define CvSTASH(sv) (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash) +#define CvSTASH_set(cv,st) Perl_cvstash_set(aTHX_ cv, st) #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) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv +#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))) @@ -52,10 +54,10 @@ Returns the stash of the CV. #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) # define CvDEPTH(sv) (*({const CV *const _cvdepth = (const CV *)sv; \ assert(SvTYPE(_cvdepth) == SVt_PVCV); \ - &((XPVCV*)SvANY(_cvdepth))->xiv_u.xivu_i32; \ + &((XPVCV*)SvANY(_cvdepth))->xcv_depth; \ })) #else -# define CvDEPTH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xiv_u.xivu_i32 +# define CvDEPTH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_depth #endif #define CvPADLIST(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist #define CvOUTSIDE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside @@ -63,18 +65,19 @@ Returns the stash of the CV. #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_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_LVALUE) @@ -128,6 +131,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 */ @@ -186,6 +193,8 @@ should print 123: =cut */ +typedef OP *(*Perl_call_checker)(pTHX_ OP *, GV *, SV *); + /* * Local variables: * c-indentation-style: bsd