| 1 |
root |
1.1 |
/* cv.h |
| 2 |
|
|
* |
| 3 |
|
|
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, |
| 4 |
|
|
* 2000, 2001, 2002, 2003, 2004, by Larry Wall and others |
| 5 |
|
|
* |
| 6 |
|
|
* You may distribute under the terms of either the GNU General Public |
| 7 |
|
|
* License or the Artistic License, as specified in the README file. |
| 8 |
|
|
* |
| 9 |
|
|
*/ |
| 10 |
|
|
|
| 11 |
|
|
/* This structure must match XPVCV in B/C.pm and the beginning of XPVFM |
| 12 |
|
|
* in sv.h */ |
| 13 |
|
|
|
| 14 |
|
|
struct xpvcv { |
| 15 |
|
|
char * xpv_pv; /* pointer to malloced string (for prototype) */ |
| 16 |
|
|
STRLEN xpv_cur; /* length of xp_pv as a C string */ |
| 17 |
|
|
STRLEN xpv_len; /* allocated size */ |
| 18 |
|
|
IV xof_off; /* integer value */ |
| 19 |
|
|
NV xnv_nv; /* numeric value, if any */ |
| 20 |
|
|
MAGIC* xmg_magic; /* magic for scalar array */ |
| 21 |
|
|
HV* xmg_stash; /* class package */ |
| 22 |
|
|
|
| 23 |
|
|
HV * xcv_stash; |
| 24 |
|
|
OP * xcv_start; |
| 25 |
|
|
OP * xcv_root; |
| 26 |
|
|
void (*xcv_xsub) (pTHX_ CV*); |
| 27 |
|
|
ANY xcv_xsubany; |
| 28 |
|
|
GV * xcv_gv; |
| 29 |
|
|
char * xcv_file; |
| 30 |
|
|
long xcv_depth; /* >= 2 indicates recursive call */ |
| 31 |
|
|
PADLIST * xcv_padlist; |
| 32 |
|
|
CV * xcv_outside; |
| 33 |
|
|
#ifdef USE_5005THREADS |
| 34 |
|
|
perl_mutex *xcv_mutexp; |
| 35 |
|
|
struct perl_thread *xcv_owner; /* current owner thread */ |
| 36 |
|
|
#endif /* USE_5005THREADS */ |
| 37 |
|
|
cv_flags_t xcv_flags; |
| 38 |
|
|
U32 xcv_outside_seq; /* the COP sequence (at the point of our |
| 39 |
|
|
* compilation) in the lexically enclosing |
| 40 |
|
|
* sub */ |
| 41 |
|
|
}; |
| 42 |
|
|
|
| 43 |
|
|
/* |
| 44 |
|
|
=head1 Handy Values |
| 45 |
|
|
|
| 46 |
|
|
=for apidoc AmU||Nullcv |
| 47 |
|
|
Null CV pointer. |
| 48 |
|
|
|
| 49 |
|
|
=head1 CV Manipulation Functions |
| 50 |
|
|
|
| 51 |
|
|
=for apidoc Am|HV*|CvSTASH|CV* cv |
| 52 |
|
|
Returns the stash of the CV. |
| 53 |
|
|
|
| 54 |
|
|
=cut |
| 55 |
|
|
*/ |
| 56 |
|
|
|
| 57 |
|
|
#define Nullcv Null(CV*) |
| 58 |
|
|
|
| 59 |
|
|
#define CvSTASH(sv) ((XPVCV*)SvANY(sv))->xcv_stash |
| 60 |
|
|
#define CvSTART(sv) ((XPVCV*)SvANY(sv))->xcv_start |
| 61 |
|
|
#define CvROOT(sv) ((XPVCV*)SvANY(sv))->xcv_root |
| 62 |
|
|
#define CvXSUB(sv) ((XPVCV*)SvANY(sv))->xcv_xsub |
| 63 |
|
|
#define CvXSUBANY(sv) ((XPVCV*)SvANY(sv))->xcv_xsubany |
| 64 |
|
|
#define CvGV(sv) ((XPVCV*)SvANY(sv))->xcv_gv |
| 65 |
|
|
#define CvFILE(sv) ((XPVCV*)SvANY(sv))->xcv_file |
| 66 |
|
|
#ifdef USE_ITHREADS |
| 67 |
|
|
# define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = savepv(CopFILE(cop))) |
| 68 |
|
|
#else |
| 69 |
|
|
# define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop)) |
| 70 |
|
|
#endif |
| 71 |
|
|
#define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv))) |
| 72 |
|
|
#define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xcv_depth |
| 73 |
|
|
#define CvPADLIST(sv) ((XPVCV*)SvANY(sv))->xcv_padlist |
| 74 |
|
|
#define CvOUTSIDE(sv) ((XPVCV*)SvANY(sv))->xcv_outside |
| 75 |
|
|
#ifdef USE_5005THREADS |
| 76 |
|
|
#define CvMUTEXP(sv) ((XPVCV*)SvANY(sv))->xcv_mutexp |
| 77 |
|
|
#define CvOWNER(sv) ((XPVCV*)SvANY(sv))->xcv_owner |
| 78 |
|
|
#endif /* USE_5005THREADS */ |
| 79 |
|
|
#define CvFLAGS(sv) ((XPVCV*)SvANY(sv))->xcv_flags |
| 80 |
|
|
#define CvOUTSIDE_SEQ(sv) ((XPVCV*)SvANY(sv))->xcv_outside_seq |
| 81 |
|
|
|
| 82 |
|
|
#define CVf_CLONE 0x0001 /* anon CV uses external lexicals */ |
| 83 |
|
|
#define CVf_CLONED 0x0002 /* a clone of one of those */ |
| 84 |
|
|
#define CVf_ANON 0x0004 /* CvGV() can't be trusted */ |
| 85 |
|
|
#define CVf_OLDSTYLE 0x0008 |
| 86 |
|
|
#define CVf_UNIQUE 0x0010 /* sub is only called once (eg PL_main_cv, |
| 87 |
|
|
* require, eval). Not to be confused |
| 88 |
|
|
* with the GVf_UNIQUE flag associated |
| 89 |
|
|
* with the :unique attribute */ |
| 90 |
|
|
#define CVf_NODEBUG 0x0020 /* no DB::sub indirection for this CV |
| 91 |
|
|
(esp. useful for special XSUBs) */ |
| 92 |
|
|
#define CVf_METHOD 0x0040 /* CV is explicitly marked as a method */ |
| 93 |
|
|
#define CVf_LOCKED 0x0080 /* CV locks itself or first arg on entry */ |
| 94 |
|
|
#define CVf_LVALUE 0x0100 /* CV return value can be used as lvalue */ |
| 95 |
|
|
#define CVf_CONST 0x0200 /* inlinable sub */ |
| 96 |
|
|
#define CVf_WEAKOUTSIDE 0x0400 /* CvOUTSIDE isn't ref counted */ |
| 97 |
|
|
|
| 98 |
|
|
/* This symbol for optimised communication between toke.c and op.c: */ |
| 99 |
|
|
#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LOCKED|CVf_LVALUE) |
| 100 |
|
|
|
| 101 |
|
|
#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) |
| 102 |
|
|
#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) |
| 103 |
|
|
#define CvCLONE_off(cv) (CvFLAGS(cv) &= ~CVf_CLONE) |
| 104 |
|
|
|
| 105 |
|
|
#define CvCLONED(cv) (CvFLAGS(cv) & CVf_CLONED) |
| 106 |
|
|
#define CvCLONED_on(cv) (CvFLAGS(cv) |= CVf_CLONED) |
| 107 |
|
|
#define CvCLONED_off(cv) (CvFLAGS(cv) &= ~CVf_CLONED) |
| 108 |
|
|
|
| 109 |
|
|
#define CvANON(cv) (CvFLAGS(cv) & CVf_ANON) |
| 110 |
|
|
#define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON) |
| 111 |
|
|
#define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON) |
| 112 |
|
|
|
| 113 |
|
|
#ifdef PERL_XSUB_OLDSTYLE |
| 114 |
|
|
#define CvOLDSTYLE(cv) (CvFLAGS(cv) & CVf_OLDSTYLE) |
| 115 |
|
|
#define CvOLDSTYLE_on(cv) (CvFLAGS(cv) |= CVf_OLDSTYLE) |
| 116 |
|
|
#define CvOLDSTYLE_off(cv) (CvFLAGS(cv) &= ~CVf_OLDSTYLE) |
| 117 |
|
|
#endif |
| 118 |
|
|
|
| 119 |
|
|
#define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE) |
| 120 |
|
|
#define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE) |
| 121 |
|
|
#define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE) |
| 122 |
|
|
|
| 123 |
|
|
#define CvNODEBUG(cv) (CvFLAGS(cv) & CVf_NODEBUG) |
| 124 |
|
|
#define CvNODEBUG_on(cv) (CvFLAGS(cv) |= CVf_NODEBUG) |
| 125 |
|
|
#define CvNODEBUG_off(cv) (CvFLAGS(cv) &= ~CVf_NODEBUG) |
| 126 |
|
|
|
| 127 |
|
|
#define CvMETHOD(cv) (CvFLAGS(cv) & CVf_METHOD) |
| 128 |
|
|
#define CvMETHOD_on(cv) (CvFLAGS(cv) |= CVf_METHOD) |
| 129 |
|
|
#define CvMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_METHOD) |
| 130 |
|
|
|
| 131 |
|
|
#define CvLOCKED(cv) (CvFLAGS(cv) & CVf_LOCKED) |
| 132 |
|
|
#define CvLOCKED_on(cv) (CvFLAGS(cv) |= CVf_LOCKED) |
| 133 |
|
|
#define CvLOCKED_off(cv) (CvFLAGS(cv) &= ~CVf_LOCKED) |
| 134 |
|
|
|
| 135 |
|
|
#define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE) |
| 136 |
|
|
#define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE) |
| 137 |
|
|
#define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE) |
| 138 |
|
|
|
| 139 |
|
|
#define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv)) |
| 140 |
|
|
#define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv)) |
| 141 |
|
|
#define CvEVAL_off(cv) CvUNIQUE_off(cv) |
| 142 |
|
|
|
| 143 |
|
|
/* BEGIN|CHECK|INIT|END */ |
| 144 |
|
|
#define CvSPECIAL(cv) (CvUNIQUE(cv) && SvFAKE(cv)) |
| 145 |
|
|
#define CvSPECIAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_on(cv)) |
| 146 |
|
|
#define CvSPECIAL_off(cv) (CvUNIQUE_off(cv),SvFAKE_off(cv)) |
| 147 |
|
|
|
| 148 |
|
|
#define CvCONST(cv) (CvFLAGS(cv) & CVf_CONST) |
| 149 |
|
|
#define CvCONST_on(cv) (CvFLAGS(cv) |= CVf_CONST) |
| 150 |
|
|
#define CvCONST_off(cv) (CvFLAGS(cv) &= ~CVf_CONST) |
| 151 |
|
|
|
| 152 |
|
|
#define CvWEAKOUTSIDE(cv) (CvFLAGS(cv) & CVf_WEAKOUTSIDE) |
| 153 |
|
|
#define CvWEAKOUTSIDE_on(cv) (CvFLAGS(cv) |= CVf_WEAKOUTSIDE) |
| 154 |
|
|
#define CvWEAKOUTSIDE_off(cv) (CvFLAGS(cv) &= ~CVf_WEAKOUTSIDE) |
| 155 |
|
|
|
| 156 |
|
|
|
| 157 |
|
|
/* |
| 158 |
|
|
=head1 CV reference counts and CvOUTSIDE |
| 159 |
|
|
|
| 160 |
|
|
=for apidoc m|bool|CvWEAKOUTSIDE|CV *cv |
| 161 |
|
|
|
| 162 |
|
|
Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing |
| 163 |
|
|
CV (if any). Because pointers to anonymous sub prototypes are |
| 164 |
|
|
stored in C<&> pad slots, it is a possible to get a circular reference, |
| 165 |
|
|
with the parent pointing to the child and vice-versa. To avoid the |
| 166 |
|
|
ensuing memory leak, we do not increment the reference count of the CV |
| 167 |
|
|
pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent |
| 168 |
|
|
has a C<&> pad slot pointing back to us. In this case, we set the |
| 169 |
|
|
C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what |
| 170 |
|
|
circumstances we should decrement the refcount of the parent when freeing |
| 171 |
|
|
the child. |
| 172 |
|
|
|
| 173 |
|
|
There is a further complication with non-closure anonymous subs (ie those |
| 174 |
|
|
that do not refer to any lexicals outside that sub). In this case, the |
| 175 |
|
|
anonymous prototype is shared rather than being cloned. This has the |
| 176 |
|
|
consequence that the parent may be freed while there are still active |
| 177 |
|
|
children, eg |
| 178 |
|
|
|
| 179 |
|
|
BEGIN { $a = sub { eval '$x' } } |
| 180 |
|
|
|
| 181 |
|
|
In this case, the BEGIN is freed immediately after execution since there |
| 182 |
|
|
are no active references to it: the anon sub prototype has |
| 183 |
|
|
C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same |
| 184 |
|
|
CV, so it doesn't contribute to BEGIN's refcount either. When $a is |
| 185 |
|
|
executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed, |
| 186 |
|
|
and the freed BEGIN is accessed. |
| 187 |
|
|
|
| 188 |
|
|
To avoid this, whenever a CV and its associated pad is freed, any |
| 189 |
|
|
C<&> entries in the pad are explicitly removed from the pad, and if the |
| 190 |
|
|
refcount of the pointed-to anon sub is still positive, then that |
| 191 |
|
|
child's C<CvOUTSIDE> is set to point to its grandparent. This will only |
| 192 |
|
|
occur in the single specific case of a non-closure anon prototype |
| 193 |
|
|
having one or more active references (such as C<$a> above). |
| 194 |
|
|
|
| 195 |
|
|
One other thing to consider is that a CV may be merely undefined |
| 196 |
|
|
rather than freed, eg C<undef &foo>. In this case, its refcount may |
| 197 |
|
|
not have reached zero, but we still delete its pad and its C<CvROOT> etc. |
| 198 |
|
|
Since various children may still have their C<CvOUTSIDE> pointing at this |
| 199 |
|
|
undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that |
| 200 |
|
|
the chain of lexical scopes is unbroken. For example, the following |
| 201 |
|
|
should print 123: |
| 202 |
|
|
|
| 203 |
|
|
my $x = 123; |
| 204 |
|
|
sub tmp { sub { eval '$x' } } |
| 205 |
|
|
my $a = tmp(); |
| 206 |
|
|
undef &tmp; |
| 207 |
|
|
print $a->(); |
| 208 |
|
|
|
| 209 |
|
|
=cut |
| 210 |
|
|
*/ |