1/* vi: set ft=c inde=: */
2
3#ifndef pad_leavemy
4
5#define pad_leavemy() S_pad_leavemy(aTHX)
6
7static OP *S_pad_leavemy(pTHX) {
8    dVAR;
9    I32 off;
10    OP *o = NULL;
11    SV * const * const svp = AvARRAY(PL_comppad_name);
12
13    PL_pad_reset_pending = FALSE;
14
15    ASSERT_CURPAD_ACTIVE("pad_leavemy");
16    if (PL_min_intro_pending && PL_comppad_name_fill < PL_min_intro_pending) {
17        for (off = PL_max_intro_pending; off >= PL_min_intro_pending; off--) {
18            const SV * const sv = svp[off];
19            if (sv && IF_HAVE_PERL_5_19_3(PadnameLEN(sv), sv != &PL_sv_undef) && !SvFAKE(sv))
20                Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
21                                 "%"SVf" never introduced",
22                                 SVfARG(sv));
23        }
24    }
25    /* "Deintroduce" my variables that are leaving with this scope. */
26    for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_fill; off--) {
27        SV * const sv = svp[off];
28        if (sv && IF_HAVE_PERL_5_19_3(PadnameLEN(sv), sv != &PL_sv_undef) && !SvFAKE(sv)
29            && COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO)
30        {
31            COP_SEQ_RANGE_HIGH_set(sv, PL_cop_seqmax);
32            DEBUG_Xv(PerlIO_printf(Perl_debug_log,
33                                   "Pad leavemy: %ld \"%s\", (%lu,%lu)\n",
34                                   (long)off, SvPVX_const(sv),
35                                   (unsigned long)COP_SEQ_RANGE_LOW(sv),
36                                   (unsigned long)COP_SEQ_RANGE_HIGH(sv))
37            );
38#if HAVE_PERL_VERSION(5, 17, 4)
39            if (!PadnameIsSTATE(sv) && !PadnameIsOUR(sv)
40                 && *PadnamePV(sv) == '&' && PadnameLEN(sv) > 1) {
41                OP *kid = newOP(OP_INTROCV, 0);
42                kid->op_targ = off;
43                o = op_prepend_elem(OP_LINESEQ, kid, o);
44            }
45#endif
46        }
47    }
48    PL_cop_seqmax++;
49    if (PL_cop_seqmax == PERL_PADSEQ_INTRO) /* not a legal value */
50        PL_cop_seqmax++;
51    DEBUG_Xv(PerlIO_printf(Perl_debug_log,
52                           "Pad leavemy: seq = %ld\n", (long)PL_cop_seqmax));
53    return o;
54}
55
56#endif
57