This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
xgv_stash can be stored as a union with the NV, reducing the size of
[perl5.git] / pad.c
... / ...
CommitLineData
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
25This file contains the functions that create and manipulate scratchpads,
26which are array-of-array data structures attached to a CV (ie a sub)
27and which store lexical variables and opcode temporary and per-thread
28values.
29
30=for apidoc m|AV *|CvPADLIST|CV *cv
31CV's can have CvPADLIST(cv) set to point to an AV.
32
33For these purposes "forms" are a kind-of CV, eval""s are too (except they're
34not callable at will and are always thrown away after the eval"" is done
35executing). Require'd files are simply evals without any outer lexical
36scope.
37
38XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad,
39but that is really the callers pad (a slot of which is allocated by
40every entersub).
41
42The CvPADLIST AV has does not have AvREAL set, so REFCNT of component items
43is managed "manual" (mostly in pad.c) rather than normal av.c rules.
44The items in the AV are not SVs as for a normal AV, but other AVs:
45
460'th Entry of the CvPADLIST is an AV which represents the "names" or rather
47the "static type information" for lexicals.
48
49The CvDEPTH'th entry of CvPADLIST AV is an AV which is the stack frame at that
50depth of recursion into the CV.
51The 0'th slot of a frame AV is an AV which is @_.
52other entries are storage for variables and op targets.
53
54During compilation:
55C<PL_comppad_name> is set to the names AV.
56C<PL_comppad> is set to the frame AV for the frame CvDEPTH == 1.
57C<PL_curpad> is set to the body of the frame AV (i.e. AvARRAY(PL_comppad)).
58
59During execution, C<PL_comppad> and C<PL_curpad> refer to the live
60frame of the currently executing sub.
61
62Iterating over the names AV iterates over all possible pad
63items. Pad slots that are SVs_PADTMP (targets/GVs/constants) end up having
64&PL_sv_undef "names" (see pad_alloc()).
65
66Only my/our variable (SVs_PADMY/SVs_PADOUR) slots get valid names.
67The rest are op targets/GVs/constants which are statically allocated
68or resolved at compile time. These don't have names by which they
69can be looked up from Perl code at run time through eval"" like
70my/our variables can be. Since they can't be looked up by "name"
71but only by their index allocated at compile time (which is usually
72in PL_op->op_targ), wasting a name SV for them doesn't make sense.
73
74The SVs in the names AV have their PV being the name of the variable.
75NV+1..IV inclusive is a range of cop_seq numbers for which the name is
76valid. For typed lexicals name SV is SVt_PVMG and SvSTASH points at the
77type. For C<our> lexicals, the type is also SVt_PVGV, with the MAGIC slot
78pointing at the stash of the associated global (so that duplicate C<our>
79declarations in the same package can be detected). SvCUR is sometimes
80hijacked to store the generation number during compilation.
81
82If SvFAKE is set on the name SV, then that slot in the frame AV is
83a REFCNT'ed reference to a lexical from "outside". In this case,
84the name SV does not use NVX and IVX to store a cop_seq range, since it is
85in scope throughout. Instead IVX stores some flags containing info about
86the real lexical (is it declared in an anon, and is it capable of being
87instantiated multiple times?), and for fake ANONs, NVX contains the index
88within the parent's pad where the lexical's value is stored, to make
89cloning quicker.
90
91If the 'name' is '&' the corresponding entry in frame AV
92is a CV representing a possible closure.
93(SvFAKE and name of '&' is not a meaningful combination currently but could
94become so if C<my sub foo {}> is implemented.)
95
96Note that formats are treated as anon subs, and are cloned each time
97write is called (if necessary).
98
99The flag SVf_PADSTALE is cleared on lexicals each time the my() is executed,
100and set on scope exit. This allows the 'Variable $x is not available' warning
101to 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
121Create a new compiling padlist, saving and updating the various global
122vars at the same time as creating the pad itself. The following flags
123can 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
132PADLIST *
133Perl_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, NULL);
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
217Free the padlist associated with a CV.
218If parts of it happen to be current, we null the relevant
219PL_*pad* global vars so that we don't have any dangling references left.
220We also repoint the CvOUTSIDE of any about-to-be-orphaned
221inner subs to the outer of this cv.
222
223(This function should really be called pad_free, but the name was already
224taken)
225
226=cut
227*/
228
229void
230Perl_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] = NULL;
268 SvREFCNT_dec(namesv);
269
270 if (SvREFCNT(comppad) < 2) { /* allow for /(?{ sub{} })/ */
271 curpad[ix] = NULL;
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) = NULL;
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;
311}
312
313
314
315
316/*
317=for apidoc pad_add_name
318
319Create a new name and associated PADMY SV in the current pad; return the
320offset.
321If C<typestash> is valid, the name is for a typed lexical; set the
322name's stash to that value.
323If C<ourstash> is valid, it's an our lexical, set the name's
324OURSTASH to that value
325
326If fake, it means we're cloning an existing entry
327
328=cut
329*/
330
331PADOFFSET
332Perl_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(0);
337
338 ASSERT_CURPAD_ACTIVE("pad_add_name");
339
340
341 sv_upgrade(namesv, (ourstash || typestash) ? SVt_PVMG : SVt_PVNV);
342 sv_setpv(namesv, name);
343
344 if (typestash) {
345 SvPAD_TYPED_on(namesv);
346 SvSTASH_set(namesv, (HV*)SvREFCNT_inc((SV*) typestash));
347 }
348 if (ourstash) {
349 SvPAD_OUR_on(namesv);
350 OURSTASH_set(namesv, ourstash);
351 SvREFCNT_inc(ourstash);
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
390Allocate a new my or tmp pad entry. For a my, simply push a null SV onto
391the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards
392for 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
407PADOFFSET
408Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype)
409{
410 dVAR;
411 SV *sv;
412 I32 retval;
413
414 PERL_UNUSED_ARG(optype);
415 ASSERT_CURPAD_ACTIVE("pad_alloc");
416
417 if (AvARRAY(PL_comppad) != PL_curpad)
418 Perl_croak(aTHX_ "panic: pad_alloc");
419 if (PL_pad_reset_pending)
420 pad_reset();
421 if (tmptype & SVs_PADMY) {
422 sv = *av_fetch(PL_comppad, AvFILLp(PL_comppad) + 1, TRUE);
423 retval = AvFILLp(PL_comppad);
424 }
425 else {
426 SV * const * const names = AvARRAY(PL_comppad_name);
427 const SSize_t names_fill = AvFILLp(PL_comppad_name);
428 for (;;) {
429 /*
430 * "foreach" index vars temporarily become aliases to non-"my"
431 * values. Thus we must skip, not just pad values that are
432 * marked as current pad values, but also those with names.
433 */
434 /* HVDS why copy to sv here? we don't seem to use it */
435 if (++PL_padix <= names_fill &&
436 (sv = names[PL_padix]) && sv != &PL_sv_undef)
437 continue;
438 sv = *av_fetch(PL_comppad, PL_padix, TRUE);
439 if (!(SvFLAGS(sv) & (SVs_PADTMP | SVs_PADMY)) &&
440 !IS_PADGV(sv) && !IS_PADCONST(sv))
441 break;
442 }
443 retval = PL_padix;
444 }
445 SvFLAGS(sv) |= tmptype;
446 PL_curpad = AvARRAY(PL_comppad);
447
448 DEBUG_X(PerlIO_printf(Perl_debug_log,
449 "Pad 0x%"UVxf"[0x%"UVxf"] alloc: %ld for %s\n",
450 PTR2UV(PL_comppad), PTR2UV(PL_curpad), (long) retval,
451 PL_op_name[optype]));
452#ifdef DEBUG_LEAKING_SCALARS
453 sv->sv_debug_optype = optype;
454 sv->sv_debug_inpad = 1;
455#endif
456 return (PADOFFSET)retval;
457}
458
459/*
460=for apidoc pad_add_anon
461
462Add an anon code entry to the current compiling pad
463
464=cut
465*/
466
467PADOFFSET
468Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type)
469{
470 dVAR;
471 PADOFFSET ix;
472 SV* const name = newSV(0);
473 sv_upgrade(name, SVt_PVNV);
474 sv_setpvn(name, "&", 1);
475 SvIV_set(name, -1);
476 SvNV_set(name, 1);
477 ix = pad_alloc(op_type, SVs_PADMY);
478 av_store(PL_comppad_name, ix, name);
479 /* XXX DAPM use PL_curpad[] ? */
480 av_store(PL_comppad, ix, sv);
481 SvPADMY_on(sv);
482
483 /* to avoid ref loops, we never have parent + child referencing each
484 * other simultaneously */
485 if (CvOUTSIDE((CV*)sv)) {
486 assert(!CvWEAKOUTSIDE((CV*)sv));
487 CvWEAKOUTSIDE_on((CV*)sv);
488 SvREFCNT_dec(CvOUTSIDE((CV*)sv));
489 }
490 return ix;
491}
492
493
494
495/*
496=for apidoc pad_check_dup
497
498Check for duplicate declarations: report any of:
499 * a my in the current scope with the same name;
500 * an our (anywhere in the pad) with the same name and the same stash
501 as C<ourstash>
502C<is_our> indicates that the name to check is an 'our' declaration
503
504=cut
505*/
506
507/* XXX DAPM integrate this into pad_add_name ??? */
508
509void
510Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash)
511{
512 dVAR;
513 SV **svp;
514 PADOFFSET top, off;
515
516 ASSERT_CURPAD_ACTIVE("pad_check_dup");
517 if (AvFILLp(PL_comppad_name) < 0 || !ckWARN(WARN_MISC))
518 return; /* nothing to check */
519
520 svp = AvARRAY(PL_comppad_name);
521 top = AvFILLp(PL_comppad_name);
522 /* check the current scope */
523 /* XXX DAPM - why the (I32) cast - shouldn't we ensure they're the same
524 * type ? */
525 for (off = top; (I32)off > PL_comppad_name_floor; off--) {
526 SV * const sv = svp[off];
527 if (sv
528 && sv != &PL_sv_undef
529 && !SvFAKE(sv)
530 && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0)
531 && strEQ(name, SvPVX_const(sv)))
532 {
533 if (is_our && (SvPAD_OUR(sv)))
534 break; /* "our" masking "our" */
535 Perl_warner(aTHX_ packWARN(WARN_MISC),
536 "\"%s\" variable %s masks earlier declaration in same %s",
537 (is_our ? "our" : "my"),
538 name,
539 (SvIVX(sv) == PAD_MAX ? "scope" : "statement"));
540 --off;
541 break;
542 }
543 }
544 /* check the rest of the pad */
545 if (is_our) {
546 do {
547 SV * const sv = svp[off];
548 if (sv
549 && sv != &PL_sv_undef
550 && !SvFAKE(sv)
551 && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0)
552 && OURSTASH(sv) == ourstash
553 && strEQ(name, SvPVX_const(sv)))
554 {
555 Perl_warner(aTHX_ packWARN(WARN_MISC),
556 "\"our\" variable %s redeclared", name);
557 if ((I32)off <= PL_comppad_name_floor)
558 Perl_warner(aTHX_ packWARN(WARN_MISC),
559 "\t(Did you mean \"local\" instead of \"our\"?)\n");
560 break;
561 }
562 } while ( off-- > 0 );
563 }
564}
565
566
567/*
568=for apidoc pad_findmy
569
570Given a lexical name, try to find its offset, first in the current pad,
571or failing that, in the pads of any lexically enclosing subs (including
572the complications introduced by eval). If the name is found in an outer pad,
573then a fake entry is added to the current pad.
574Returns the offset in the current pad, or NOT_IN_PAD on failure.
575
576=cut
577*/
578
579PADOFFSET
580Perl_pad_findmy(pTHX_ const char *name)
581{
582 dVAR;
583 SV *out_sv;
584 int out_flags;
585 I32 offset;
586 const AV *nameav;
587 SV **name_svp;
588
589 offset = pad_findlex(name, PL_compcv, PL_cop_seqmax, 1,
590 NULL, &out_sv, &out_flags);
591 if (offset != NOT_IN_PAD)
592 return offset;
593
594 /* look for an our that's being introduced; this allows
595 * our $foo = 0 unless defined $foo;
596 * to not give a warning. (Yes, this is a hack) */
597
598 nameav = (AV*)AvARRAY(CvPADLIST(PL_compcv))[0];
599 name_svp = AvARRAY(nameav);
600 for (offset = AvFILLp(nameav); offset > 0; offset--) {
601 const SV * const namesv = name_svp[offset];
602 if (namesv && namesv != &PL_sv_undef
603 && !SvFAKE(namesv)
604 && (SvPAD_OUR(namesv))
605 && strEQ(SvPVX_const(namesv), name)
606 && U_32(SvNVX(namesv)) == PAD_MAX /* min */
607 )
608 return offset;
609 }
610 return NOT_IN_PAD;
611}
612
613/*
614 * Returns the offset of a lexical $_, if there is one, at run time.
615 * Used by the UNDERBAR XS macro.
616 */
617
618PADOFFSET
619Perl_find_rundefsvoffset(pTHX)
620{
621 dVAR;
622 SV *out_sv;
623 int out_flags;
624 return pad_findlex("$_", find_runcv(NULL), PL_curcop->cop_seq, 1,
625 NULL, &out_sv, &out_flags);
626}
627
628/*
629=for apidoc pad_findlex
630
631Find a named lexical anywhere in a chain of nested pads. Add fake entries
632in the inner pads if it's found in an outer one.
633
634Returns the offset in the bottom pad of the lex or the fake lex.
635cv is the CV in which to start the search, and seq is the current cop_seq
636to match against. If warn is true, print appropriate warnings. The out_*
637vars return values, and so are pointers to where the returned values
638should be stored. out_capture, if non-null, requests that the innermost
639instance of the lexical is captured; out_name_sv is set to the innermost
640matched namesv or fake namesv; out_flags returns the flags normally
641associated with the IVX field of a fake namesv.
642
643Note that pad_findlex() is recursive; it recurses up the chain of CVs,
644then comes back down, adding fake entries as it goes. It has to be this way
645because fake namesvs in anon protoypes have to store in NVX the index into
646the parent pad.
647
648=cut
649*/
650
651/* Flags set in the SvIVX field of FAKE namesvs */
652
653#define PAD_FAKELEX_ANON 1 /* the lex is declared in an ANON, or ... */
654#define PAD_FAKELEX_MULTI 2 /* the lex can be instantiated multiple times */
655
656/* the CV has finished being compiled. This is not a sufficient test for
657 * all CVs (eg XSUBs), but suffices for the CVs found in a lexical chain */
658#define CvCOMPILED(cv) CvROOT(cv)
659
660/* the CV does late binding of its lexicals */
661#define CvLATE(cv) (CvANON(cv) || SvTYPE(cv) == SVt_PVFM)
662
663
664STATIC PADOFFSET
665S_pad_findlex(pTHX_ const char *name, const CV* cv, U32 seq, int warn,
666 SV** out_capture, SV** out_name_sv, int *out_flags)
667{
668 dVAR;
669 I32 offset, new_offset;
670 SV *new_capture;
671 SV **new_capturep;
672 const AV * const padlist = CvPADLIST(cv);
673
674 *out_flags = 0;
675
676 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
677 "Pad findlex cv=0x%"UVxf" searching \"%s\" seq=%d%s\n",
678 PTR2UV(cv), name, (int)seq, out_capture ? " capturing" : "" ));
679
680 /* first, search this pad */
681
682 if (padlist) { /* not an undef CV */
683 I32 fake_offset = 0;
684 const AV * const nameav = (AV*)AvARRAY(padlist)[0];
685 SV * const * const name_svp = AvARRAY(nameav);
686
687 for (offset = AvFILLp(nameav); offset > 0; offset--) {
688 const SV * const namesv = name_svp[offset];
689 if (namesv && namesv != &PL_sv_undef
690 && strEQ(SvPVX_const(namesv), name))
691 {
692 if (SvFAKE(namesv))
693 fake_offset = offset; /* in case we don't find a real one */
694 else if ( seq > U_32(SvNVX(namesv)) /* min */
695 && seq <= (U32)SvIVX(namesv)) /* max */
696 break;
697 }
698 }
699
700 if (offset > 0 || fake_offset > 0 ) { /* a match! */
701 if (offset > 0) { /* not fake */
702 fake_offset = 0;
703 *out_name_sv = name_svp[offset]; /* return the namesv */
704
705 /* set PAD_FAKELEX_MULTI if this lex can have multiple
706 * instances. For now, we just test !CvUNIQUE(cv), but
707 * ideally, we should detect my's declared within loops
708 * etc - this would allow a wider range of 'not stayed
709 * shared' warnings. We also treated alreadly-compiled
710 * lexes as not multi as viewed from evals. */
711
712 *out_flags = CvANON(cv) ?
713 PAD_FAKELEX_ANON :
714 (!CvUNIQUE(cv) && ! CvCOMPILED(cv))
715 ? PAD_FAKELEX_MULTI : 0;
716
717 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
718 "Pad findlex cv=0x%"UVxf" matched: offset=%ld (%ld,%ld)\n",
719 PTR2UV(cv), (long)offset, (long)U_32(SvNVX(*out_name_sv)),
720 (long)SvIVX(*out_name_sv)));
721 }
722 else { /* fake match */
723 offset = fake_offset;
724 *out_name_sv = name_svp[offset]; /* return the namesv */
725 *out_flags = SvIVX(*out_name_sv);
726 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
727 "Pad findlex cv=0x%"UVxf" matched: offset=%ld flags=0x%lx index=%lu\n",
728 PTR2UV(cv), (long)offset, (unsigned long)*out_flags,
729 (unsigned long)SvNVX(*out_name_sv)
730 ));
731 }
732
733 /* return the lex? */
734
735 if (out_capture) {
736
737 /* our ? */
738 if (SvPAD_OUR(*out_name_sv)) {
739 *out_capture = NULL;
740 return offset;
741 }
742
743 /* trying to capture from an anon prototype? */
744 if (CvCOMPILED(cv)
745 ? CvANON(cv) && CvCLONE(cv) && !CvCLONED(cv)
746 : *out_flags & PAD_FAKELEX_ANON)
747 {
748 if (warn && ckWARN(WARN_CLOSURE))
749 Perl_warner(aTHX_ packWARN(WARN_CLOSURE),
750 "Variable \"%s\" is not available", name);
751 *out_capture = NULL;
752 }
753
754 /* real value */
755 else {
756 int newwarn = warn;
757 if (!CvCOMPILED(cv) && (*out_flags & PAD_FAKELEX_MULTI)
758 && warn && ckWARN(WARN_CLOSURE)) {
759 newwarn = 0;
760 Perl_warner(aTHX_ packWARN(WARN_CLOSURE),
761 "Variable \"%s\" will not stay shared", name);
762 }
763
764 if (fake_offset && CvANON(cv)
765 && CvCLONE(cv) &&!CvCLONED(cv))
766 {
767 SV *n;
768 /* not yet caught - look further up */
769 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
770 "Pad findlex cv=0x%"UVxf" chasing lex in outer pad\n",
771 PTR2UV(cv)));
772 n = *out_name_sv;
773 (void) pad_findlex(name, CvOUTSIDE(cv),
774 CvOUTSIDE_SEQ(cv),
775 newwarn, out_capture, out_name_sv, out_flags);
776 *out_name_sv = n;
777 return offset;
778 }
779
780 *out_capture = AvARRAY((AV*)AvARRAY(padlist)[
781 CvDEPTH(cv) ? CvDEPTH(cv) : 1])[offset];
782 DEBUG_Xv(PerlIO_printf(Perl_debug_log,
783 "Pad findlex cv=0x%"UVxf" found lex=0x%"UVxf"\n",
784 PTR2UV(cv), PTR2UV(*out_capture)));
785
786 if (SvPADSTALE(*out_capture)) {
787 if (ckWARN(WARN_CLOSURE))
788 Perl_warner(aTHX_ packWARN(WARN_CLOSURE),
789 "Variable \"%s\" is not available", name);
790 *out_capture = NULL;
791 }
792 }
793 if (!*out_capture) {
794 if (*name == '@')
795 *out_capture = sv_2mortal((SV*)newAV());
796 else if (*name == '%')
797 *out_capture = sv_2mortal((SV*)newHV());
798 else
799 *out_capture = sv_newmortal();
800 }
801 }
802
803 return offset;
804 }
805 }
806
807 /* it's not in this pad - try above */
808
809 if (!CvOUTSIDE(cv))
810 return NOT_IN_PAD;
811
812 /* out_capture non-null means caller wants us to capture lex; in
813 * addition we capture ourselves unless it's an ANON/format */
814 new_capturep = out_capture ? out_capture :
815 CvLATE(cv) ? NULL : &new_capture;
816
817 offset = pad_findlex(name, CvOUTSIDE(cv), CvOUTSIDE_SEQ(cv), 1,
818 new_capturep, out_name_sv, out_flags);
819 if (offset == NOT_IN_PAD)
820 return NOT_IN_PAD;
821
822 /* found in an outer CV. Add appropriate fake entry to this pad */
823
824 /* don't add new fake entries (via eval) to CVs that we have already
825 * finished compiling, or to undef CVs */
826 if (CvCOMPILED(cv) || !padlist)
827 return 0; /* this dummy (and invalid) value isnt used by the caller */
828
829 {
830 SV *new_namesv;
831 AV * const ocomppad_name = PL_comppad_name;
832 PAD * const ocomppad = PL_comppad;
833 PL_comppad_name = (AV*)AvARRAY(padlist)[0];
834 PL_comppad = (AV*)AvARRAY(padlist)[1];
835 PL_curpad = AvARRAY(PL_comppad);
836
837 new_offset = pad_add_name(
838 SvPVX_const(*out_name_sv),
839 SvPAD_TYPED(*out_name_sv)
840 ? SvSTASH(*out_name_sv) : NULL,
841 OURSTASH(*out_name_sv),
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 (SvPAD_OUR(new_namesv)) {
850 /*EMPTY*/; /* 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;
870 }
871 return new_offset;
872}
873
874
875#ifdef DEBUGGING
876/*
877=for apidoc pad_sv
878
879Get the value at offset po in the current pad.
880Use macro PAD_SV instead of calling this function directly.
881
882=cut
883*/
884
885
886SV *
887Perl_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
905Set the entry at offset po in the current pad to sv.
906Use the macro PAD_SETSV() rather than calling this function directly.
907
908=cut
909*/
910
911void
912Perl_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
930Update 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
941void
942Perl_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
970U32
971Perl_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
1006Cleanup at end of scope during compilation: set the max seq number for
1007lexicals in this scope and warn of any lexicals that never got introduced.
1008
1009=cut
1010*/
1011
1012void
1013Perl_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
1052Abandon the tmp in the current pad at offset po and replace with a
1053new one.
1054
1055=cut
1056*/
1057
1058void
1059Perl_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(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
1096Mark 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 */
1107void
1108Perl_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
1138Tidy 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
1151void
1152Perl_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), NULL);
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]) != NULL &&
1199 namesv != &PL_sv_undef &&
1200 *SvPVX_const(namesv) == '&'))
1201 {
1202 SvREFCNT_dec(PL_curpad[ix]);
1203 PL_curpad[ix] = NULL;
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
1240Free the SV at offset po in the current pad.
1241
1242=cut
1243*/
1244
1245/* XXX DAPM integrate with pad_swipe ???? */
1246void
1247Perl_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
1286Dump the contents of a padlist
1287
1288=cut
1289*/
1290
1291void
1292Perl_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 = NULL;
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
1357dump the contents of a CV
1358
1359=cut
1360*/
1361
1362#ifdef DEBUGGING
1363STATIC void
1364S_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
1399Clone a CV: make a new CV which points to the same code etc, but which
1400has a newly-created pad built by copying the prototype pad and capturing
1401any outer lexicals.
1402
1403=cut
1404*/
1405
1406CV *
1407Perl_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(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) = CvISXSUB(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] : NULL;
1476 SV *sv = NULL;
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 = NULL;
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);
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);
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), NULL, 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
1548For any anon CVs in the pad, change CvOUTSIDE of that CV from
1549old_cv to new_cv if necessary. Needed when a newly-compiled CV has to be
1550moved to a pre-existing CV struct.
1551
1552=cut
1553*/
1554
1555void
1556Perl_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 PERL_UNUSED_ARG(old_cv);
1565
1566 for (ix = AvFILLp(comppad_name); ix > 0; ix--) {
1567 const SV * const namesv = namepad[ix];
1568 if (namesv && namesv != &PL_sv_undef
1569 && *SvPVX_const(namesv) == '&')
1570 {
1571 CV * const innercv = (CV*)curpad[ix];
1572 assert(CvWEAKOUTSIDE(innercv));
1573 assert(CvOUTSIDE(innercv) == old_cv);
1574 CvOUTSIDE(innercv) = new_cv;
1575 }
1576 }
1577}
1578
1579
1580/*
1581=for apidoc pad_push
1582
1583Push a new pad frame onto the padlist, unless there's already a pad at
1584this depth, in which case don't bother creating a new one. Then give
1585the new pad an @_ in slot zero.
1586
1587=cut
1588*/
1589
1590void
1591Perl_pad_push(pTHX_ PADLIST *padlist, int depth)
1592{
1593 dVAR;
1594 if (depth <= AvFILLp(padlist))
1595 return;
1596
1597 {
1598 SV** const svp = AvARRAY(padlist);
1599 AV* const newpad = newAV();
1600 SV** const oldpad = AvARRAY(svp[depth-1]);
1601 I32 ix = AvFILLp((AV*)svp[1]);
1602 const I32 names_fill = AvFILLp((AV*)svp[0]);
1603 SV** const names = AvARRAY(svp[0]);
1604 AV *av;
1605
1606 for ( ;ix > 0; ix--) {
1607 if (names_fill >= ix && names[ix] != &PL_sv_undef) {
1608 const char sigil = SvPVX_const(names[ix])[0];
1609 if ((SvFLAGS(names[ix]) & SVf_FAKE) || sigil == '&') {
1610 /* outer lexical or anon code */
1611 av_store(newpad, ix, SvREFCNT_inc(oldpad[ix]));
1612 }
1613 else { /* our own lexical */
1614 SV *sv;
1615 if (sigil == '@')
1616 sv = (SV*)newAV();
1617 else if (sigil == '%')
1618 sv = (SV*)newHV();
1619 else
1620 sv = newSV(0);
1621 av_store(newpad, ix, sv);
1622 SvPADMY_on(sv);
1623 }
1624 }
1625 else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
1626 av_store(newpad, ix, SvREFCNT_inc(oldpad[ix]));
1627 }
1628 else {
1629 /* save temporaries on recursion? */
1630 SV * const sv = newSV(0);
1631 av_store(newpad, ix, sv);
1632 SvPADTMP_on(sv);
1633 }
1634 }
1635 av = newAV();
1636 av_extend(av, 0);
1637 av_store(newpad, 0, (SV*)av);
1638 AvREIFY_only(av);
1639
1640 av_store(padlist, depth, (SV*)newpad);
1641 AvFILLp(padlist) = depth;
1642 }
1643}
1644
1645
1646HV *
1647Perl_pad_compname_type(pTHX_ const PADOFFSET po)
1648{
1649 dVAR;
1650 SV* const * const av = av_fetch(PL_comppad_name, po, FALSE);
1651 if ( SvPAD_TYPED(*av) ) {
1652 return SvSTASH(*av);
1653 }
1654 return NULL;
1655}
1656
1657/*
1658 * Local variables:
1659 * c-indentation-style: bsd
1660 * c-basic-offset: 4
1661 * indent-tabs-mode: t
1662 * End:
1663 *
1664 * ex: set ts=8 sts=4 sw=4 noet:
1665 */