xref: /openbsd/gnu/usr.bin/perl/cv.h (revision e0680481)
14a4f25f9Sdownsj /*    cv.h
24a4f25f9Sdownsj  *
3df042708Smillert  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
4df042708Smillert  *    2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
54a4f25f9Sdownsj  *
64a4f25f9Sdownsj  *    You may distribute under the terms of either the GNU General Public
74a4f25f9Sdownsj  *    License or the Artistic License, as specified in the README file.
84a4f25f9Sdownsj  *
94a4f25f9Sdownsj  */
104a4f25f9Sdownsj 
1148950c12Ssthen /* This structure must match the beginning of XPVFM in sv.h  */
12ba47ec9dSmillert 
134a4f25f9Sdownsj struct xpvcv {
140dc2eaceSmillert     _XPV_HEAD;
150dc2eaceSmillert     _XPVCV_COMMON;
164a4f25f9Sdownsj };
174a4f25f9Sdownsj 
18e2e5c5d3Smillert /*
19eac174f2Safresh1 =for apidoc Ayh||CV
2079cd0b9aSmillert 
2156d68f1eSafresh1 =for apidoc ADmnU||Nullcv
22e2e5c5d3Smillert Null CV pointer.
23e2e5c5d3Smillert 
240dc2eaceSmillert (deprecated - use C<(CV *)NULL> instead)
250dc2eaceSmillert 
26e2e5c5d3Smillert =for apidoc Am|HV*|CvSTASH|CV* cv
2748950c12Ssthen Returns the stash of the CV.  A stash is the symbol table hash, containing
2848950c12Ssthen the package-scoped variables in the package where the subroutine was defined.
2948950c12Ssthen For more information, see L<perlguts>.
3048950c12Ssthen 
3148950c12Ssthen This also has a special use with XS AUTOLOAD subs.
3248950c12Ssthen See L<perlguts/Autoloading with XSUBs>.
33e2e5c5d3Smillert 
34e2e5c5d3Smillert =cut
35e2e5c5d3Smillert */
36e2e5c5d3Smillert 
370dc2eaceSmillert #ifndef PERL_CORE
384a4f25f9Sdownsj #  define Nullcv Null(CV*)
390dc2eaceSmillert #endif
404a4f25f9Sdownsj 
41*e0680481Safresh1 #define CvSTASH(sv)	(MUTABLE_HV(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash))
4248950c12Ssthen #define CvSTASH_set(cv,st) Perl_cvstash_set(aTHX_ cv, st)
43df042708Smillert #define CvSTART(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start
44df042708Smillert #define CvROOT(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root
45df042708Smillert #define CvXSUB(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub
46df042708Smillert #define CvXSUBANY(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany
4756d68f1eSafresh1 #define CvGV(sv)	Perl_CvGV(aTHX_ (CV *)(sv))
4848950c12Ssthen #define CvGV_set(cv,gv)	Perl_cvgv_set(aTHX_ cv, gv)
49b8851fccSafresh1 #define CvHASGV(cv)	cBOOL(SvANY(cv)->xcv_gv_u.xcv_gv)
50df042708Smillert #define CvFILE(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
5179cd0b9aSmillert #ifdef USE_ITHREADS
5248950c12Ssthen #  define CvFILE_set_from_cop(sv, cop)	\
5348950c12Ssthen     (CvFILE(sv) = savepv(CopFILE(cop)), CvDYNFILE_on(sv))
5479cd0b9aSmillert #else
5548950c12Ssthen #  define CvFILE_set_from_cop(sv, cop)	\
5648950c12Ssthen     (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv))
5779cd0b9aSmillert #endif
5879cd0b9aSmillert #define CvFILEGV(sv)	(gv_fetchfile(CvFILE(sv)))
5956d68f1eSafresh1 #define CvDEPTH(sv)	(*Perl_CvDEPTH((const CV *)sv))
60b8851fccSafresh1 /* For use when you only have a XPVCV*, not a real CV*.
6156d68f1eSafresh1    Must be assert protected as in Perl_CvDEPTH before use. */
62b8851fccSafresh1 #define CvDEPTHunsafe(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_depth
63b8851fccSafresh1 
64b8851fccSafresh1 /* these CvPADLIST/CvRESERVED asserts can be reverted one day, once stabilized */
65b8851fccSafresh1 #define CvPADLIST(sv)	  (*(assert_(!CvISXSUB((CV*)(sv))) \
66b8851fccSafresh1         &(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist)))
67b8851fccSafresh1 /* CvPADLIST_set is not public API, it can be removed one day, once stabilized */
68b8851fccSafresh1 #ifdef DEBUGGING
69b8851fccSafresh1 #  define CvPADLIST_set(sv, padlist) Perl_set_padlist((CV*)sv, padlist)
70b8851fccSafresh1 #else
71b8851fccSafresh1 #  define CvPADLIST_set(sv, padlist) (CvPADLIST(sv) = (padlist))
72b8851fccSafresh1 #endif
73b8851fccSafresh1 #define CvHSCXT(sv)	  *(assert_(CvISXSUB((CV*)(sv))) \
74b8851fccSafresh1         &(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_hscxt))
75b8851fccSafresh1 #ifdef DEBUGGING
76b8851fccSafresh1 #  if PTRSIZE == 8
77b8851fccSafresh1 #    define PoisonPADLIST(sv) \
78b8851fccSafresh1         (((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist = (PADLIST *)UINT64_C(0xEFEFEFEFEFEFEFEF))
79b8851fccSafresh1 #  elif PTRSIZE == 4
80b8851fccSafresh1 #    define PoisonPADLIST(sv) \
81b8851fccSafresh1         (((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist_u.xcv_padlist = (PADLIST *)0xEFEFEFEF)
82b8851fccSafresh1 #  else
83b8851fccSafresh1 #    error unknown pointer size
84b8851fccSafresh1 #  endif
85b8851fccSafresh1 #else
86b8851fccSafresh1 #  define PoisonPADLIST(sv) NOOP
87b8851fccSafresh1 #endif
88b8851fccSafresh1 
89df042708Smillert #define CvOUTSIDE(sv)	  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside
90df042708Smillert #define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq
91b8851fccSafresh1 #define CvFLAGS(sv)	  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags
924a4f25f9Sdownsj 
9348950c12Ssthen /* These two are sometimes called on non-CVs */
9448950c12Ssthen #define CvPROTO(sv)                               \
9548950c12Ssthen         (                                          \
9648950c12Ssthen          SvPOK(sv)                                  \
9748950c12Ssthen           ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \
9848950c12Ssthen              ? SvEND(sv)+1 : SvPVX_const(sv)          \
9948950c12Ssthen           : NULL                                       \
10048950c12Ssthen         )
10148950c12Ssthen #define CvPROTOLEN(sv)	                          \
10248950c12Ssthen         (                                          \
10348950c12Ssthen          SvPOK(sv)                                  \
10448950c12Ssthen           ? SvTYPE(sv) == SVt_PVCV && CvAUTOLOAD(sv) \
10548950c12Ssthen              ? SvLEN(sv)-SvCUR(sv)-2                  \
10648950c12Ssthen              : SvCUR(sv)                               \
10748950c12Ssthen           : 0                                           \
10848950c12Ssthen         )
10948950c12Ssthen 
110*e0680481Safresh1 /* CV has the `:method` attribute. This used to be called CVf_METHOD but is
111*e0680481Safresh1  * renamed to avoid collision with CVf_IsMETHOD */
112*e0680481Safresh1 #define CVf_NOWARN_AMBIGUOUS	0x0001
113*e0680481Safresh1 
11448950c12Ssthen #define CVf_LVALUE	0x0002  /* CV return value can be used as lvalue */
11548950c12Ssthen #define CVf_CONST	0x0004  /* inlinable sub */
11648950c12Ssthen #define CVf_ISXSUB	0x0008	/* CV is an XSUB, not pure perl.  */
1177bfa9f44Smillert 
1187bfa9f44Smillert #define CVf_WEAKOUTSIDE	0x0010  /* CvOUTSIDE isn't ref counted */
1197bfa9f44Smillert #define CVf_CLONE	0x0020	/* anon CV uses external lexicals */
1207bfa9f44Smillert #define CVf_CLONED	0x0040	/* a clone of one of those */
12148950c12Ssthen #define CVf_ANON	0x0080	/* CV is not pointed to by a GV */
1227bfa9f44Smillert #define CVf_UNIQUE	0x0100	/* sub is only called once (eg PL_main_cv,
123*e0680481Safresh1                                    require, eval). */
1247bfa9f44Smillert #define CVf_NODEBUG	0x0200	/* no DB::sub indirection for this CV
125ba47ec9dSmillert                                    (esp. useful for special XSUBs) */
12648950c12Ssthen #define CVf_CVGV_RC	0x0400	/* CvGV is reference counted */
127eac174f2Safresh1 #if defined(PERL_CORE) || defined(PERL_EXT)
128e9ce3842Safresh1 # define CVf_SLABBED	0x0800	/* Holds refcount on op slab  */
129e9ce3842Safresh1 #endif
130b46d8ef2Safresh1 #define CVf_DYNFILE	0x1000	/* The filename is malloced  */
13148950c12Ssthen #define CVf_AUTOLOAD	0x2000	/* SvPVX contains AUTOLOADed sub name  */
132e9ce3842Safresh1 #define CVf_HASEVAL	0x4000	/* contains string eval  */
133e9ce3842Safresh1 #define CVf_NAMED	0x8000  /* Has a name HEK */
134b8851fccSafresh1 #define CVf_LEXICAL	0x10000 /* Omit package from name */
135b8851fccSafresh1 #define CVf_ANONCONST	0x20000 /* :const - create anonconst op */
136eac174f2Safresh1 #define CVf_SIGNATURE   0x40000 /* CV uses a signature */
137*e0680481Safresh1 #define CVf_REFCOUNTED_ANYSV 0x80000 /* CvXSUBANY().any_sv is refcounted */
138*e0680481Safresh1 #define CVf_IsMETHOD    0x100000 /* CV is a (real) method of a real class. Not
139*e0680481Safresh1                                    to be confused with what used to be called
140*e0680481Safresh1                                    CVf_METHOD; now CVf_NOWARN_AMBIGUOUS */
141f64b279aSmillert 
14279cd0b9aSmillert /* This symbol for optimised communication between toke.c and op.c: */
143*e0680481Safresh1 #define CVf_BUILTIN_ATTRS	(CVf_NOWARN_AMBIGUOUS|CVf_LVALUE|CVf_ANONCONST)
1444a4f25f9Sdownsj 
1454a4f25f9Sdownsj #define CvCLONE(cv)		(CvFLAGS(cv) & CVf_CLONE)
1464a4f25f9Sdownsj #define CvCLONE_on(cv)		(CvFLAGS(cv) |= CVf_CLONE)
1474a4f25f9Sdownsj #define CvCLONE_off(cv)		(CvFLAGS(cv) &= ~CVf_CLONE)
1484a4f25f9Sdownsj 
1494a4f25f9Sdownsj #define CvCLONED(cv)		(CvFLAGS(cv) & CVf_CLONED)
1504a4f25f9Sdownsj #define CvCLONED_on(cv)		(CvFLAGS(cv) |= CVf_CLONED)
1514a4f25f9Sdownsj #define CvCLONED_off(cv)	(CvFLAGS(cv) &= ~CVf_CLONED)
1524a4f25f9Sdownsj 
1534a4f25f9Sdownsj #define CvANON(cv)		(CvFLAGS(cv) & CVf_ANON)
1544a4f25f9Sdownsj #define CvANON_on(cv)		(CvFLAGS(cv) |= CVf_ANON)
1554a4f25f9Sdownsj #define CvANON_off(cv)		(CvFLAGS(cv) &= ~CVf_ANON)
1564a4f25f9Sdownsj 
157e9ce3842Safresh1 /* CvEVAL or CvSPECIAL */
158ba47ec9dSmillert #define CvUNIQUE(cv)		(CvFLAGS(cv) & CVf_UNIQUE)
159ba47ec9dSmillert #define CvUNIQUE_on(cv)		(CvFLAGS(cv) |= CVf_UNIQUE)
160ba47ec9dSmillert #define CvUNIQUE_off(cv)	(CvFLAGS(cv) &= ~CVf_UNIQUE)
161ba47ec9dSmillert 
162ba47ec9dSmillert #define CvNODEBUG(cv)		(CvFLAGS(cv) & CVf_NODEBUG)
163ba47ec9dSmillert #define CvNODEBUG_on(cv)	(CvFLAGS(cv) |= CVf_NODEBUG)
164ba47ec9dSmillert #define CvNODEBUG_off(cv)	(CvFLAGS(cv) &= ~CVf_NODEBUG)
1656345ca90Smillert 
166*e0680481Safresh1 #define CvNOWARN_AMBIGUOUS(cv)		(CvFLAGS(cv) & CVf_NOWARN_AMBIGUOUS)
167*e0680481Safresh1 #define CvNOWARN_AMBIGUOUS_on(cv)	(CvFLAGS(cv) |= CVf_NOWARN_AMBIGUOUS)
168*e0680481Safresh1 #define CvNOWARN_AMBIGUOUS_off(cv)	(CvFLAGS(cv) &= ~CVf_NOWARN_AMBIGUOUS)
1696345ca90Smillert 
170e2e5c5d3Smillert #define CvLVALUE(cv)		(CvFLAGS(cv) & CVf_LVALUE)
171e2e5c5d3Smillert #define CvLVALUE_on(cv)		(CvFLAGS(cv) |= CVf_LVALUE)
172e2e5c5d3Smillert #define CvLVALUE_off(cv)	(CvFLAGS(cv) &= ~CVf_LVALUE)
173e2e5c5d3Smillert 
174e9ce3842Safresh1 /* eval or PL_main_cv */
1756345ca90Smillert #define CvEVAL(cv)		(CvUNIQUE(cv) && !SvFAKE(cv))
1766345ca90Smillert #define CvEVAL_on(cv)		(CvUNIQUE_on(cv),SvFAKE_off(cv))
1776345ca90Smillert #define CvEVAL_off(cv)		CvUNIQUE_off(cv)
1786345ca90Smillert 
1797bfa9f44Smillert /* BEGIN|CHECK|INIT|UNITCHECK|END */
1806345ca90Smillert #define CvSPECIAL(cv)		(CvUNIQUE(cv) && SvFAKE(cv))
1816345ca90Smillert #define CvSPECIAL_on(cv)	(CvUNIQUE_on(cv),SvFAKE_on(cv))
1826345ca90Smillert #define CvSPECIAL_off(cv)	(CvUNIQUE_off(cv),SvFAKE_off(cv))
18379cd0b9aSmillert 
18479cd0b9aSmillert #define CvCONST(cv)		(CvFLAGS(cv) & CVf_CONST)
18579cd0b9aSmillert #define CvCONST_on(cv)		(CvFLAGS(cv) |= CVf_CONST)
18679cd0b9aSmillert #define CvCONST_off(cv)		(CvFLAGS(cv) &= ~CVf_CONST)
18779cd0b9aSmillert 
188f64b279aSmillert #define CvWEAKOUTSIDE(cv)	(CvFLAGS(cv) & CVf_WEAKOUTSIDE)
189f64b279aSmillert #define CvWEAKOUTSIDE_on(cv)	(CvFLAGS(cv) |= CVf_WEAKOUTSIDE)
190f64b279aSmillert #define CvWEAKOUTSIDE_off(cv)	(CvFLAGS(cv) &= ~CVf_WEAKOUTSIDE)
191f64b279aSmillert 
1927bfa9f44Smillert #define CvISXSUB(cv)		(CvFLAGS(cv) & CVf_ISXSUB)
1937bfa9f44Smillert #define CvISXSUB_on(cv)		(CvFLAGS(cv) |= CVf_ISXSUB)
1947bfa9f44Smillert #define CvISXSUB_off(cv)	(CvFLAGS(cv) &= ~CVf_ISXSUB)
1957bfa9f44Smillert 
19648950c12Ssthen #define CvCVGV_RC(cv)		(CvFLAGS(cv) & CVf_CVGV_RC)
19748950c12Ssthen #define CvCVGV_RC_on(cv)	(CvFLAGS(cv) |= CVf_CVGV_RC)
19848950c12Ssthen #define CvCVGV_RC_off(cv)	(CvFLAGS(cv) &= ~CVf_CVGV_RC)
19948950c12Ssthen 
200e9ce3842Safresh1 #ifdef PERL_CORE
201e9ce3842Safresh1 # define CvSLABBED(cv)		(CvFLAGS(cv) & CVf_SLABBED)
202e9ce3842Safresh1 # define CvSLABBED_on(cv)	(CvFLAGS(cv) |= CVf_SLABBED)
203e9ce3842Safresh1 # define CvSLABBED_off(cv)	(CvFLAGS(cv) &= ~CVf_SLABBED)
204e9ce3842Safresh1 #endif
205e9ce3842Safresh1 
20648950c12Ssthen #define CvDYNFILE(cv)		(CvFLAGS(cv) & CVf_DYNFILE)
20748950c12Ssthen #define CvDYNFILE_on(cv)	(CvFLAGS(cv) |= CVf_DYNFILE)
20848950c12Ssthen #define CvDYNFILE_off(cv)	(CvFLAGS(cv) &= ~CVf_DYNFILE)
20948950c12Ssthen 
21048950c12Ssthen #define CvAUTOLOAD(cv)		(CvFLAGS(cv) & CVf_AUTOLOAD)
21148950c12Ssthen #define CvAUTOLOAD_on(cv)	(CvFLAGS(cv) |= CVf_AUTOLOAD)
21248950c12Ssthen #define CvAUTOLOAD_off(cv)	(CvFLAGS(cv) &= ~CVf_AUTOLOAD)
21348950c12Ssthen 
214e9ce3842Safresh1 #define CvHASEVAL(cv)		(CvFLAGS(cv) & CVf_HASEVAL)
215e9ce3842Safresh1 #define CvHASEVAL_on(cv)	(CvFLAGS(cv) |= CVf_HASEVAL)
216e9ce3842Safresh1 #define CvHASEVAL_off(cv)	(CvFLAGS(cv) &= ~CVf_HASEVAL)
217e9ce3842Safresh1 
218e9ce3842Safresh1 #define CvNAMED(cv)		(CvFLAGS(cv) & CVf_NAMED)
219e9ce3842Safresh1 #define CvNAMED_on(cv)		(CvFLAGS(cv) |= CVf_NAMED)
220e9ce3842Safresh1 #define CvNAMED_off(cv)		(CvFLAGS(cv) &= ~CVf_NAMED)
221e9ce3842Safresh1 
222b8851fccSafresh1 #define CvLEXICAL(cv)		(CvFLAGS(cv) & CVf_LEXICAL)
223b8851fccSafresh1 #define CvLEXICAL_on(cv)	(CvFLAGS(cv) |= CVf_LEXICAL)
224b8851fccSafresh1 #define CvLEXICAL_off(cv)	(CvFLAGS(cv) &= ~CVf_LEXICAL)
225b8851fccSafresh1 
226b8851fccSafresh1 #define CvANONCONST(cv)		(CvFLAGS(cv) & CVf_ANONCONST)
227b8851fccSafresh1 #define CvANONCONST_on(cv)	(CvFLAGS(cv) |= CVf_ANONCONST)
228b8851fccSafresh1 #define CvANONCONST_off(cv)	(CvFLAGS(cv) &= ~CVf_ANONCONST)
229b8851fccSafresh1 
230eac174f2Safresh1 #define CvSIGNATURE(cv)		(CvFLAGS(cv) & CVf_SIGNATURE)
231eac174f2Safresh1 #define CvSIGNATURE_on(cv)	(CvFLAGS(cv) |= CVf_SIGNATURE)
232eac174f2Safresh1 #define CvSIGNATURE_off(cv)	(CvFLAGS(cv) &= ~CVf_SIGNATURE)
233eac174f2Safresh1 
234*e0680481Safresh1 /*
235*e0680481Safresh1 
236*e0680481Safresh1 =for apidoc m|bool|CvREFCOUNTED_ANYSV|CV *cv
237*e0680481Safresh1 
238*e0680481Safresh1 If true, indicates that the C<CvXSUBANY(cv).any_sv> member contains an SV
239*e0680481Safresh1 pointer whose reference count should be decremented when the CV itself is
240*e0680481Safresh1 freed.  In addition, C<cv_clone()> will increment the reference count, and
241*e0680481Safresh1 C<sv_dup()> will duplicate the entire pointed-to SV if this flag is set.
242*e0680481Safresh1 
243*e0680481Safresh1 Any CV that wraps an XSUB has an C<ANY> union that the XSUB function is free
244*e0680481Safresh1 to use for its own purposes.  It may be the case that the code wishes to store
245*e0680481Safresh1 an SV in the C<any_sv> member of this union.  By setting this flag, this SV
246*e0680481Safresh1 reference will be properly reclaimed or duplicated when the CV itself is.
247*e0680481Safresh1 
248*e0680481Safresh1 =for apidoc m|void|CvREFCOUNTED_ANYSV_on|CV *cv
249*e0680481Safresh1 
250*e0680481Safresh1 Helper macro to turn on the C<CvREFCOUNTED_ANYSV> flag.
251*e0680481Safresh1 
252*e0680481Safresh1 =for apidoc m|void|CvREFCOUNTED_ANYSV_off|CV *cv
253*e0680481Safresh1 
254*e0680481Safresh1 Helper macro to turn off the C<CvREFCOUNTED_ANYSV> flag.
255*e0680481Safresh1 
256*e0680481Safresh1 =cut
257*e0680481Safresh1 */
258*e0680481Safresh1 
259*e0680481Safresh1 #define CvREFCOUNTED_ANYSV(cv)          (CvFLAGS(cv) & CVf_REFCOUNTED_ANYSV)
260*e0680481Safresh1 #define CvREFCOUNTED_ANYSV_on(cv)       (CvFLAGS(cv) |= CVf_REFCOUNTED_ANYSV)
261*e0680481Safresh1 #define CvREFCOUNTED_ANYSV_off(cv)      (CvFLAGS(cv) &= ~CVf_REFCOUNTED_ANYSV)
262*e0680481Safresh1 
263*e0680481Safresh1 #define CvIsMETHOD(cv)		(CvFLAGS(cv) & CVf_IsMETHOD)
264*e0680481Safresh1 #define CvIsMETHOD_on(cv)	(CvFLAGS(cv) |= CVf_IsMETHOD)
265*e0680481Safresh1 #define CvIsMETHOD_off(cv)	(CvFLAGS(cv) &= ~CVf_IsMETHOD)
266*e0680481Safresh1 
267*e0680481Safresh1 /* Back-compat */
268*e0680481Safresh1 #ifndef PERL_CORE
269*e0680481Safresh1 #  define CVf_METHOD            CVf_NOWARN_AMBIGUOUS
270*e0680481Safresh1 #  define CvMETHOD(cv)          CvNOWARN_AMBIGUOUS(cv)
271*e0680481Safresh1 #  define CvMETHOD_on(cv)       CvNOWARN_AMBIGUOUS_on(cv)
272*e0680481Safresh1 #  define CvMETHOD_off(cv)      CvNOWARN_AMBIGUOUS_off(cv)
273*e0680481Safresh1 #endif
274*e0680481Safresh1 
2757bfa9f44Smillert /* Flags for newXS_flags  */
2767bfa9f44Smillert #define XS_DYNAMIC_FILENAME	0x01	/* The filename isn't static  */
277f64b279aSmillert 
278e9ce3842Safresh1 PERL_STATIC_INLINE HEK *
CvNAME_HEK(CV * sv)279e9ce3842Safresh1 CvNAME_HEK(CV *sv)
280e9ce3842Safresh1 {
281e9ce3842Safresh1     return CvNAMED(sv)
282e9ce3842Safresh1         ? ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv_u.xcv_hek
283e9ce3842Safresh1         : 0;
284e9ce3842Safresh1 }
2859f11ffb7Safresh1 
2869f11ffb7Safresh1 /* helper for the common pattern:
2879f11ffb7Safresh1    CvNAMED(sv) ? CvNAME_HEK((CV *)sv) : GvNAME_HEK(CvGV(sv))
2889f11ffb7Safresh1 */
2899f11ffb7Safresh1 #define CvGvNAME_HEK(sv) ( \
2909f11ffb7Safresh1         CvNAMED((CV*)sv) ? \
2919f11ffb7Safresh1             ((XPVCV*)MUTABLE_PTR(SvANY((SV*)sv)))->xcv_gv_u.xcv_hek\
2929f11ffb7Safresh1             : GvNAME_HEK(CvGV( (SV*) sv)) \
2939f11ffb7Safresh1         )
2949f11ffb7Safresh1 
2959f11ffb7Safresh1 /* This lowers the reference count of the previous value, but does *not*
296e9ce3842Safresh1    increment the reference count of the new value. */
297e9ce3842Safresh1 #define CvNAME_HEK_set(cv, hek) ( \
298e9ce3842Safresh1         CvNAME_HEK((CV *)(cv))						 \
299e9ce3842Safresh1             ? unshare_hek(SvANY((CV *)(cv))->xcv_gv_u.xcv_hek)	  \
300e9ce3842Safresh1             : (void)0,						   \
301e9ce3842Safresh1         ((XPVCV*)MUTABLE_PTR(SvANY(cv)))->xcv_gv_u.xcv_hek = (hek), \
302e9ce3842Safresh1         CvNAMED_on(cv)						     \
303e9ce3842Safresh1     )
304e9ce3842Safresh1 
30579cd0b9aSmillert /*
30679cd0b9aSmillert 
307f64b279aSmillert =for apidoc m|bool|CvWEAKOUTSIDE|CV *cv
30879cd0b9aSmillert 
309f64b279aSmillert Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
310f64b279aSmillert CV (if any).  Because pointers to anonymous sub prototypes are
311f64b279aSmillert stored in C<&> pad slots, it is a possible to get a circular reference,
312f64b279aSmillert with the parent pointing to the child and vice-versa.  To avoid the
313f64b279aSmillert ensuing memory leak, we do not increment the reference count of the CV
314f64b279aSmillert pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
315f64b279aSmillert has a C<&> pad slot pointing back to us.  In this case, we set the
316f64b279aSmillert C<CvWEAKOUTSIDE> flag in the child.  This allows us to determine under what
317f64b279aSmillert circumstances we should decrement the refcount of the parent when freeing
318f64b279aSmillert the child.
31979cd0b9aSmillert 
320ad15181aSmillert There is a further complication with non-closure anonymous subs (i.e. those
321f64b279aSmillert that do not refer to any lexicals outside that sub).  In this case, the
322f64b279aSmillert anonymous prototype is shared rather than being cloned.  This has the
323f64b279aSmillert consequence that the parent may be freed while there are still active
324b8851fccSafresh1 children, I<e.g.>,
32579cd0b9aSmillert 
326f64b279aSmillert     BEGIN { $a = sub { eval '$x' } }
32779cd0b9aSmillert 
328f64b279aSmillert In this case, the BEGIN is freed immediately after execution since there
329f64b279aSmillert are no active references to it: the anon sub prototype has
330f64b279aSmillert C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
331f64b279aSmillert CV, so it doesn't contribute to BEGIN's refcount either.  When $a is
332f64b279aSmillert executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
333f64b279aSmillert and the freed BEGIN is accessed.
33479cd0b9aSmillert 
335f64b279aSmillert To avoid this, whenever a CV and its associated pad is freed, any
336f64b279aSmillert C<&> entries in the pad are explicitly removed from the pad, and if the
337f64b279aSmillert refcount of the pointed-to anon sub is still positive, then that
338f64b279aSmillert child's C<CvOUTSIDE> is set to point to its grandparent.  This will only
339f64b279aSmillert occur in the single specific case of a non-closure anon prototype
340f64b279aSmillert having one or more active references (such as C<$a> above).
34179cd0b9aSmillert 
342f64b279aSmillert One other thing to consider is that a CV may be merely undefined
343f64b279aSmillert rather than freed, eg C<undef &foo>.  In this case, its refcount may
344f64b279aSmillert not have reached zero, but we still delete its pad and its C<CvROOT> etc.
345f64b279aSmillert Since various children may still have their C<CvOUTSIDE> pointing at this
346f64b279aSmillert undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
347f64b279aSmillert the chain of lexical scopes is unbroken.  For example, the following
348f64b279aSmillert should print 123:
34979cd0b9aSmillert 
350f64b279aSmillert     my $x = 123;
351f64b279aSmillert     sub tmp { sub { eval '$x' } }
352f64b279aSmillert     my $a = tmp();
353f64b279aSmillert     undef &tmp;
354f64b279aSmillert     print  $a->();
35579cd0b9aSmillert 
35679cd0b9aSmillert =cut
35779cd0b9aSmillert */
3587bfa9f44Smillert 
35948950c12Ssthen typedef OP *(*Perl_call_checker)(pTHX_ OP *, GV *, SV *);
36048950c12Ssthen 
361b8851fccSafresh1 #define CALL_CHECKER_REQUIRE_GV	MGf_REQUIRE_GV
362b8851fccSafresh1 
363b8851fccSafresh1 #define CV_NAME_NOTQUAL		1
364b8851fccSafresh1 
365b8851fccSafresh1 #ifdef PERL_CORE
366b8851fccSafresh1 # define CV_UNDEF_KEEP_NAME	1
367b8851fccSafresh1 #endif
368b8851fccSafresh1 
3697bfa9f44Smillert /*
370e9ce3842Safresh1  * ex: set ts=8 sts=4 sw=4 et:
3717bfa9f44Smillert  */
372