source: trunk/third/perl/pad.c @ 20075

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