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