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