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