| 1 | /*    pad.c | 
|---|
| 2 | * | 
|---|
| 3 | *    Copyright (C) 2002, 2003, 2004, 2005, 2006, by Larry Wall and others | 
|---|
| 4 | * | 
|---|
| 5 | *    You may distribute under the terms of either the GNU General Public | 
|---|
| 6 | *    License or the Artistic License, as specified in the README file. | 
|---|
| 7 | * | 
|---|
| 8 | *  "Anyway: there was this Mr Frodo left an orphan and stranded, as you | 
|---|
| 9 | *  might say, among those queer Bucklanders, being brought up anyhow in | 
|---|
| 10 | *  Brandy Hall. A regular warren, by all accounts. Old Master Gorbadoc | 
|---|
| 11 | *  never had fewer than a couple of hundred relations in the place. Mr | 
|---|
| 12 | *  Bilbo never did a kinder deed than when he brought the lad back to | 
|---|
| 13 | *  live among decent folk." --the Gaffer | 
|---|
| 14 | */ | 
|---|
| 15 |  | 
|---|
| 16 | /* XXX DAPM | 
|---|
| 17 | * As of Sept 2002, this file is new and may be in a state of flux for | 
|---|
| 18 | * a while. I've marked things I intent to come back and look at further | 
|---|
| 19 | * with an 'XXX DAPM' comment. | 
|---|
| 20 | */ | 
|---|
| 21 |  | 
|---|
| 22 | /* | 
|---|
| 23 | =head1 Pad Data Structures | 
|---|
| 24 |  | 
|---|
| 25 | This file contains the functions that create and manipulate scratchpads, | 
|---|
| 26 | which are array-of-array data structures attached to a CV (ie a sub) | 
|---|
| 27 | and which store lexical variables and opcode temporary and per-thread | 
|---|
| 28 | values. | 
|---|
| 29 |  | 
|---|
| 30 | =for apidoc m|AV *|CvPADLIST|CV *cv | 
|---|
| 31 | CV's can have CvPADLIST(cv) set to point to an AV. | 
|---|
| 32 |  | 
|---|
| 33 | For these purposes "forms" are a kind-of CV, eval""s are too (except they're | 
|---|
| 34 | not callable at will and are always thrown away after the eval"" is done | 
|---|
| 35 | executing). | 
|---|
| 36 |  | 
|---|
| 37 | XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad, | 
|---|
| 38 | but that is really the callers pad (a slot of which is allocated by | 
|---|
| 39 | every entersub). | 
|---|
| 40 |  | 
|---|
| 41 | The CvPADLIST AV has does not have AvREAL set, so REFCNT of component items | 
|---|
| 42 | is managed "manual" (mostly in pad.c) rather than normal av.c rules. | 
|---|
| 43 | The items in the AV are not SVs as for a normal AV, but other AVs: | 
|---|
| 44 |  | 
|---|
| 45 | 0'th Entry of the CvPADLIST is an AV which represents the "names" or rather | 
|---|
| 46 | the "static type information" for lexicals. | 
|---|
| 47 |  | 
|---|
| 48 | The CvDEPTH'th entry of CvPADLIST AV is an AV which is the stack frame at that | 
|---|
| 49 | depth of recursion into the CV. | 
|---|
| 50 | The 0'th slot of a frame AV is an AV which is @_. | 
|---|
| 51 | other entries are storage for variables and op targets. | 
|---|
| 52 |  | 
|---|
| 53 | During compilation: | 
|---|
| 54 | C<PL_comppad_name> is set to the names AV. | 
|---|
| 55 | C<PL_comppad> is set to the frame AV for the frame CvDEPTH == 1. | 
|---|
| 56 | C<PL_curpad> is set to the body of the frame AV (i.e. AvARRAY(PL_comppad)). | 
|---|
| 57 |  | 
|---|
| 58 | During execution, C<PL_comppad> and C<PL_curpad> refer to the live | 
|---|
| 59 | frame of the currently executing sub. | 
|---|
| 60 |  | 
|---|
| 61 | Iterating over the names AV iterates over all possible pad | 
|---|
| 62 | items. Pad slots that are SVs_PADTMP (targets/GVs/constants) end up having | 
|---|
| 63 | &PL_sv_undef "names" (see pad_alloc()). | 
|---|
| 64 |  | 
|---|
| 65 | Only my/our variable (SVs_PADMY/SVs_PADOUR) slots get valid names. | 
|---|
| 66 | The rest are op targets/GVs/constants which are statically allocated | 
|---|
| 67 | or resolved at compile time.  These don't have names by which they | 
|---|
| 68 | can be looked up from Perl code at run time through eval"" like | 
|---|
| 69 | my/our variables can be.  Since they can't be looked up by "name" | 
|---|
| 70 | but only by their index allocated at compile time (which is usually | 
|---|
| 71 | in PL_op->op_targ), wasting a name SV for them doesn't make sense. | 
|---|
| 72 |  | 
|---|
| 73 | The SVs in the names AV have their PV being the name of the variable. | 
|---|
| 74 | NV+1..IV inclusive is a range of cop_seq numbers for which the name is | 
|---|
| 75 | valid.  For typed lexicals name SV is SVt_PVMG and SvSTASH points at the | 
|---|
| 76 | type.  For C<our> lexicals, the type is SVt_PVGV, and GvSTASH points at the | 
|---|
| 77 | stash of the associated global (so that duplicate C<our> declarations in the | 
|---|
| 78 | same package can be detected).  SvCUR is sometimes hijacked to | 
|---|
| 79 | store the generation number during compilation. | 
|---|
| 80 |  | 
|---|
| 81 | If SvFAKE is set on the name SV then slot in the frame AVs are | 
|---|
| 82 | a REFCNT'ed references to a lexical from "outside". In this case, | 
|---|
| 83 | the name SV does not have a cop_seq range, since it is in scope | 
|---|
| 84 | throughout. | 
|---|
| 85 |  | 
|---|
| 86 | If the 'name' is '&' the corresponding entry in frame AV | 
|---|
| 87 | is a CV representing a possible closure. | 
|---|
| 88 | (SvFAKE and name of '&' is not a meaningful combination currently but could | 
|---|
| 89 | become so if C<my sub foo {}> is implemented.) | 
|---|
| 90 |  | 
|---|
| 91 | The flag SVf_PADSTALE is cleared on lexicals each time the my() is executed, | 
|---|
| 92 | and set on scope exit. This allows the 'Variable $x is not available' warning | 
|---|
| 93 | to be generated in evals, such as | 
|---|
| 94 |  | 
|---|
| 95 | { my $x = 1; sub f { eval '$x'} } f(); | 
|---|
| 96 |  | 
|---|
| 97 | =cut | 
|---|
| 98 | */ | 
|---|
| 99 |  | 
|---|
| 100 |  | 
|---|
| 101 | #include "EXTERN.h" | 
|---|
| 102 | #define PERL_IN_PAD_C | 
|---|
| 103 | #include "perl.h" | 
|---|
| 104 |  | 
|---|
| 105 |  | 
|---|
| 106 | #define PAD_MAX 999999999 | 
|---|
| 107 |  | 
|---|
| 108 |  | 
|---|
| 109 |  | 
|---|
| 110 | /* | 
|---|
| 111 | =for apidoc pad_new | 
|---|
| 112 |  | 
|---|
| 113 | Create a new compiling padlist, saving and updating the various global | 
|---|
| 114 | vars at the same time as creating the pad itself. The following flags | 
|---|
| 115 | can be OR'ed together: | 
|---|
| 116 |  | 
|---|
| 117 | padnew_CLONE        this pad is for a cloned CV | 
|---|
| 118 | padnew_SAVE         save old globals | 
|---|
| 119 | padnew_SAVESUB      also save extra stuff for start of sub | 
|---|
| 120 |  | 
|---|
| 121 | =cut | 
|---|
| 122 | */ | 
|---|
| 123 |  | 
|---|
| 124 | PADLIST * | 
|---|
| 125 | Perl_pad_new(pTHX_ int flags) | 
|---|
| 126 | { | 
|---|
| 127 | AV *padlist, *padname, *pad; | 
|---|
| 128 |  | 
|---|
| 129 | ASSERT_CURPAD_LEGAL("pad_new"); | 
|---|
| 130 |  | 
|---|
| 131 | /* XXX DAPM really need a new SAVEt_PAD which restores all or most | 
|---|
| 132 | * vars (based on flags) rather than storing vals + addresses for | 
|---|
| 133 | * each individually. Also see pad_block_start. | 
|---|
| 134 | * XXX DAPM Try to see whether all these conditionals are required | 
|---|
| 135 | */ | 
|---|
| 136 |  | 
|---|
| 137 | /* save existing state, ... */ | 
|---|
| 138 |  | 
|---|
| 139 | if (flags & padnew_SAVE) { | 
|---|
| 140 | SAVECOMPPAD(); | 
|---|
| 141 | SAVESPTR(PL_comppad_name); | 
|---|
| 142 | if (! (flags & padnew_CLONE)) { | 
|---|
| 143 | SAVEI32(PL_padix); | 
|---|
| 144 | SAVEI32(PL_comppad_name_fill); | 
|---|
| 145 | SAVEI32(PL_min_intro_pending); | 
|---|
| 146 | SAVEI32(PL_max_intro_pending); | 
|---|
| 147 | if (flags & padnew_SAVESUB) { | 
|---|
| 148 | SAVEI32(PL_pad_reset_pending); | 
|---|
| 149 | } | 
|---|
| 150 | } | 
|---|
| 151 | } | 
|---|
| 152 | /* XXX DAPM interestingly, PL_comppad_name_floor never seems to be | 
|---|
| 153 | * saved - check at some pt that this is okay */ | 
|---|
| 154 |  | 
|---|
| 155 | /* ... create new pad ... */ | 
|---|
| 156 |  | 
|---|
| 157 | padlist     = newAV(); | 
|---|
| 158 | padname     = newAV(); | 
|---|
| 159 | pad         = newAV(); | 
|---|
| 160 |  | 
|---|
| 161 | if (flags & padnew_CLONE) { | 
|---|
| 162 | /* XXX DAPM  I dont know why cv_clone needs it | 
|---|
| 163 | * doing differently yet - perhaps this separate branch can be | 
|---|
| 164 | * dispensed with eventually ??? | 
|---|
| 165 | */ | 
|---|
| 166 |  | 
|---|
| 167 | AV * const a0 = newAV();                        /* will be @_ */ | 
|---|
| 168 | av_extend(a0, 0); | 
|---|
| 169 | av_store(pad, 0, (SV*)a0); | 
|---|
| 170 | AvFLAGS(a0) = AVf_REIFY; | 
|---|
| 171 | } | 
|---|
| 172 | else { | 
|---|
| 173 | #ifdef USE_5005THREADS | 
|---|
| 174 | AV * const a0 = newAV();                        /* will be @_ */ | 
|---|
| 175 | av_store(padname, 0, newSVpvn("@_", 2)); | 
|---|
| 176 | SvPADMY_on((SV*)a0);            /* XXX Needed? */ | 
|---|
| 177 | av_store(pad, 0, (SV*)a0); | 
|---|
| 178 | #else | 
|---|
| 179 | av_store(pad, 0, Nullsv); | 
|---|
| 180 | #endif /* USE_THREADS */ | 
|---|
| 181 | } | 
|---|
| 182 |  | 
|---|
| 183 | AvREAL_off(padlist); | 
|---|
| 184 | av_store(padlist, 0, (SV*)padname); | 
|---|
| 185 | av_store(padlist, 1, (SV*)pad); | 
|---|
| 186 |  | 
|---|
| 187 | /* ... then update state variables */ | 
|---|
| 188 |  | 
|---|
| 189 | PL_comppad_name     = (AV*)(*av_fetch(padlist, 0, FALSE)); | 
|---|
| 190 | PL_comppad          = (AV*)(*av_fetch(padlist, 1, FALSE)); | 
|---|
| 191 | PL_curpad           = AvARRAY(PL_comppad); | 
|---|
| 192 |  | 
|---|
| 193 | if (! (flags & padnew_CLONE)) { | 
|---|
| 194 | PL_comppad_name_fill = 0; | 
|---|
| 195 | PL_min_intro_pending = 0; | 
|---|
| 196 | PL_padix             = 0; | 
|---|
| 197 | } | 
|---|
| 198 |  | 
|---|
| 199 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 200 | "Pad 0x%"UVxf"[0x%"UVxf"] new:       padlist=0x%"UVxf | 
|---|
| 201 | " name=0x%"UVxf" flags=0x%"UVxf"\n", | 
|---|
| 202 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), PTR2UV(padlist), | 
|---|
| 203 | PTR2UV(padname), (UV)flags | 
|---|
| 204 | ) | 
|---|
| 205 | ); | 
|---|
| 206 |  | 
|---|
| 207 | return (PADLIST*)padlist; | 
|---|
| 208 | } | 
|---|
| 209 |  | 
|---|
| 210 | /* | 
|---|
| 211 | =for apidoc pad_undef | 
|---|
| 212 |  | 
|---|
| 213 | Free the padlist associated with a CV. | 
|---|
| 214 | If parts of it happen to be current, we null the relevant | 
|---|
| 215 | PL_*pad* global vars so that we don't have any dangling references left. | 
|---|
| 216 | We also repoint the CvOUTSIDE of any about-to-be-orphaned | 
|---|
| 217 | inner subs to the outer of this cv. | 
|---|
| 218 |  | 
|---|
| 219 | (This function should really be called pad_free, but the name was already | 
|---|
| 220 | taken) | 
|---|
| 221 |  | 
|---|
| 222 | =cut | 
|---|
| 223 | */ | 
|---|
| 224 |  | 
|---|
| 225 | void | 
|---|
| 226 | Perl_pad_undef(pTHX_ CV* cv) | 
|---|
| 227 | { | 
|---|
| 228 | I32 ix; | 
|---|
| 229 | const PADLIST * const padlist = CvPADLIST(cv); | 
|---|
| 230 |  | 
|---|
| 231 | if (!padlist) | 
|---|
| 232 | return; | 
|---|
| 233 | if (!SvREFCNT(CvPADLIST(cv))) /* may be during global destruction */ | 
|---|
| 234 | return; | 
|---|
| 235 |  | 
|---|
| 236 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 237 | "Pad undef: padlist=0x%"UVxf"\n" , PTR2UV(padlist)) | 
|---|
| 238 | ); | 
|---|
| 239 |  | 
|---|
| 240 | /* detach any '&' anon children in the pad; if afterwards they | 
|---|
| 241 | * are still live, fix up their CvOUTSIDEs to point to our outside, | 
|---|
| 242 | * bypassing us. */ | 
|---|
| 243 | /* XXX DAPM for efficiency, we should only do this if we know we have | 
|---|
| 244 | * children, or integrate this loop with general cleanup */ | 
|---|
| 245 |  | 
|---|
| 246 | if (!PL_dirty) { /* don't bother during global destruction */ | 
|---|
| 247 | CV * const outercv = CvOUTSIDE(cv); | 
|---|
| 248 | const U32 seq = CvOUTSIDE_SEQ(cv); | 
|---|
| 249 | AV *  const comppad_name = (AV*)AvARRAY(padlist)[0]; | 
|---|
| 250 | SV ** const namepad = AvARRAY(comppad_name); | 
|---|
| 251 | AV *  const comppad = (AV*)AvARRAY(padlist)[1]; | 
|---|
| 252 | SV ** const curpad = AvARRAY(comppad); | 
|---|
| 253 | for (ix = AvFILLp(comppad_name); ix > 0; ix--) { | 
|---|
| 254 | SV * const namesv = namepad[ix]; | 
|---|
| 255 | if (namesv && namesv != &PL_sv_undef | 
|---|
| 256 | && *SvPVX_const(namesv) == '&') | 
|---|
| 257 | { | 
|---|
| 258 | CV * const innercv = (CV*)curpad[ix]; | 
|---|
| 259 | U32 inner_rc = SvREFCNT(innercv); | 
|---|
| 260 | assert(inner_rc); | 
|---|
| 261 | namepad[ix] = Nullsv; | 
|---|
| 262 | SvREFCNT_dec(namesv); | 
|---|
| 263 |  | 
|---|
| 264 | if (SvREFCNT(comppad) < 2) { /* allow for /(?{ sub{} })/  */ | 
|---|
| 265 | curpad[ix] = Nullsv; | 
|---|
| 266 | SvREFCNT_dec(innercv); | 
|---|
| 267 | inner_rc--; | 
|---|
| 268 | } | 
|---|
| 269 | if (inner_rc /* in use, not just a prototype */ | 
|---|
| 270 | && CvOUTSIDE(innercv) == cv) | 
|---|
| 271 | { | 
|---|
| 272 | assert(CvWEAKOUTSIDE(innercv)); | 
|---|
| 273 | /* don't relink to grandfather if he's being freed */ | 
|---|
| 274 | if (outercv && SvREFCNT(outercv)) { | 
|---|
| 275 | CvWEAKOUTSIDE_off(innercv); | 
|---|
| 276 | CvOUTSIDE(innercv) = outercv; | 
|---|
| 277 | CvOUTSIDE_SEQ(innercv) = seq; | 
|---|
| 278 | (void)SvREFCNT_inc(outercv); | 
|---|
| 279 | } | 
|---|
| 280 | else { | 
|---|
| 281 | CvOUTSIDE(innercv) = Nullcv; | 
|---|
| 282 | } | 
|---|
| 283 |  | 
|---|
| 284 | } | 
|---|
| 285 |  | 
|---|
| 286 | } | 
|---|
| 287 | } | 
|---|
| 288 | } | 
|---|
| 289 |  | 
|---|
| 290 | ix = AvFILLp(padlist); | 
|---|
| 291 | while (ix >= 0) { | 
|---|
| 292 | SV* const sv = AvARRAY(padlist)[ix--]; | 
|---|
| 293 | if (!sv) | 
|---|
| 294 | continue; | 
|---|
| 295 | if (sv == (SV*)PL_comppad_name) | 
|---|
| 296 | PL_comppad_name = Nullav; | 
|---|
| 297 | else if (sv == (SV*)PL_comppad) { | 
|---|
| 298 | PL_comppad = Null(PAD*); | 
|---|
| 299 | PL_curpad = Null(SV**); | 
|---|
| 300 | } | 
|---|
| 301 | SvREFCNT_dec(sv); | 
|---|
| 302 | } | 
|---|
| 303 | SvREFCNT_dec((SV*)CvPADLIST(cv)); | 
|---|
| 304 | CvPADLIST(cv) = Null(PADLIST*); | 
|---|
| 305 | } | 
|---|
| 306 |  | 
|---|
| 307 |  | 
|---|
| 308 |  | 
|---|
| 309 |  | 
|---|
| 310 | /* | 
|---|
| 311 | =for apidoc pad_add_name | 
|---|
| 312 |  | 
|---|
| 313 | Create a new name in the current pad at the specified offset. | 
|---|
| 314 | If C<typestash> is valid, the name is for a typed lexical; set the | 
|---|
| 315 | name's stash to that value. | 
|---|
| 316 | If C<ourstash> is valid, it's an our lexical, set the name's | 
|---|
| 317 | GvSTASH to that value | 
|---|
| 318 |  | 
|---|
| 319 | Also, if the name is @.. or %.., create a new array or hash for that slot | 
|---|
| 320 |  | 
|---|
| 321 | If fake, it means we're cloning an existing entry | 
|---|
| 322 |  | 
|---|
| 323 | =cut | 
|---|
| 324 | */ | 
|---|
| 325 |  | 
|---|
| 326 | /* | 
|---|
| 327 | * XXX DAPM this doesn't seem the right place to create a new array/hash. | 
|---|
| 328 | * Whatever we do, we should be consistent - create scalars too, and | 
|---|
| 329 | * create even if fake. Really need to integrate better the whole entry | 
|---|
| 330 | * creation business - when + where does the name and value get created? | 
|---|
| 331 | */ | 
|---|
| 332 |  | 
|---|
| 333 | PADOFFSET | 
|---|
| 334 | Perl_pad_add_name(pTHX_ char *name, HV* typestash, HV* ourstash, bool fake) | 
|---|
| 335 | { | 
|---|
| 336 | const PADOFFSET offset = pad_alloc(OP_PADSV, SVs_PADMY); | 
|---|
| 337 | SV* const namesv = NEWSV(1102, 0); | 
|---|
| 338 |  | 
|---|
| 339 | ASSERT_CURPAD_ACTIVE("pad_add_name"); | 
|---|
| 340 |  | 
|---|
| 341 |  | 
|---|
| 342 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 343 | "Pad addname: %ld \"%s\"%s\n", | 
|---|
| 344 | (long)offset, name, (fake ? " FAKE" : "") | 
|---|
| 345 | ) | 
|---|
| 346 | ); | 
|---|
| 347 |  | 
|---|
| 348 | sv_upgrade(namesv, ourstash ? SVt_PVGV : typestash ? SVt_PVMG : SVt_PVNV); | 
|---|
| 349 | sv_setpv(namesv, name); | 
|---|
| 350 |  | 
|---|
| 351 | if (typestash) { | 
|---|
| 352 | SvFLAGS(namesv) |= SVpad_TYPED; | 
|---|
| 353 | SvSTASH_set(namesv, (HV*)SvREFCNT_inc((SV*) typestash)); | 
|---|
| 354 | } | 
|---|
| 355 | if (ourstash) { | 
|---|
| 356 | SvFLAGS(namesv) |= SVpad_OUR; | 
|---|
| 357 | GvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*) ourstash); | 
|---|
| 358 | } | 
|---|
| 359 |  | 
|---|
| 360 | av_store(PL_comppad_name, offset, namesv); | 
|---|
| 361 | if (fake) | 
|---|
| 362 | SvFAKE_on(namesv); | 
|---|
| 363 | else { | 
|---|
| 364 | /* not yet introduced */ | 
|---|
| 365 | SvNV_set(namesv, (NV)PAD_MAX);  /* min */ | 
|---|
| 366 | SvIV_set(namesv, 0);            /* max */ | 
|---|
| 367 |  | 
|---|
| 368 | if (!PL_min_intro_pending) | 
|---|
| 369 | PL_min_intro_pending = offset; | 
|---|
| 370 | PL_max_intro_pending = offset; | 
|---|
| 371 | /* XXX DAPM since slot has been allocated, replace | 
|---|
| 372 | * av_store with PL_curpad[offset] ? */ | 
|---|
| 373 | if (*name == '@') | 
|---|
| 374 | av_store(PL_comppad, offset, (SV*)newAV()); | 
|---|
| 375 | else if (*name == '%') | 
|---|
| 376 | av_store(PL_comppad, offset, (SV*)newHV()); | 
|---|
| 377 | SvPADMY_on(PL_curpad[offset]); | 
|---|
| 378 | } | 
|---|
| 379 |  | 
|---|
| 380 | return offset; | 
|---|
| 381 | } | 
|---|
| 382 |  | 
|---|
| 383 |  | 
|---|
| 384 |  | 
|---|
| 385 |  | 
|---|
| 386 | /* | 
|---|
| 387 | =for apidoc pad_alloc | 
|---|
| 388 |  | 
|---|
| 389 | Allocate a new my or tmp pad entry. For a my, simply push a null SV onto | 
|---|
| 390 | the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards | 
|---|
| 391 | for a slot which has no name and no active value. | 
|---|
| 392 |  | 
|---|
| 393 | =cut | 
|---|
| 394 | */ | 
|---|
| 395 |  | 
|---|
| 396 | /* XXX DAPM integrate alloc(), add_name() and add_anon(), | 
|---|
| 397 | * or at least rationalise ??? */ | 
|---|
| 398 |  | 
|---|
| 399 |  | 
|---|
| 400 | PADOFFSET | 
|---|
| 401 | Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype) | 
|---|
| 402 | { | 
|---|
| 403 | SV *sv; | 
|---|
| 404 | I32 retval; | 
|---|
| 405 |  | 
|---|
| 406 | ASSERT_CURPAD_ACTIVE("pad_alloc"); | 
|---|
| 407 |  | 
|---|
| 408 | if (AvARRAY(PL_comppad) != PL_curpad) | 
|---|
| 409 | Perl_croak(aTHX_ "panic: pad_alloc"); | 
|---|
| 410 | if (PL_pad_reset_pending) | 
|---|
| 411 | pad_reset(); | 
|---|
| 412 | if (tmptype & SVs_PADMY) { | 
|---|
| 413 | do { | 
|---|
| 414 | sv = *av_fetch(PL_comppad, AvFILLp(PL_comppad) + 1, TRUE); | 
|---|
| 415 | } while (SvPADBUSY(sv));                /* need a fresh one */ | 
|---|
| 416 | retval = AvFILLp(PL_comppad); | 
|---|
| 417 | } | 
|---|
| 418 | else { | 
|---|
| 419 | SV * const * const names = AvARRAY(PL_comppad_name); | 
|---|
| 420 | const SSize_t names_fill = AvFILLp(PL_comppad_name); | 
|---|
| 421 | for (;;) { | 
|---|
| 422 | /* | 
|---|
| 423 | * "foreach" index vars temporarily become aliases to non-"my" | 
|---|
| 424 | * values.  Thus we must skip, not just pad values that are | 
|---|
| 425 | * marked as current pad values, but also those with names. | 
|---|
| 426 | */ | 
|---|
| 427 | /* HVDS why copy to sv here? we don't seem to use it */ | 
|---|
| 428 | if (++PL_padix <= names_fill && | 
|---|
| 429 | (sv = names[PL_padix]) && sv != &PL_sv_undef) | 
|---|
| 430 | continue; | 
|---|
| 431 | sv = *av_fetch(PL_comppad, PL_padix, TRUE); | 
|---|
| 432 | if (!(SvFLAGS(sv) & (SVs_PADTMP | SVs_PADMY)) && | 
|---|
| 433 | !IS_PADGV(sv) && !IS_PADCONST(sv)) | 
|---|
| 434 | break; | 
|---|
| 435 | } | 
|---|
| 436 | retval = PL_padix; | 
|---|
| 437 | } | 
|---|
| 438 | SvFLAGS(sv) |= tmptype; | 
|---|
| 439 | PL_curpad = AvARRAY(PL_comppad); | 
|---|
| 440 |  | 
|---|
| 441 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 442 | "Pad 0x%"UVxf"[0x%"UVxf"] alloc:   %ld for %s\n", | 
|---|
| 443 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long) retval, | 
|---|
| 444 | PL_op_name[optype])); | 
|---|
| 445 | return (PADOFFSET)retval; | 
|---|
| 446 | } | 
|---|
| 447 |  | 
|---|
| 448 | /* | 
|---|
| 449 | =for apidoc pad_add_anon | 
|---|
| 450 |  | 
|---|
| 451 | Add an anon code entry to the current compiling pad | 
|---|
| 452 |  | 
|---|
| 453 | =cut | 
|---|
| 454 | */ | 
|---|
| 455 |  | 
|---|
| 456 | PADOFFSET | 
|---|
| 457 | Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type) | 
|---|
| 458 | { | 
|---|
| 459 | PADOFFSET ix; | 
|---|
| 460 | SV* const name = NEWSV(1106, 0); | 
|---|
| 461 | sv_upgrade(name, SVt_PVNV); | 
|---|
| 462 | sv_setpvn(name, "&", 1); | 
|---|
| 463 | SvIV_set(name, -1); | 
|---|
| 464 | SvNV_set(name, 1); | 
|---|
| 465 | ix = pad_alloc(op_type, SVs_PADMY); | 
|---|
| 466 | av_store(PL_comppad_name, ix, name); | 
|---|
| 467 | /* XXX DAPM use PL_curpad[] ? */ | 
|---|
| 468 | av_store(PL_comppad, ix, sv); | 
|---|
| 469 | SvPADMY_on(sv); | 
|---|
| 470 |  | 
|---|
| 471 | /* to avoid ref loops, we never have parent + child referencing each | 
|---|
| 472 | * other simultaneously */ | 
|---|
| 473 | if (CvOUTSIDE((CV*)sv)) { | 
|---|
| 474 | assert(!CvWEAKOUTSIDE((CV*)sv)); | 
|---|
| 475 | CvWEAKOUTSIDE_on((CV*)sv); | 
|---|
| 476 | SvREFCNT_dec(CvOUTSIDE((CV*)sv)); | 
|---|
| 477 | } | 
|---|
| 478 | return ix; | 
|---|
| 479 | } | 
|---|
| 480 |  | 
|---|
| 481 |  | 
|---|
| 482 |  | 
|---|
| 483 | /* | 
|---|
| 484 | =for apidoc pad_check_dup | 
|---|
| 485 |  | 
|---|
| 486 | Check for duplicate declarations: report any of: | 
|---|
| 487 | * a my in the current scope with the same name; | 
|---|
| 488 | * an our (anywhere in the pad) with the same name and the same stash | 
|---|
| 489 | as C<ourstash> | 
|---|
| 490 | C<is_our> indicates that the name to check is an 'our' declaration | 
|---|
| 491 |  | 
|---|
| 492 | =cut | 
|---|
| 493 | */ | 
|---|
| 494 |  | 
|---|
| 495 | /* XXX DAPM integrate this into pad_add_name ??? */ | 
|---|
| 496 |  | 
|---|
| 497 | void | 
|---|
| 498 | Perl_pad_check_dup(pTHX_ char *name, bool is_our, HV *ourstash) | 
|---|
| 499 | { | 
|---|
| 500 | SV          **svp; | 
|---|
| 501 | PADOFFSET   top, off; | 
|---|
| 502 |  | 
|---|
| 503 | ASSERT_CURPAD_ACTIVE("pad_check_dup"); | 
|---|
| 504 | if (AvFILLp(PL_comppad_name) < 0 || !ckWARN(WARN_MISC)) | 
|---|
| 505 | return; /* nothing to check */ | 
|---|
| 506 |  | 
|---|
| 507 | svp = AvARRAY(PL_comppad_name); | 
|---|
| 508 | top = AvFILLp(PL_comppad_name); | 
|---|
| 509 | /* check the current scope */ | 
|---|
| 510 | /* XXX DAPM - why the (I32) cast - shouldn't we ensure they're the same | 
|---|
| 511 | * type ? */ | 
|---|
| 512 | for (off = top; (I32)off > PL_comppad_name_floor; off--) { | 
|---|
| 513 | SV * const sv = svp[off]; | 
|---|
| 514 | if (sv | 
|---|
| 515 | && sv != &PL_sv_undef | 
|---|
| 516 | && !SvFAKE(sv) | 
|---|
| 517 | && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0) | 
|---|
| 518 | && (!is_our | 
|---|
| 519 | || ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash)) | 
|---|
| 520 | && strEQ(name, SvPVX_const(sv))) | 
|---|
| 521 | { | 
|---|
| 522 | Perl_warner(aTHX_ packWARN(WARN_MISC), | 
|---|
| 523 | "\"%s\" variable %s masks earlier declaration in same %s", | 
|---|
| 524 | (is_our ? "our" : "my"), | 
|---|
| 525 | name, | 
|---|
| 526 | (SvIVX(sv) == PAD_MAX ? "scope" : "statement")); | 
|---|
| 527 | --off; | 
|---|
| 528 | break; | 
|---|
| 529 | } | 
|---|
| 530 | } | 
|---|
| 531 | /* check the rest of the pad */ | 
|---|
| 532 | if (is_our) { | 
|---|
| 533 | do { | 
|---|
| 534 | SV * const sv = svp[off]; | 
|---|
| 535 | if (sv | 
|---|
| 536 | && sv != &PL_sv_undef | 
|---|
| 537 | && !SvFAKE(sv) | 
|---|
| 538 | && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0) | 
|---|
| 539 | && ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash) | 
|---|
| 540 | && strEQ(name, SvPVX_const(sv))) | 
|---|
| 541 | { | 
|---|
| 542 | Perl_warner(aTHX_ packWARN(WARN_MISC), | 
|---|
| 543 | "\"our\" variable %s redeclared", name); | 
|---|
| 544 | Perl_warner(aTHX_ packWARN(WARN_MISC), | 
|---|
| 545 | "\t(Did you mean \"local\" instead of \"our\"?)\n"); | 
|---|
| 546 | break; | 
|---|
| 547 | } | 
|---|
| 548 | } while ( off-- > 0 ); | 
|---|
| 549 | } | 
|---|
| 550 | } | 
|---|
| 551 |  | 
|---|
| 552 |  | 
|---|
| 553 |  | 
|---|
| 554 | /* | 
|---|
| 555 | =for apidoc pad_findmy | 
|---|
| 556 |  | 
|---|
| 557 | Given a lexical name, try to find its offset, first in the current pad, | 
|---|
| 558 | or failing that, in the pads of any lexically enclosing subs (including | 
|---|
| 559 | the complications introduced by eval). If the name is found in an outer pad, | 
|---|
| 560 | then a fake entry is added to the current pad. | 
|---|
| 561 | Returns the offset in the current pad, or NOT_IN_PAD on failure. | 
|---|
| 562 |  | 
|---|
| 563 | =cut | 
|---|
| 564 | */ | 
|---|
| 565 |  | 
|---|
| 566 | PADOFFSET | 
|---|
| 567 | Perl_pad_findmy(pTHX_ char *name) | 
|---|
| 568 | { | 
|---|
| 569 | I32 off; | 
|---|
| 570 | I32 fake_off = 0; | 
|---|
| 571 | I32 our_off = 0; | 
|---|
| 572 | SV *sv; | 
|---|
| 573 | SV **svp = AvARRAY(PL_comppad_name); | 
|---|
| 574 | U32 seq = PL_cop_seqmax; | 
|---|
| 575 |  | 
|---|
| 576 | ASSERT_CURPAD_ACTIVE("pad_findmy"); | 
|---|
| 577 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad findmy:  \"%s\"\n", name)); | 
|---|
| 578 |  | 
|---|
| 579 | #ifdef USE_5005THREADS | 
|---|
| 580 | /* | 
|---|
| 581 | * Special case to get lexical (and hence per-thread) @_. | 
|---|
| 582 | * XXX I need to find out how to tell at parse-time whether use | 
|---|
| 583 | * of @_ should refer to a lexical (from a sub) or defgv (global | 
|---|
| 584 | * scope and maybe weird sub-ish things like formats). See | 
|---|
| 585 | * startsub in perly.y.  It's possible that @_ could be lexical | 
|---|
| 586 | * (at least from subs) even in non-threaded perl. | 
|---|
| 587 | */ | 
|---|
| 588 | if (strEQ(name, "@_")) | 
|---|
| 589 | return 0;               /* success. (NOT_IN_PAD indicates failure) */ | 
|---|
| 590 | #endif /* USE_5005THREADS */ | 
|---|
| 591 |  | 
|---|
| 592 | /* The one we're looking for is probably just before comppad_name_fill. */ | 
|---|
| 593 | for (off = AvFILLp(PL_comppad_name); off > 0; off--) { | 
|---|
| 594 | sv = svp[off]; | 
|---|
| 595 | if (!sv || sv == &PL_sv_undef || !strEQ(SvPVX_const(sv), name)) | 
|---|
| 596 | continue; | 
|---|
| 597 | if (SvFAKE(sv)) { | 
|---|
| 598 | /* we'll use this later if we don't find a real entry */ | 
|---|
| 599 | fake_off = off; | 
|---|
| 600 | continue; | 
|---|
| 601 | } | 
|---|
| 602 | else { | 
|---|
| 603 | if (   seq >  U_32(SvNVX(sv))       /* min */ | 
|---|
| 604 | && seq <= (U32)SvIVX(sv))       /* max */ | 
|---|
| 605 | return off; | 
|---|
| 606 | else if ((SvFLAGS(sv) & SVpad_OUR) | 
|---|
| 607 | && U_32(SvNVX(sv)) == PAD_MAX) /* min */ | 
|---|
| 608 | { | 
|---|
| 609 | /* look for an our that's being introduced; this allows | 
|---|
| 610 | *    our $foo = 0 unless defined $foo; | 
|---|
| 611 | * to not give a warning. (Yes, this is a hack) */ | 
|---|
| 612 | our_off = off; | 
|---|
| 613 | } | 
|---|
| 614 | } | 
|---|
| 615 | } | 
|---|
| 616 | if (fake_off) | 
|---|
| 617 | return fake_off; | 
|---|
| 618 |  | 
|---|
| 619 | /* See if it's in a nested scope */ | 
|---|
| 620 | off = pad_findlex(name, 0, PL_compcv); | 
|---|
| 621 | if (off)                    /* pad_findlex returns 0 for failure...*/ | 
|---|
| 622 | return off; | 
|---|
| 623 | if (our_off) | 
|---|
| 624 | return our_off; | 
|---|
| 625 | return NOT_IN_PAD;          /* ...but we return NOT_IN_PAD for failure */ | 
|---|
| 626 |  | 
|---|
| 627 | } | 
|---|
| 628 |  | 
|---|
| 629 |  | 
|---|
| 630 |  | 
|---|
| 631 | /* | 
|---|
| 632 | =for apidoc pad_findlex | 
|---|
| 633 |  | 
|---|
| 634 | Find a named lexical anywhere in a chain of nested pads. Add fake entries | 
|---|
| 635 | in the inner pads if it's found in an outer one. innercv is the CV *inside* | 
|---|
| 636 | the chain of outer CVs to be searched. If newoff is non-null, this is a | 
|---|
| 637 | run-time cloning: don't add fake entries, just find the lexical and add a | 
|---|
| 638 | ref to it at newoff in the current pad. | 
|---|
| 639 |  | 
|---|
| 640 | =cut | 
|---|
| 641 | */ | 
|---|
| 642 |  | 
|---|
| 643 | STATIC PADOFFSET | 
|---|
| 644 | S_pad_findlex(pTHX_ const char *name, PADOFFSET newoff, const CV* innercv) | 
|---|
| 645 | { | 
|---|
| 646 | CV *cv; | 
|---|
| 647 | I32 off = 0; | 
|---|
| 648 | SV *sv; | 
|---|
| 649 | CV* startcv; | 
|---|
| 650 | U32 seq; | 
|---|
| 651 | I32 depth; | 
|---|
| 652 | AV *oldpad; | 
|---|
| 653 | SV *oldsv; | 
|---|
| 654 | AV *curlist; | 
|---|
| 655 |  | 
|---|
| 656 | ASSERT_CURPAD_ACTIVE("pad_findlex"); | 
|---|
| 657 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 658 | "Pad findlex: \"%s\" off=%ld startcv=0x%"UVxf"\n", | 
|---|
| 659 | name, (long)newoff, PTR2UV(innercv)) | 
|---|
| 660 | ); | 
|---|
| 661 |  | 
|---|
| 662 | seq = CvOUTSIDE_SEQ(innercv); | 
|---|
| 663 | startcv = CvOUTSIDE(innercv); | 
|---|
| 664 |  | 
|---|
| 665 | for (cv = startcv; cv; seq = CvOUTSIDE_SEQ(cv), cv = CvOUTSIDE(cv)) { | 
|---|
| 666 | SV **svp; | 
|---|
| 667 | AV *curname; | 
|---|
| 668 | I32 fake_off = 0; | 
|---|
| 669 |  | 
|---|
| 670 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 671 | "             searching: cv=0x%"UVxf" seq=%d\n", | 
|---|
| 672 | PTR2UV(cv), (int) seq ) | 
|---|
| 673 | ); | 
|---|
| 674 |  | 
|---|
| 675 | curlist = CvPADLIST(cv); | 
|---|
| 676 | if (!curlist) | 
|---|
| 677 | continue; /* an undef CV */ | 
|---|
| 678 | svp = av_fetch(curlist, 0, FALSE); | 
|---|
| 679 | if (!svp || *svp == &PL_sv_undef) | 
|---|
| 680 | continue; | 
|---|
| 681 | curname = (AV*)*svp; | 
|---|
| 682 | svp = AvARRAY(curname); | 
|---|
| 683 |  | 
|---|
| 684 | depth = CvDEPTH(cv); | 
|---|
| 685 | for (off = AvFILLp(curname); off > 0; off--) { | 
|---|
| 686 | sv = svp[off]; | 
|---|
| 687 | if (!sv || sv == &PL_sv_undef || !strEQ(SvPVX_const(sv), name)) | 
|---|
| 688 | continue; | 
|---|
| 689 | if (SvFAKE(sv)) { | 
|---|
| 690 | /* we'll use this later if we don't find a real entry */ | 
|---|
| 691 | fake_off = off; | 
|---|
| 692 | continue; | 
|---|
| 693 | } | 
|---|
| 694 | else { | 
|---|
| 695 | if (   seq >  U_32(SvNVX(sv))   /* min */ | 
|---|
| 696 | && seq <= (U32)SvIVX(sv)    /* max */ | 
|---|
| 697 | && !(newoff && !depth) /* ignore inactive when cloning */ | 
|---|
| 698 | ) | 
|---|
| 699 | goto found; | 
|---|
| 700 | } | 
|---|
| 701 | } | 
|---|
| 702 |  | 
|---|
| 703 | /* no real entry - but did we find a fake one? */ | 
|---|
| 704 | if (fake_off) { | 
|---|
| 705 | if (newoff && !depth) | 
|---|
| 706 | return 0; /* don't clone from inactive stack frame */ | 
|---|
| 707 | off = fake_off; | 
|---|
| 708 | sv = svp[off]; | 
|---|
| 709 | goto found; | 
|---|
| 710 | } | 
|---|
| 711 | } | 
|---|
| 712 | return 0; | 
|---|
| 713 |  | 
|---|
| 714 | found: | 
|---|
| 715 |  | 
|---|
| 716 | if (!depth) | 
|---|
| 717 | depth = 1; | 
|---|
| 718 |  | 
|---|
| 719 | oldpad = (AV*)AvARRAY(curlist)[depth]; | 
|---|
| 720 | oldsv = *av_fetch(oldpad, off, TRUE); | 
|---|
| 721 |  | 
|---|
| 722 | #ifdef DEBUGGING | 
|---|
| 723 | if (SvFAKE(sv)) | 
|---|
| 724 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 725 | "             matched:   offset %ld" | 
|---|
| 726 | " FAKE, sv=0x%"UVxf"\n", | 
|---|
| 727 | (long)off, | 
|---|
| 728 | PTR2UV(oldsv) | 
|---|
| 729 | ) | 
|---|
| 730 | ); | 
|---|
| 731 | else | 
|---|
| 732 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 733 | "             matched:   offset %ld" | 
|---|
| 734 | " (%lu,%lu), sv=0x%"UVxf"\n", | 
|---|
| 735 | (long)off, | 
|---|
| 736 | (unsigned long)U_32(SvNVX(sv)), | 
|---|
| 737 | (unsigned long)SvIVX(sv), | 
|---|
| 738 | PTR2UV(oldsv) | 
|---|
| 739 | ) | 
|---|
| 740 | ); | 
|---|
| 741 | #endif | 
|---|
| 742 |  | 
|---|
| 743 | if (!newoff) {              /* Not a mere clone operation. */ | 
|---|
| 744 | newoff = pad_add_name( | 
|---|
| 745 | SvPVX(sv), | 
|---|
| 746 | (SvFLAGS(sv) & SVpad_TYPED) ? SvSTASH(sv) : Nullhv, | 
|---|
| 747 | (SvFLAGS(sv) & SVpad_OUR)   ? GvSTASH(sv) : Nullhv, | 
|---|
| 748 | 1  /* fake */ | 
|---|
| 749 | ); | 
|---|
| 750 |  | 
|---|
| 751 | if (CvANON(PL_compcv) || SvTYPE(PL_compcv) == SVt_PVFM) { | 
|---|
| 752 | /* "It's closures all the way down." */ | 
|---|
| 753 | CvCLONE_on(PL_compcv); | 
|---|
| 754 | if (cv == startcv) { | 
|---|
| 755 | if (CvANON(PL_compcv)) | 
|---|
| 756 | oldsv = Nullsv; /* no need to keep ref */ | 
|---|
| 757 | } | 
|---|
| 758 | else { | 
|---|
| 759 | CV *bcv; | 
|---|
| 760 | for (bcv = startcv; | 
|---|
| 761 | bcv && bcv != cv && !CvCLONE(bcv); | 
|---|
| 762 | bcv = CvOUTSIDE(bcv)) | 
|---|
| 763 | { | 
|---|
| 764 | if (CvANON(bcv)) { | 
|---|
| 765 | /* install the missing pad entry in intervening | 
|---|
| 766 | * nested subs and mark them cloneable. */ | 
|---|
| 767 | AV *ocomppad_name = PL_comppad_name; | 
|---|
| 768 | PAD *ocomppad = PL_comppad; | 
|---|
| 769 | AV *padlist = CvPADLIST(bcv); | 
|---|
| 770 | PL_comppad_name = (AV*)AvARRAY(padlist)[0]; | 
|---|
| 771 | PL_comppad = (AV*)AvARRAY(padlist)[1]; | 
|---|
| 772 | PL_curpad = AvARRAY(PL_comppad); | 
|---|
| 773 | pad_add_name( | 
|---|
| 774 | SvPVX(sv), | 
|---|
| 775 | (SvFLAGS(sv) & SVpad_TYPED) | 
|---|
| 776 | ? SvSTASH(sv) : Nullhv, | 
|---|
| 777 | (SvFLAGS(sv) & SVpad_OUR) | 
|---|
| 778 | ? GvSTASH(sv) : Nullhv, | 
|---|
| 779 | 1  /* fake */ | 
|---|
| 780 | ); | 
|---|
| 781 |  | 
|---|
| 782 | PL_comppad_name = ocomppad_name; | 
|---|
| 783 | PL_comppad = ocomppad; | 
|---|
| 784 | PL_curpad = ocomppad ? | 
|---|
| 785 | AvARRAY(ocomppad) : Null(SV **); | 
|---|
| 786 | CvCLONE_on(bcv); | 
|---|
| 787 | } | 
|---|
| 788 | else { | 
|---|
| 789 | if (ckWARN(WARN_CLOSURE) | 
|---|
| 790 | && !CvUNIQUE(bcv) && !CvUNIQUE(cv)) | 
|---|
| 791 | { | 
|---|
| 792 | Perl_warner(aTHX_ packWARN(WARN_CLOSURE), | 
|---|
| 793 | "Variable \"%s\" may be unavailable", | 
|---|
| 794 | name); | 
|---|
| 795 | } | 
|---|
| 796 | break; | 
|---|
| 797 | } | 
|---|
| 798 | } | 
|---|
| 799 | } | 
|---|
| 800 | } | 
|---|
| 801 | else if (!CvUNIQUE(PL_compcv)) { | 
|---|
| 802 | if (ckWARN(WARN_CLOSURE) && !SvFAKE(sv) && !CvUNIQUE(cv) | 
|---|
| 803 | && !(SvFLAGS(sv) & SVpad_OUR)) | 
|---|
| 804 | { | 
|---|
| 805 | Perl_warner(aTHX_ packWARN(WARN_CLOSURE), | 
|---|
| 806 | "Variable \"%s\" will not stay shared", name); | 
|---|
| 807 | } | 
|---|
| 808 | } | 
|---|
| 809 | } | 
|---|
| 810 | av_store(PL_comppad, newoff, SvREFCNT_inc(oldsv)); | 
|---|
| 811 | ASSERT_CURPAD_ACTIVE("pad_findlex 2"); | 
|---|
| 812 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 813 | "Pad findlex: set offset %ld to sv 0x%"UVxf"\n", | 
|---|
| 814 | (long)newoff, PTR2UV(oldsv) | 
|---|
| 815 | ) | 
|---|
| 816 | ); | 
|---|
| 817 | return newoff; | 
|---|
| 818 | } | 
|---|
| 819 |  | 
|---|
| 820 |  | 
|---|
| 821 | /* | 
|---|
| 822 | =for apidoc pad_sv | 
|---|
| 823 |  | 
|---|
| 824 | Get the value at offset po in the current pad. | 
|---|
| 825 | Use macro PAD_SV instead of calling this function directly. | 
|---|
| 826 |  | 
|---|
| 827 | =cut | 
|---|
| 828 | */ | 
|---|
| 829 |  | 
|---|
| 830 |  | 
|---|
| 831 | SV * | 
|---|
| 832 | Perl_pad_sv(pTHX_ PADOFFSET po) | 
|---|
| 833 | { | 
|---|
| 834 | ASSERT_CURPAD_ACTIVE("pad_sv"); | 
|---|
| 835 |  | 
|---|
| 836 | #ifndef USE_5005THREADS | 
|---|
| 837 | if (!po) | 
|---|
| 838 | Perl_croak(aTHX_ "panic: pad_sv po"); | 
|---|
| 839 | #endif | 
|---|
| 840 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 841 | "Pad 0x%"UVxf"[0x%"UVxf"] sv:      %ld sv=0x%"UVxf"\n", | 
|---|
| 842 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long)po, PTR2UV(PL_curpad[po])) | 
|---|
| 843 | ); | 
|---|
| 844 | return PL_curpad[po]; | 
|---|
| 845 | } | 
|---|
| 846 |  | 
|---|
| 847 |  | 
|---|
| 848 | /* | 
|---|
| 849 | =for apidoc pad_setsv | 
|---|
| 850 |  | 
|---|
| 851 | Set the entry at offset po in the current pad to sv. | 
|---|
| 852 | Use the macro PAD_SETSV() rather than calling this function directly. | 
|---|
| 853 |  | 
|---|
| 854 | =cut | 
|---|
| 855 | */ | 
|---|
| 856 |  | 
|---|
| 857 | #ifdef DEBUGGING | 
|---|
| 858 | void | 
|---|
| 859 | Perl_pad_setsv(pTHX_ PADOFFSET po, SV* sv) | 
|---|
| 860 | { | 
|---|
| 861 | ASSERT_CURPAD_ACTIVE("pad_setsv"); | 
|---|
| 862 |  | 
|---|
| 863 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 864 | "Pad 0x%"UVxf"[0x%"UVxf"] setsv:   %ld sv=0x%"UVxf"\n", | 
|---|
| 865 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long)po, PTR2UV(sv)) | 
|---|
| 866 | ); | 
|---|
| 867 | PL_curpad[po] = sv; | 
|---|
| 868 | } | 
|---|
| 869 | #endif | 
|---|
| 870 |  | 
|---|
| 871 |  | 
|---|
| 872 |  | 
|---|
| 873 | /* | 
|---|
| 874 | =for apidoc pad_block_start | 
|---|
| 875 |  | 
|---|
| 876 | Update the pad compilation state variables on entry to a new block | 
|---|
| 877 |  | 
|---|
| 878 | =cut | 
|---|
| 879 | */ | 
|---|
| 880 |  | 
|---|
| 881 | /* XXX DAPM perhaps: | 
|---|
| 882 | *      - integrate this in general state-saving routine ??? | 
|---|
| 883 | *      - combine with the state-saving going on in pad_new ??? | 
|---|
| 884 | *      - introduce a new SAVE type that does all this in one go ? | 
|---|
| 885 | */ | 
|---|
| 886 |  | 
|---|
| 887 | void | 
|---|
| 888 | Perl_pad_block_start(pTHX_ int full) | 
|---|
| 889 | { | 
|---|
| 890 | ASSERT_CURPAD_ACTIVE("pad_block_start"); | 
|---|
| 891 | SAVEI32(PL_comppad_name_floor); | 
|---|
| 892 | PL_comppad_name_floor = AvFILLp(PL_comppad_name); | 
|---|
| 893 | if (full) | 
|---|
| 894 | PL_comppad_name_fill = PL_comppad_name_floor; | 
|---|
| 895 | if (PL_comppad_name_floor < 0) | 
|---|
| 896 | PL_comppad_name_floor = 0; | 
|---|
| 897 | SAVEI32(PL_min_intro_pending); | 
|---|
| 898 | SAVEI32(PL_max_intro_pending); | 
|---|
| 899 | PL_min_intro_pending = 0; | 
|---|
| 900 | SAVEI32(PL_comppad_name_fill); | 
|---|
| 901 | SAVEI32(PL_padix_floor); | 
|---|
| 902 | PL_padix_floor = PL_padix; | 
|---|
| 903 | PL_pad_reset_pending = FALSE; | 
|---|
| 904 | } | 
|---|
| 905 |  | 
|---|
| 906 |  | 
|---|
| 907 | /* | 
|---|
| 908 | =for apidoc intro_my | 
|---|
| 909 |  | 
|---|
| 910 | "Introduce" my variables to visible status. | 
|---|
| 911 |  | 
|---|
| 912 | =cut | 
|---|
| 913 | */ | 
|---|
| 914 |  | 
|---|
| 915 | U32 | 
|---|
| 916 | Perl_intro_my(pTHX) | 
|---|
| 917 | { | 
|---|
| 918 | SV **svp; | 
|---|
| 919 | I32 i; | 
|---|
| 920 |  | 
|---|
| 921 | ASSERT_CURPAD_ACTIVE("intro_my"); | 
|---|
| 922 | if (! PL_min_intro_pending) | 
|---|
| 923 | return PL_cop_seqmax; | 
|---|
| 924 |  | 
|---|
| 925 | svp = AvARRAY(PL_comppad_name); | 
|---|
| 926 | for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) { | 
|---|
| 927 | SV * const sv = svp[i]; | 
|---|
| 928 |  | 
|---|
| 929 | if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && !SvIVX(sv)) { | 
|---|
| 930 | SvIV_set(sv, PAD_MAX);      /* Don't know scope end yet. */ | 
|---|
| 931 | SvNV_set(sv, (NV)PL_cop_seqmax); | 
|---|
| 932 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 933 | "Pad intromy: %ld \"%s\", (%lu,%lu)\n", | 
|---|
| 934 | (long)i, SvPVX_const(sv), | 
|---|
| 935 | (unsigned long)U_32(SvNVX(sv)), (unsigned long)SvIVX(sv)) | 
|---|
| 936 | ); | 
|---|
| 937 | } | 
|---|
| 938 | } | 
|---|
| 939 | PL_min_intro_pending = 0; | 
|---|
| 940 | PL_comppad_name_fill = PL_max_intro_pending; /* Needn't search higher */ | 
|---|
| 941 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 942 | "Pad intromy: seq -> %ld\n", (long)(PL_cop_seqmax+1))); | 
|---|
| 943 |  | 
|---|
| 944 | return PL_cop_seqmax++; | 
|---|
| 945 | } | 
|---|
| 946 |  | 
|---|
| 947 | /* | 
|---|
| 948 | =for apidoc pad_leavemy | 
|---|
| 949 |  | 
|---|
| 950 | Cleanup at end of scope during compilation: set the max seq number for | 
|---|
| 951 | lexicals in this scope and warn of any lexicals that never got introduced. | 
|---|
| 952 |  | 
|---|
| 953 | =cut | 
|---|
| 954 | */ | 
|---|
| 955 |  | 
|---|
| 956 | void | 
|---|
| 957 | Perl_pad_leavemy(pTHX) | 
|---|
| 958 | { | 
|---|
| 959 | I32 off; | 
|---|
| 960 | SV * const * const svp = AvARRAY(PL_comppad_name); | 
|---|
| 961 |  | 
|---|
| 962 | PL_pad_reset_pending = FALSE; | 
|---|
| 963 |  | 
|---|
| 964 | ASSERT_CURPAD_ACTIVE("pad_leavemy"); | 
|---|
| 965 | if (PL_min_intro_pending && PL_comppad_name_fill < PL_min_intro_pending) { | 
|---|
| 966 | for (off = PL_max_intro_pending; off >= PL_min_intro_pending; off--) { | 
|---|
| 967 | const SV * const sv = svp[off]; | 
|---|
| 968 | if (sv && sv != &PL_sv_undef | 
|---|
| 969 | && !SvFAKE(sv) && ckWARN_d(WARN_INTERNAL)) | 
|---|
| 970 | Perl_warner(aTHX_ packWARN(WARN_INTERNAL), | 
|---|
| 971 | "%"SVf" never introduced", sv); | 
|---|
| 972 | } | 
|---|
| 973 | } | 
|---|
| 974 | /* "Deintroduce" my variables that are leaving with this scope. */ | 
|---|
| 975 | for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_fill; off--) { | 
|---|
| 976 | const SV * const sv = svp[off]; | 
|---|
| 977 | if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && SvIVX(sv) == PAD_MAX) { | 
|---|
| 978 | SvIV_set(sv, PL_cop_seqmax); | 
|---|
| 979 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 980 | "Pad leavemy: %ld \"%s\", (%lu,%lu)\n", | 
|---|
| 981 | (long)off, SvPVX_const(sv), | 
|---|
| 982 | (unsigned long)U_32(SvNVX(sv)), (unsigned long)SvIVX(sv)) | 
|---|
| 983 | ); | 
|---|
| 984 | } | 
|---|
| 985 | } | 
|---|
| 986 | PL_cop_seqmax++; | 
|---|
| 987 | DEBUG_Xv(PerlIO_printf(Perl_debug_log, | 
|---|
| 988 | "Pad leavemy: seq = %ld\n", (long)PL_cop_seqmax)); | 
|---|
| 989 | } | 
|---|
| 990 |  | 
|---|
| 991 |  | 
|---|
| 992 | /* | 
|---|
| 993 | =for apidoc pad_swipe | 
|---|
| 994 |  | 
|---|
| 995 | Abandon the tmp in the current pad at offset po and replace with a | 
|---|
| 996 | new one. | 
|---|
| 997 |  | 
|---|
| 998 | =cut | 
|---|
| 999 | */ | 
|---|
| 1000 |  | 
|---|
| 1001 | void | 
|---|
| 1002 | Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust) | 
|---|
| 1003 | { | 
|---|
| 1004 | ASSERT_CURPAD_LEGAL("pad_swipe"); | 
|---|
| 1005 | if (!PL_curpad) | 
|---|
| 1006 | return; | 
|---|
| 1007 | if (AvARRAY(PL_comppad) != PL_curpad) | 
|---|
| 1008 | Perl_croak(aTHX_ "panic: pad_swipe curpad"); | 
|---|
| 1009 | if (!po) | 
|---|
| 1010 | Perl_croak(aTHX_ "panic: pad_swipe po"); | 
|---|
| 1011 |  | 
|---|
| 1012 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 1013 | "Pad 0x%"UVxf"[0x%"UVxf"] swipe:   %ld\n", | 
|---|
| 1014 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long)po)); | 
|---|
| 1015 |  | 
|---|
| 1016 | if (PL_curpad[po]) | 
|---|
| 1017 | SvPADTMP_off(PL_curpad[po]); | 
|---|
| 1018 | if (refadjust) | 
|---|
| 1019 | SvREFCNT_dec(PL_curpad[po]); | 
|---|
| 1020 |  | 
|---|
| 1021 |  | 
|---|
| 1022 | /* if pad tmps aren't shared between ops, then there's no need to | 
|---|
| 1023 | * create a new tmp when an existing op is freed */ | 
|---|
| 1024 | #ifdef USE_BROKEN_PAD_RESET | 
|---|
| 1025 | PL_curpad[po] = NEWSV(1107,0); | 
|---|
| 1026 | SvPADTMP_on(PL_curpad[po]); | 
|---|
| 1027 | #else | 
|---|
| 1028 | PL_curpad[po] = &PL_sv_undef; | 
|---|
| 1029 | #endif | 
|---|
| 1030 | if ((I32)po < PL_padix) | 
|---|
| 1031 | PL_padix = po - 1; | 
|---|
| 1032 | } | 
|---|
| 1033 |  | 
|---|
| 1034 |  | 
|---|
| 1035 | /* | 
|---|
| 1036 | =for apidoc pad_reset | 
|---|
| 1037 |  | 
|---|
| 1038 | Mark all the current temporaries for reuse | 
|---|
| 1039 |  | 
|---|
| 1040 | =cut | 
|---|
| 1041 | */ | 
|---|
| 1042 |  | 
|---|
| 1043 | /* XXX pad_reset() is currently disabled because it results in serious bugs. | 
|---|
| 1044 | * It causes pad temp TARGs to be shared between OPs. Since TARGs are pushed | 
|---|
| 1045 | * on the stack by OPs that use them, there are several ways to get an alias | 
|---|
| 1046 | * to  a shared TARG.  Such an alias will change randomly and unpredictably. | 
|---|
| 1047 | * We avoid doing this until we can think of a Better Way. | 
|---|
| 1048 | * GSAR 97-10-29 */ | 
|---|
| 1049 | void | 
|---|
| 1050 | Perl_pad_reset(pTHX) | 
|---|
| 1051 | { | 
|---|
| 1052 | #ifdef USE_BROKEN_PAD_RESET | 
|---|
| 1053 | if (AvARRAY(PL_comppad) != PL_curpad) | 
|---|
| 1054 | Perl_croak(aTHX_ "panic: pad_reset curpad"); | 
|---|
| 1055 |  | 
|---|
| 1056 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 1057 | "Pad 0x%"UVxf"[0x%"UVxf"] reset:     padix %ld -> %ld", | 
|---|
| 1058 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), | 
|---|
| 1059 | (long)PL_padix, (long)PL_padix_floor | 
|---|
| 1060 | ) | 
|---|
| 1061 | ); | 
|---|
| 1062 |  | 
|---|
| 1063 | if (!PL_tainting) { /* Can't mix tainted and non-tainted temporaries. */ | 
|---|
| 1064 | register I32 po; | 
|---|
| 1065 | for (po = AvMAX(PL_comppad); po > PL_padix_floor; po--) { | 
|---|
| 1066 | if (PL_curpad[po] && !SvIMMORTAL(PL_curpad[po])) | 
|---|
| 1067 | SvPADTMP_off(PL_curpad[po]); | 
|---|
| 1068 | } | 
|---|
| 1069 | PL_padix = PL_padix_floor; | 
|---|
| 1070 | } | 
|---|
| 1071 | #endif | 
|---|
| 1072 | PL_pad_reset_pending = FALSE; | 
|---|
| 1073 | } | 
|---|
| 1074 |  | 
|---|
| 1075 |  | 
|---|
| 1076 | /* | 
|---|
| 1077 | =for apidoc pad_tidy | 
|---|
| 1078 |  | 
|---|
| 1079 | Tidy up a pad after we've finished compiling it: | 
|---|
| 1080 | * remove most stuff from the pads of anonsub prototypes; | 
|---|
| 1081 | * give it a @_; | 
|---|
| 1082 | * mark tmps as such. | 
|---|
| 1083 |  | 
|---|
| 1084 | =cut | 
|---|
| 1085 | */ | 
|---|
| 1086 |  | 
|---|
| 1087 | /* XXX DAPM surely most of this stuff should be done properly | 
|---|
| 1088 | * at the right time beforehand, rather than going around afterwards | 
|---|
| 1089 | * cleaning up our mistakes ??? | 
|---|
| 1090 | */ | 
|---|
| 1091 |  | 
|---|
| 1092 | void | 
|---|
| 1093 | Perl_pad_tidy(pTHX_ padtidy_type type) | 
|---|
| 1094 | { | 
|---|
| 1095 |  | 
|---|
| 1096 | ASSERT_CURPAD_ACTIVE("pad_tidy"); | 
|---|
| 1097 | /* extend curpad to match namepad */ | 
|---|
| 1098 | if (AvFILLp(PL_comppad_name) < AvFILLp(PL_comppad)) | 
|---|
| 1099 | av_store(PL_comppad_name, AvFILLp(PL_comppad), Nullsv); | 
|---|
| 1100 |  | 
|---|
| 1101 | if (type == padtidy_SUBCLONE) { | 
|---|
| 1102 | SV * const * const namep = AvARRAY(PL_comppad_name); | 
|---|
| 1103 | PADOFFSET ix; | 
|---|
| 1104 | for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { | 
|---|
| 1105 | SV *namesv; | 
|---|
| 1106 |  | 
|---|
| 1107 | if (SvIMMORTAL(PL_curpad[ix]) || IS_PADGV(PL_curpad[ix]) || IS_PADCONST(PL_curpad[ix])) | 
|---|
| 1108 | continue; | 
|---|
| 1109 | /* | 
|---|
| 1110 | * The only things that a clonable function needs in its | 
|---|
| 1111 | * pad are references to outer lexicals and anonymous subs. | 
|---|
| 1112 | * The rest are created anew during cloning. | 
|---|
| 1113 | */ | 
|---|
| 1114 | if (!((namesv = namep[ix]) != Nullsv && | 
|---|
| 1115 | namesv != &PL_sv_undef && | 
|---|
| 1116 | (SvFAKE(namesv) || | 
|---|
| 1117 | *SvPVX_const(namesv) == '&'))) | 
|---|
| 1118 | { | 
|---|
| 1119 | SvREFCNT_dec(PL_curpad[ix]); | 
|---|
| 1120 | PL_curpad[ix] = Nullsv; | 
|---|
| 1121 | } | 
|---|
| 1122 | } | 
|---|
| 1123 | } | 
|---|
| 1124 | else if (type == padtidy_SUB) { | 
|---|
| 1125 | /* XXX DAPM this same bit of code keeps appearing !!! Rationalise? */ | 
|---|
| 1126 | AV * const av = newAV();                        /* Will be @_ */ | 
|---|
| 1127 | av_extend(av, 0); | 
|---|
| 1128 | av_store(PL_comppad, 0, (SV*)av); | 
|---|
| 1129 | AvFLAGS(av) = AVf_REIFY; | 
|---|
| 1130 | } | 
|---|
| 1131 |  | 
|---|
| 1132 | /* XXX DAPM rationalise these two similar branches */ | 
|---|
| 1133 |  | 
|---|
| 1134 | if (type == padtidy_SUB) { | 
|---|
| 1135 | PADOFFSET ix; | 
|---|
| 1136 | for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { | 
|---|
| 1137 | if (SvIMMORTAL(PL_curpad[ix]) || IS_PADGV(PL_curpad[ix]) || IS_PADCONST(PL_curpad[ix])) | 
|---|
| 1138 | continue; | 
|---|
| 1139 | if (!SvPADMY(PL_curpad[ix])) | 
|---|
| 1140 | SvPADTMP_on(PL_curpad[ix]); | 
|---|
| 1141 | } | 
|---|
| 1142 | } | 
|---|
| 1143 | else if (type == padtidy_FORMAT) { | 
|---|
| 1144 | PADOFFSET ix; | 
|---|
| 1145 | for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { | 
|---|
| 1146 | if (!SvPADMY(PL_curpad[ix]) && !SvIMMORTAL(PL_curpad[ix])) | 
|---|
| 1147 | SvPADTMP_on(PL_curpad[ix]); | 
|---|
| 1148 | } | 
|---|
| 1149 | } | 
|---|
| 1150 | PL_curpad = AvARRAY(PL_comppad); | 
|---|
| 1151 | } | 
|---|
| 1152 |  | 
|---|
| 1153 |  | 
|---|
| 1154 | /* | 
|---|
| 1155 | =for apidoc pad_free | 
|---|
| 1156 |  | 
|---|
| 1157 | Free the SV at offset po in the current pad. | 
|---|
| 1158 |  | 
|---|
| 1159 | =cut | 
|---|
| 1160 | */ | 
|---|
| 1161 |  | 
|---|
| 1162 | /* XXX DAPM integrate with pad_swipe ???? */ | 
|---|
| 1163 | void | 
|---|
| 1164 | Perl_pad_free(pTHX_ PADOFFSET po) | 
|---|
| 1165 | { | 
|---|
| 1166 | ASSERT_CURPAD_LEGAL("pad_free"); | 
|---|
| 1167 | if (!PL_curpad) | 
|---|
| 1168 | return; | 
|---|
| 1169 | if (AvARRAY(PL_comppad) != PL_curpad) | 
|---|
| 1170 | Perl_croak(aTHX_ "panic: pad_free curpad"); | 
|---|
| 1171 | if (!po) | 
|---|
| 1172 | Perl_croak(aTHX_ "panic: pad_free po"); | 
|---|
| 1173 |  | 
|---|
| 1174 | DEBUG_X(PerlIO_printf(Perl_debug_log, | 
|---|
| 1175 | "Pad 0x%"UVxf"[0x%"UVxf"] free:    %ld\n", | 
|---|
| 1176 | PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long)po) | 
|---|
| 1177 | ); | 
|---|
| 1178 |  | 
|---|
| 1179 | if (PL_curpad[po] && PL_curpad[po] != &PL_sv_undef) { | 
|---|
| 1180 | SvPADTMP_off(PL_curpad[po]); | 
|---|
| 1181 | #ifdef USE_ITHREADS | 
|---|
| 1182 | /* SV could be a shared hash key (eg bugid #19022) */ | 
|---|
| 1183 | if (!SvFAKE(PL_curpad[po])) | 
|---|
| 1184 | SvREADONLY_off(PL_curpad[po]);      /* could be a freed constant */ | 
|---|
| 1185 | #endif | 
|---|
| 1186 |  | 
|---|
| 1187 | } | 
|---|
| 1188 | if ((I32)po < PL_padix) | 
|---|
| 1189 | PL_padix = po - 1; | 
|---|
| 1190 | } | 
|---|
| 1191 |  | 
|---|
| 1192 |  | 
|---|
| 1193 |  | 
|---|
| 1194 | /* | 
|---|
| 1195 | =for apidoc do_dump_pad | 
|---|
| 1196 |  | 
|---|
| 1197 | Dump the contents of a padlist | 
|---|
| 1198 |  | 
|---|
| 1199 | =cut | 
|---|
| 1200 | */ | 
|---|
| 1201 |  | 
|---|
| 1202 | void | 
|---|
| 1203 | Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full) | 
|---|
| 1204 | { | 
|---|
| 1205 | const AV *pad_name; | 
|---|
| 1206 | const AV *pad; | 
|---|
| 1207 | SV **pname; | 
|---|
| 1208 | SV **ppad; | 
|---|
| 1209 | I32 ix; | 
|---|
| 1210 |  | 
|---|
| 1211 | if (!padlist) { | 
|---|
| 1212 | return; | 
|---|
| 1213 | } | 
|---|
| 1214 | pad_name = (AV*)*av_fetch((AV*)padlist, 0, FALSE); | 
|---|
| 1215 | pad = (AV*)*av_fetch((AV*)padlist, 1, FALSE); | 
|---|
| 1216 | pname = AvARRAY(pad_name); | 
|---|
| 1217 | ppad = AvARRAY(pad); | 
|---|
| 1218 | Perl_dump_indent(aTHX_ level, file, | 
|---|
| 1219 | "PADNAME = 0x%"UVxf"(0x%"UVxf") PAD = 0x%"UVxf"(0x%"UVxf")\n", | 
|---|
| 1220 | PTR2UV(pad_name), PTR2UV(pname), PTR2UV(pad), PTR2UV(ppad) | 
|---|
| 1221 | ); | 
|---|
| 1222 |  | 
|---|
| 1223 | for (ix = 1; ix <= AvFILLp(pad_name); ix++) { | 
|---|
| 1224 | const SV *namesv = pname[ix]; | 
|---|
| 1225 | if (namesv && namesv == &PL_sv_undef) { | 
|---|
| 1226 | namesv = Nullsv; | 
|---|
| 1227 | } | 
|---|
| 1228 | if (namesv) { | 
|---|
| 1229 | if (SvFAKE(namesv)) | 
|---|
| 1230 | Perl_dump_indent(aTHX_ level+1, file, | 
|---|
| 1231 | "%2d. 0x%"UVxf"<%lu> FAKE \"%s\"\n", | 
|---|
| 1232 | (int) ix, | 
|---|
| 1233 | PTR2UV(ppad[ix]), | 
|---|
| 1234 | (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0), | 
|---|
| 1235 | SvPVX_const(namesv) | 
|---|
| 1236 | ); | 
|---|
| 1237 | else | 
|---|
| 1238 | Perl_dump_indent(aTHX_ level+1, file, | 
|---|
| 1239 | "%2d. 0x%"UVxf"<%lu> (%lu,%lu) \"%s\"\n", | 
|---|
| 1240 | (int) ix, | 
|---|
| 1241 | PTR2UV(ppad[ix]), | 
|---|
| 1242 | (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0), | 
|---|
| 1243 | (unsigned long)U_32(SvNVX(namesv)), | 
|---|
| 1244 | (unsigned long)SvIVX(namesv), | 
|---|
| 1245 | SvPVX_const(namesv) | 
|---|
| 1246 | ); | 
|---|
| 1247 | } | 
|---|
| 1248 | else if (full) { | 
|---|
| 1249 | Perl_dump_indent(aTHX_ level+1, file, | 
|---|
| 1250 | "%2d. 0x%"UVxf"<%lu>\n", | 
|---|
| 1251 | (int) ix, | 
|---|
| 1252 | PTR2UV(ppad[ix]), | 
|---|
| 1253 | (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0) | 
|---|
| 1254 | ); | 
|---|
| 1255 | } | 
|---|
| 1256 | } | 
|---|
| 1257 | } | 
|---|
| 1258 |  | 
|---|
| 1259 |  | 
|---|
| 1260 |  | 
|---|
| 1261 | /* | 
|---|
| 1262 | =for apidoc cv_dump | 
|---|
| 1263 |  | 
|---|
| 1264 | dump the contents of a CV | 
|---|
| 1265 |  | 
|---|
| 1266 | =cut | 
|---|
| 1267 | */ | 
|---|
| 1268 |  | 
|---|
| 1269 | #ifdef DEBUGGING | 
|---|
| 1270 | STATIC void | 
|---|
| 1271 | S_cv_dump(pTHX_ const CV *cv, const char *title) | 
|---|
| 1272 | { | 
|---|
| 1273 | const CV * const outside = CvOUTSIDE(cv); | 
|---|
| 1274 | AV* const padlist = CvPADLIST(cv); | 
|---|
| 1275 |  | 
|---|
| 1276 | PerlIO_printf(Perl_debug_log, | 
|---|
| 1277 | "  %s: CV=0x%"UVxf" (%s), OUTSIDE=0x%"UVxf" (%s)\n", | 
|---|
| 1278 | title, | 
|---|
| 1279 | PTR2UV(cv), | 
|---|
| 1280 | (CvANON(cv) ? "ANON" | 
|---|
| 1281 | : (cv == PL_main_cv) ? "MAIN" | 
|---|
| 1282 | : CvUNIQUE(cv) ? "UNIQUE" | 
|---|
| 1283 | : CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"), | 
|---|
| 1284 | PTR2UV(outside), | 
|---|
| 1285 | (!outside ? "null" | 
|---|
| 1286 | : CvANON(outside) ? "ANON" | 
|---|
| 1287 | : (outside == PL_main_cv) ? "MAIN" | 
|---|
| 1288 | : CvUNIQUE(outside) ? "UNIQUE" | 
|---|
| 1289 | : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED")); | 
|---|
| 1290 |  | 
|---|
| 1291 | PerlIO_printf(Perl_debug_log, | 
|---|
| 1292 | "    PADLIST = 0x%"UVxf"\n", PTR2UV(padlist)); | 
|---|
| 1293 | do_dump_pad(1, Perl_debug_log, padlist, 1); | 
|---|
| 1294 | } | 
|---|
| 1295 | #endif /* DEBUGGING */ | 
|---|
| 1296 |  | 
|---|
| 1297 |  | 
|---|
| 1298 |  | 
|---|
| 1299 |  | 
|---|
| 1300 |  | 
|---|
| 1301 | /* | 
|---|
| 1302 | =for apidoc cv_clone | 
|---|
| 1303 |  | 
|---|
| 1304 | Clone a CV: make a new CV which points to the same code etc, but which | 
|---|
| 1305 | has a newly-created pad built by copying the prototype pad and capturing | 
|---|
| 1306 | any outer lexicals. | 
|---|
| 1307 |  | 
|---|
| 1308 | =cut | 
|---|
| 1309 | */ | 
|---|
| 1310 |  | 
|---|
| 1311 | CV * | 
|---|
| 1312 | Perl_cv_clone(pTHX_ CV *proto) | 
|---|
| 1313 | { | 
|---|
| 1314 | CV *cv; | 
|---|
| 1315 |  | 
|---|
| 1316 | LOCK_CRED_MUTEX;                    /* XXX create separate mutex */ | 
|---|
| 1317 | cv = cv_clone2(proto, CvOUTSIDE(proto)); | 
|---|
| 1318 | UNLOCK_CRED_MUTEX;                  /* XXX create separate mutex */ | 
|---|
| 1319 | return cv; | 
|---|
| 1320 | } | 
|---|
| 1321 |  | 
|---|
| 1322 |  | 
|---|
| 1323 | /* XXX DAPM separate out cv and paddish bits ??? | 
|---|
| 1324 | * ideally the CV-related stuff shouldn't be in pad.c - how about | 
|---|
| 1325 | * a cv.c? */ | 
|---|
| 1326 |  | 
|---|
| 1327 | STATIC CV * | 
|---|
| 1328 | S_cv_clone2(pTHX_ CV *proto, CV *outside) | 
|---|
| 1329 | { | 
|---|
| 1330 | I32 ix; | 
|---|
| 1331 | AV* const protopadlist = CvPADLIST(proto); | 
|---|
| 1332 | const AV* const protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE); | 
|---|
| 1333 | const AV* const protopad = (AV*)*av_fetch(protopadlist, 1, FALSE); | 
|---|
| 1334 | SV** const pname = AvARRAY(protopad_name); | 
|---|
| 1335 | SV** const ppad = AvARRAY(protopad); | 
|---|
| 1336 | const I32 fname = AvFILLp(protopad_name); | 
|---|
| 1337 | const I32 fpad = AvFILLp(protopad); | 
|---|
| 1338 | CV* cv; | 
|---|
| 1339 |  | 
|---|
| 1340 | assert(!CvUNIQUE(proto)); | 
|---|
| 1341 |  | 
|---|
| 1342 | ENTER; | 
|---|
| 1343 | SAVESPTR(PL_compcv); | 
|---|
| 1344 |  | 
|---|
| 1345 | cv = PL_compcv = (CV*)NEWSV(1104, 0); | 
|---|
| 1346 | sv_upgrade((SV *)cv, SvTYPE(proto)); | 
|---|
| 1347 | CvFLAGS(cv) = CvFLAGS(proto) & ~(CVf_CLONE|CVf_WEAKOUTSIDE); | 
|---|
| 1348 | CvCLONED_on(cv); | 
|---|
| 1349 |  | 
|---|
| 1350 | #ifdef USE_5005THREADS | 
|---|
| 1351 | New(666, CvMUTEXP(cv), 1, perl_mutex); | 
|---|
| 1352 | MUTEX_INIT(CvMUTEXP(cv)); | 
|---|
| 1353 | CvOWNER(cv)         = 0; | 
|---|
| 1354 | #endif /* USE_5005THREADS */ | 
|---|
| 1355 | #ifdef USE_ITHREADS | 
|---|
| 1356 | CvFILE(cv)          = CvXSUB(proto) ? CvFILE(proto) | 
|---|
| 1357 | : savepv(CvFILE(proto)); | 
|---|
| 1358 | #else | 
|---|
| 1359 | CvFILE(cv)          = CvFILE(proto); | 
|---|
| 1360 | #endif | 
|---|
| 1361 | CvGV(cv)            = CvGV(proto); | 
|---|
| 1362 | CvSTASH(cv)         = CvSTASH(proto); | 
|---|
| 1363 | OP_REFCNT_LOCK; | 
|---|
| 1364 | CvROOT(cv)          = OpREFCNT_inc(CvROOT(proto)); | 
|---|
| 1365 | OP_REFCNT_UNLOCK; | 
|---|
| 1366 | CvSTART(cv)         = CvSTART(proto); | 
|---|
| 1367 | if (outside) { | 
|---|
| 1368 | CvOUTSIDE(cv)   = (CV*)SvREFCNT_inc(outside); | 
|---|
| 1369 | CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto); | 
|---|
| 1370 | } | 
|---|
| 1371 |  | 
|---|
| 1372 | if (SvPOK(proto)) | 
|---|
| 1373 | sv_setpvn((SV*)cv, SvPVX_const(proto), SvCUR(proto)); | 
|---|
| 1374 |  | 
|---|
| 1375 | CvPADLIST(cv) = pad_new(padnew_CLONE|padnew_SAVE); | 
|---|
| 1376 |  | 
|---|
| 1377 | for (ix = fname; ix >= 0; ix--) | 
|---|
| 1378 | av_store(PL_comppad_name, ix, SvREFCNT_inc(pname[ix])); | 
|---|
| 1379 |  | 
|---|
| 1380 | av_fill(PL_comppad, fpad); | 
|---|
| 1381 | PL_curpad = AvARRAY(PL_comppad); | 
|---|
| 1382 |  | 
|---|
| 1383 | for (ix = fpad; ix > 0; ix--) { | 
|---|
| 1384 | SV* const namesv = (ix <= fname) ? pname[ix] : Nullsv; | 
|---|
| 1385 | if (namesv && namesv != &PL_sv_undef) { | 
|---|
| 1386 | const char *name = SvPVX_const(namesv);    /* XXX */ | 
|---|
| 1387 | if (SvFLAGS(namesv) & SVf_FAKE) {   /* lexical from outside? */ | 
|---|
| 1388 | I32 off = pad_findlex(name, ix, cv); | 
|---|
| 1389 | if (!off) | 
|---|
| 1390 | PL_curpad[ix] = SvREFCNT_inc(ppad[ix]); | 
|---|
| 1391 | else if (off != ix) | 
|---|
| 1392 | Perl_croak(aTHX_ "panic: cv_clone: %s", name); | 
|---|
| 1393 | } | 
|---|
| 1394 | else {                              /* our own lexical */ | 
|---|
| 1395 | SV* sv; | 
|---|
| 1396 | if (*name == '&') { | 
|---|
| 1397 | /* anon code -- we'll come back for it */ | 
|---|
| 1398 | sv = SvREFCNT_inc(ppad[ix]); | 
|---|
| 1399 | } | 
|---|
| 1400 | else if (*name == '@') | 
|---|
| 1401 | sv = (SV*)newAV(); | 
|---|
| 1402 | else if (*name == '%') | 
|---|
| 1403 | sv = (SV*)newHV(); | 
|---|
| 1404 | else | 
|---|
| 1405 | sv = NEWSV(0, 0); | 
|---|
| 1406 | if (!SvPADBUSY(sv)) | 
|---|
| 1407 | SvPADMY_on(sv); | 
|---|
| 1408 | PL_curpad[ix] = sv; | 
|---|
| 1409 | } | 
|---|
| 1410 | } | 
|---|
| 1411 | else if (IS_PADGV(ppad[ix]) || IS_PADCONST(ppad[ix])) { | 
|---|
| 1412 | PL_curpad[ix] = SvREFCNT_inc(ppad[ix]); | 
|---|
| 1413 | } | 
|---|
| 1414 | else { | 
|---|
| 1415 | SV* sv = NEWSV(0, 0); | 
|---|
| 1416 | SvPADTMP_on(sv); | 
|---|
| 1417 | PL_curpad[ix] = sv; | 
|---|
| 1418 | } | 
|---|
| 1419 | } | 
|---|
| 1420 |  | 
|---|
| 1421 | /* Now that vars are all in place, clone nested closures. */ | 
|---|
| 1422 |  | 
|---|
| 1423 | for (ix = fpad; ix > 0; ix--) { | 
|---|
| 1424 | SV* namesv = (ix <= fname) ? pname[ix] : Nullsv; | 
|---|
| 1425 | if (namesv | 
|---|
| 1426 | && namesv != &PL_sv_undef | 
|---|
| 1427 | && !(SvFLAGS(namesv) & SVf_FAKE) | 
|---|
| 1428 | && *SvPVX(namesv) == '&' | 
|---|
| 1429 | && CvCLONE(ppad[ix])) | 
|---|
| 1430 | { | 
|---|
| 1431 | CV *kid = cv_clone2((CV*)ppad[ix], cv); | 
|---|
| 1432 | SvREFCNT_dec(ppad[ix]); | 
|---|
| 1433 | CvCLONE_on(kid); | 
|---|
| 1434 | SvPADMY_on(kid); | 
|---|
| 1435 | PL_curpad[ix] = (SV*)kid; | 
|---|
| 1436 | /* '&' entry points to child, so child mustn't refcnt parent */ | 
|---|
| 1437 | CvWEAKOUTSIDE_on(kid); | 
|---|
| 1438 | SvREFCNT_dec(cv); | 
|---|
| 1439 | } | 
|---|
| 1440 | } | 
|---|
| 1441 |  | 
|---|
| 1442 | DEBUG_Xv( | 
|---|
| 1443 | PerlIO_printf(Perl_debug_log, "\nPad CV clone\n"); | 
|---|
| 1444 | cv_dump(outside, "Outside"); | 
|---|
| 1445 | cv_dump(proto,   "Proto"); | 
|---|
| 1446 | cv_dump(cv,      "To"); | 
|---|
| 1447 | ); | 
|---|
| 1448 |  | 
|---|
| 1449 | LEAVE; | 
|---|
| 1450 |  | 
|---|
| 1451 | if (CvCONST(cv)) { | 
|---|
| 1452 | SV* const const_sv = op_const_sv(CvSTART(cv), cv); | 
|---|
| 1453 | assert(const_sv); | 
|---|
| 1454 | /* constant sub () { $x } closing over $x - see lib/constant.pm */ | 
|---|
| 1455 | SvREFCNT_dec(cv); | 
|---|
| 1456 | cv = newCONSTSUB(CvSTASH(proto), Nullch, const_sv); | 
|---|
| 1457 | } | 
|---|
| 1458 |  | 
|---|
| 1459 | return cv; | 
|---|
| 1460 | } | 
|---|
| 1461 |  | 
|---|
| 1462 |  | 
|---|
| 1463 | /* | 
|---|
| 1464 | =for apidoc pad_fixup_inner_anons | 
|---|
| 1465 |  | 
|---|
| 1466 | For any anon CVs in the pad, change CvOUTSIDE of that CV from | 
|---|
| 1467 | old_cv to new_cv if necessary. Needed when a newly-compiled CV has to be | 
|---|
| 1468 | moved to a pre-existing CV struct. | 
|---|
| 1469 |  | 
|---|
| 1470 | =cut | 
|---|
| 1471 | */ | 
|---|
| 1472 |  | 
|---|
| 1473 | void | 
|---|
| 1474 | Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv) | 
|---|
| 1475 | { | 
|---|
| 1476 | I32 ix; | 
|---|
| 1477 | AV * const comppad_name = (AV*)AvARRAY(padlist)[0]; | 
|---|
| 1478 | AV * const comppad = (AV*)AvARRAY(padlist)[1]; | 
|---|
| 1479 | SV ** const namepad = AvARRAY(comppad_name); | 
|---|
| 1480 | SV ** const curpad = AvARRAY(comppad); | 
|---|
| 1481 | for (ix = AvFILLp(comppad_name); ix > 0; ix--) { | 
|---|
| 1482 | const SV * const namesv = namepad[ix]; | 
|---|
| 1483 | if (namesv && namesv != &PL_sv_undef | 
|---|
| 1484 | && *SvPVX_const(namesv) == '&') | 
|---|
| 1485 | { | 
|---|
| 1486 | CV * const innercv = (CV*)curpad[ix]; | 
|---|
| 1487 | assert(CvWEAKOUTSIDE(innercv)); | 
|---|
| 1488 | assert(CvOUTSIDE(innercv) == old_cv); | 
|---|
| 1489 | CvOUTSIDE(innercv) = new_cv; | 
|---|
| 1490 | } | 
|---|
| 1491 | } | 
|---|
| 1492 | } | 
|---|
| 1493 |  | 
|---|
| 1494 |  | 
|---|
| 1495 | /* | 
|---|
| 1496 | =for apidoc pad_push | 
|---|
| 1497 |  | 
|---|
| 1498 | Push a new pad frame onto the padlist, unless there's already a pad at | 
|---|
| 1499 | this depth, in which case don't bother creating a new one. | 
|---|
| 1500 | If has_args is true, give the new pad an @_ in slot zero. | 
|---|
| 1501 |  | 
|---|
| 1502 | =cut | 
|---|
| 1503 | */ | 
|---|
| 1504 |  | 
|---|
| 1505 | /* XXX pad_push is now always called with has_args == 1. Get rid of | 
|---|
| 1506 | * this arg at some point */ | 
|---|
| 1507 |  | 
|---|
| 1508 | void | 
|---|
| 1509 | Perl_pad_push(pTHX_ PADLIST *padlist, int depth, int has_args) | 
|---|
| 1510 | { | 
|---|
| 1511 | if (depth <= AvFILLp(padlist)) | 
|---|
| 1512 | return; | 
|---|
| 1513 |  | 
|---|
| 1514 | { | 
|---|
| 1515 | SV** const svp = AvARRAY(padlist); | 
|---|
| 1516 | AV* const newpad = newAV(); | 
|---|
| 1517 | SV** const oldpad = AvARRAY(svp[depth-1]); | 
|---|
| 1518 | I32 ix = AvFILLp((AV*)svp[1]); | 
|---|
| 1519 | I32 names_fill = AvFILLp((AV*)svp[0]); | 
|---|
| 1520 | SV** const names = AvARRAY(svp[0]); | 
|---|
| 1521 | SV* sv; | 
|---|
| 1522 | for ( ;ix > 0; ix--) { | 
|---|
| 1523 | if (names_fill >= ix && names[ix] != &PL_sv_undef) { | 
|---|
| 1524 | const char *name = SvPVX_const(names[ix]); | 
|---|
| 1525 | if ((SvFLAGS(names[ix]) & SVf_FAKE) || *name == '&') { | 
|---|
| 1526 | /* outer lexical or anon code */ | 
|---|
| 1527 | av_store(newpad, ix, SvREFCNT_inc(oldpad[ix])); | 
|---|
| 1528 | } | 
|---|
| 1529 | else {          /* our own lexical */ | 
|---|
| 1530 | if (*name == '@') | 
|---|
| 1531 | av_store(newpad, ix, sv = (SV*)newAV()); | 
|---|
| 1532 | else if (*name == '%') | 
|---|
| 1533 | av_store(newpad, ix, sv = (SV*)newHV()); | 
|---|
| 1534 | else | 
|---|
| 1535 | av_store(newpad, ix, sv = NEWSV(0, 0)); | 
|---|
| 1536 | SvPADMY_on(sv); | 
|---|
| 1537 | } | 
|---|
| 1538 | } | 
|---|
| 1539 | else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) { | 
|---|
| 1540 | av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix])); | 
|---|
| 1541 | } | 
|---|
| 1542 | else { | 
|---|
| 1543 | /* save temporaries on recursion? */ | 
|---|
| 1544 | av_store(newpad, ix, sv = NEWSV(0, 0)); | 
|---|
| 1545 | SvPADTMP_on(sv); | 
|---|
| 1546 | } | 
|---|
| 1547 | } | 
|---|
| 1548 | if (has_args) { | 
|---|
| 1549 | AV* av = newAV(); | 
|---|
| 1550 | av_extend(av, 0); | 
|---|
| 1551 | av_store(newpad, 0, (SV*)av); | 
|---|
| 1552 | AvFLAGS(av) = AVf_REIFY; | 
|---|
| 1553 | } | 
|---|
| 1554 | av_store(padlist, depth, (SV*)newpad); | 
|---|
| 1555 | AvFILLp(padlist) = depth; | 
|---|
| 1556 | } | 
|---|
| 1557 | } | 
|---|
| 1558 |  | 
|---|
| 1559 |  | 
|---|
| 1560 | HV * | 
|---|
| 1561 | Perl_pad_compname_type(pTHX_ const PADOFFSET po) | 
|---|
| 1562 | { | 
|---|
| 1563 | SV* const * const av = av_fetch(PL_comppad_name, po, FALSE); | 
|---|
| 1564 | if ( SvFLAGS(*av) & SVpad_TYPED ) { | 
|---|
| 1565 | return SvSTASH(*av); | 
|---|
| 1566 | } | 
|---|
| 1567 | return Nullhv; | 
|---|
| 1568 | } | 
|---|
| 1569 |  | 
|---|
| 1570 | /* | 
|---|
| 1571 | * Local variables: | 
|---|
| 1572 | * c-indentation-style: bsd | 
|---|
| 1573 | * c-basic-offset: 4 | 
|---|
| 1574 | * indent-tabs-mode: t | 
|---|
| 1575 | * End: | 
|---|
| 1576 | * | 
|---|
| 1577 | * ex: set ts=8 sts=4 sw=4 noet: | 
|---|
| 1578 | */ | 
|---|