X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/cfc1e951d98ba2b9a0e066aba9aadba4cd919eec..3848e5b79a3e7e73f1c511dbc5723c0d552e8d50:/cv.h diff --git a/cv.h b/cv.h index d762a06..d4dfd2d 100644 --- a/cv.h +++ b/cv.h @@ -8,12 +8,11 @@ * */ -/* This structure must the beginning of XPVFM in sv.h */ +/* This structure must match the beginning of XPVFM in sv.h */ struct xpvcv { _XPV_HEAD; _XPVCV_COMMON; - I32 xcv_depth; /* >= 2 indicates recursive call */ }; /* @@ -26,8 +25,16 @@ Null CV pointer. =head1 CV Manipulation Functions +This section documents functions to manipulate CVs which are code-values, +or subroutines. For more information, see L. + =for apidoc Am|HV*|CvSTASH|CV* cv -Returns the stash of the CV. +Returns the stash of the CV. A stash is the symbol table hash, containing +the package-scoped variables in the package where the subroutine was defined. +For more information, see L. + +This also has a special use with XS AUTOLOAD subs. +See L. =cut */ @@ -36,31 +43,74 @@ 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) S_CvGV(aTHX_ (CV *)(sv)) +#define CvGV_set(cv,gv) Perl_cvgv_set(aTHX_ cv, gv) +#define CvHASGV(cv) cBOOL(SvANY(cv)->xcv_gv_u.xcv_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))) +# define CvFILE_set_from_cop(sv, cop) \ + (CvFILE(sv) = savepv(CopFILE(cop)), CvDYNFILE_on(sv)) #else -# define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop)) +# define CvFILE_set_from_cop(sv, cop) \ + (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv)) #endif #define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv))) -#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))->xcv_depth; \ - })) +#define CvDEPTH(sv) (*S_CvDEPTHp((const CV *)sv)) +/* For use when you only have a XPVCV*, not a real CV*. + Must be assert protected as in S_CvDEPTHp before use. */ +#define CvDEPTHunsafe(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_depth + +/* these CvPADLIST/CvRESERVED asserts can be reverted one day, once stabilized */ +#define CvPADLIST(sv) (*(assert_(!CvISXSUB((CV*)(sv))) \ + &(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist))) +/* CvPADLIST_set is not public API, it can be removed one day, once stabilized */ +#ifdef DEBUGGING +# define CvPADLIST_set(sv, padlist) Perl_set_padlist((CV*)sv, padlist) +#else +# define CvPADLIST_set(sv, padlist) (CvPADLIST(sv) = (padlist)) +#endif +#define CvHSCXT(sv) *(assert_(CvISXSUB((CV*)(sv))) \ + &(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_hscxt)) +#ifdef DEBUGGING +# if PTRSIZE == 8 +# define PoisonPADLIST(sv) \ + (((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist = (PADLIST *)UINT64_C(0xEFEFEFEFEFEFEFEF)) +# elif PTRSIZE == 4 +# define PoisonPADLIST(sv) \ + (((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist = (PADLIST *)0xEFEFEFEF) +# else +# error unknown pointer size +# endif #else -# define CvDEPTH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_depth +# define PoisonPADLIST(sv) NOOP #endif -#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(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside #define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq +#define CvFLAGS(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags + +/* These two are sometimes called on non-CVs */ +#define CvPROTO(sv) \ + ( \ + SvPOK(sv) \ + ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \ + ? SvEND(sv)+1 : SvPVX_const(sv) \ + : NULL \ + ) +#define CvPROTOLEN(sv) \ + ( \ + SvPOK(sv) \ + ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \ + ? SvLEN(sv)-SvCUR(sv)-2 \ + : SvCUR(sv) \ + : 0 \ + ) #define CVf_METHOD 0x0001 /* CV is explicitly marked as a method */ #define CVf_LVALUE 0x0002 /* CV return value can be used as lvalue */ @@ -76,9 +126,18 @@ Returns the stash of the CV. #define CVf_NODEBUG 0x0200 /* no DB::sub indirection for this CV (esp. useful for special XSUBs) */ #define CVf_CVGV_RC 0x0400 /* CvGV is reference counted */ +#ifdef PERL_CORE +# define CVf_SLABBED 0x0800 /* Holds refcount on op slab */ +#endif +#define CVf_DYNFILE 0x1000 /* The filename isn't static */ +#define CVf_AUTOLOAD 0x2000 /* SvPVX contains AUTOLOADed sub name */ +#define CVf_HASEVAL 0x4000 /* contains string eval */ +#define CVf_NAMED 0x8000 /* Has a name HEK */ +#define CVf_LEXICAL 0x10000 /* Omit package from name */ +#define CVf_ANONCONST 0x20000 /* :const - create anonconst op */ /* This symbol for optimised communication between toke.c and op.c: */ -#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE) +#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE|CVf_ANONCONST) #define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) #define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) @@ -92,6 +151,7 @@ Returns the stash of the CV. #define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON) #define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON) +/* CvEVAL or CvSPECIAL */ #define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE) #define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE) #define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE) @@ -108,6 +168,7 @@ Returns the stash of the CV. #define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE) #define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE) +/* eval or PL_main_cv */ #define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv)) #define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv)) #define CvEVAL_off(cv) CvUNIQUE_off(cv) @@ -133,28 +194,75 @@ Returns the stash of the CV. #define CvCVGV_RC_on(cv) (CvFLAGS(cv) |= CVf_CVGV_RC) #define CvCVGV_RC_off(cv) (CvFLAGS(cv) &= ~CVf_CVGV_RC) +#ifdef PERL_CORE +# define CvSLABBED(cv) (CvFLAGS(cv) & CVf_SLABBED) +# define CvSLABBED_on(cv) (CvFLAGS(cv) |= CVf_SLABBED) +# define CvSLABBED_off(cv) (CvFLAGS(cv) &= ~CVf_SLABBED) +#endif + +#define CvDYNFILE(cv) (CvFLAGS(cv) & CVf_DYNFILE) +#define CvDYNFILE_on(cv) (CvFLAGS(cv) |= CVf_DYNFILE) +#define CvDYNFILE_off(cv) (CvFLAGS(cv) &= ~CVf_DYNFILE) + +#define CvAUTOLOAD(cv) (CvFLAGS(cv) & CVf_AUTOLOAD) +#define CvAUTOLOAD_on(cv) (CvFLAGS(cv) |= CVf_AUTOLOAD) +#define CvAUTOLOAD_off(cv) (CvFLAGS(cv) &= ~CVf_AUTOLOAD) + +#define CvHASEVAL(cv) (CvFLAGS(cv) & CVf_HASEVAL) +#define CvHASEVAL_on(cv) (CvFLAGS(cv) |= CVf_HASEVAL) +#define CvHASEVAL_off(cv) (CvFLAGS(cv) &= ~CVf_HASEVAL) + +#define CvNAMED(cv) (CvFLAGS(cv) & CVf_NAMED) +#define CvNAMED_on(cv) (CvFLAGS(cv) |= CVf_NAMED) +#define CvNAMED_off(cv) (CvFLAGS(cv) &= ~CVf_NAMED) + +#define CvLEXICAL(cv) (CvFLAGS(cv) & CVf_LEXICAL) +#define CvLEXICAL_on(cv) (CvFLAGS(cv) |= CVf_LEXICAL) +#define CvLEXICAL_off(cv) (CvFLAGS(cv) &= ~CVf_LEXICAL) + +#define CvANONCONST(cv) (CvFLAGS(cv) & CVf_ANONCONST) +#define CvANONCONST_on(cv) (CvFLAGS(cv) |= CVf_ANONCONST) +#define CvANONCONST_off(cv) (CvFLAGS(cv) &= ~CVf_ANONCONST) + /* Flags for newXS_flags */ #define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */ +PERL_STATIC_INLINE HEK * +CvNAME_HEK(CV *sv) +{ + return CvNAMED(sv) + ? ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv_u.xcv_hek + : 0; +} +/* This lowers the refernce count of the previous value, but does *not* + increment the reference count of the new value. */ +#define CvNAME_HEK_set(cv, hek) ( \ + CvNAME_HEK((CV *)(cv)) \ + ? unshare_hek(SvANY((CV *)(cv))->xcv_gv_u.xcv_hek) \ + : (void)0, \ + ((XPVCV*)MUTABLE_PTR(SvANY(cv)))->xcv_gv_u.xcv_hek = (hek), \ + CvNAMED_on(cv) \ + ) + /* =head1 CV reference counts and CvOUTSIDE =for apidoc m|bool|CvWEAKOUTSIDE|CV *cv Each CV has a pointer, C, to its lexically enclosing -CV (if any). Because pointers to anonymous sub prototypes are +CV (if any). Because pointers to anonymous sub prototypes are stored in C<&> pad slots, it is a possible to get a circular reference, -with the parent pointing to the child and vice-versa. To avoid the +with the parent pointing to the child and vice-versa. To avoid the ensuing memory leak, we do not increment the reference count of the CV pointed to by C in the I that the parent -has a C<&> pad slot pointing back to us. In this case, we set the -C flag in the child. This allows us to determine under what +has a C<&> pad slot pointing back to us. In this case, we set the +C flag in the child. This allows us to determine under what circumstances we should decrement the refcount of the parent when freeing the child. There is a further complication with non-closure anonymous subs (i.e. those -that do not refer to any lexicals outside that sub). In this case, the -anonymous prototype is shared rather than being cloned. This has the +that do not refer to any lexicals outside that sub). In this case, the +anonymous prototype is shared rather than being cloned. This has the consequence that the parent may be freed while there are still active children, eg @@ -170,16 +278,16 @@ and the freed BEGIN is accessed. To avoid this, whenever a CV and its associated pad is freed, any C<&> entries in the pad are explicitly removed from the pad, and if the refcount of the pointed-to anon sub is still positive, then that -child's C is set to point to its grandparent. This will only +child's C is set to point to its grandparent. This will only occur in the single specific case of a non-closure anon prototype having one or more active references (such as C<$a> above). One other thing to consider is that a CV may be merely undefined -rather than freed, eg C. In this case, its refcount may +rather than freed, eg C. In this case, its refcount may not have reached zero, but we still delete its pad and its C etc. Since various children may still have their C pointing at this undefined CV, we keep its own C for the time being, so that -the chain of lexical scopes is unbroken. For example, the following +the chain of lexical scopes is unbroken. For example, the following should print 123: my $x = 123; @@ -191,12 +299,16 @@ should print 123: =cut */ +typedef OP *(*Perl_call_checker)(pTHX_ OP *, GV *, SV *); + +#define CALL_CHECKER_REQUIRE_GV MGf_REQUIRE_GV + +#define CV_NAME_NOTQUAL 1 + +#ifdef PERL_CORE +# define CV_UNDEF_KEEP_NAME 1 +#endif + /* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: t - * End: - * - * ex: set ts=8 sts=4 sw=4 noet: + * ex: set ts=8 sts=4 sw=4 et: */