From c4528262e132e4ac14d212c3f48061c1abaff502 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Tue, 16 Nov 2010 16:05:58 +0000 Subject: [PATCH] Move Perl_cv_undef() from op.c to pad.c This will allow the non-API function Perl_pad_undef to be inlined into it. --- op.c | 68 ------------------------------------------------------------------- pad.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 68 deletions(-) diff --git a/op.c b/op.c index 65f940c..98adf8c 100644 --- a/op.c +++ b/op.c @@ -5887,74 +5887,6 @@ Perl_newWHENOP(pTHX_ OP *cond, OP *block) OP_ENTERWHEN, OP_LEAVEWHEN, 0); } -/* -=head1 Embedding Functions - -=for apidoc cv_undef - -Clear out all the active components of a CV. This can happen either -by an explicit C, or by the reference count going to zero. -In the former case, we keep the CvOUTSIDE pointer, so that any anonymous -children can still follow the full lexical scope chain. - -=cut -*/ - -void -Perl_cv_undef(pTHX_ CV *cv) -{ - dVAR; - - PERL_ARGS_ASSERT_CV_UNDEF; - - DEBUG_X(PerlIO_printf(Perl_debug_log, - "CV undef: cv=0x%"UVxf" comppad=0x%"UVxf"\n", - PTR2UV(cv), PTR2UV(PL_comppad)) - ); - -#ifdef USE_ITHREADS - if (CvFILE(cv) && !CvISXSUB(cv)) { - /* for XSUBs CvFILE point directly to static memory; __FILE__ */ - Safefree(CvFILE(cv)); - } - CvFILE(cv) = NULL; -#endif - - if (!CvISXSUB(cv) && CvROOT(cv)) { - if (SvTYPE(cv) == SVt_PVCV && CvDEPTH(cv)) - Perl_croak(aTHX_ "Can't undef active subroutine"); - ENTER; - - PAD_SAVE_SETNULLPAD(); - - op_free(CvROOT(cv)); - CvROOT(cv) = NULL; - CvSTART(cv) = NULL; - LEAVE; - } - SvPOK_off(MUTABLE_SV(cv)); /* forget prototype */ - CvGV_set(cv, NULL); - - pad_undef(cv); - - /* remove CvOUTSIDE unless this is an undef rather than a free */ - if (!SvREFCNT(cv) && CvOUTSIDE(cv)) { - if (!CvWEAKOUTSIDE(cv)) - SvREFCNT_dec(CvOUTSIDE(cv)); - CvOUTSIDE(cv) = NULL; - } - if (CvCONST(cv)) { - SvREFCNT_dec(MUTABLE_SV(CvXSUBANY(cv).any_ptr)); - CvCONST_off(cv); - } - if (CvISXSUB(cv) && CvXSUB(cv)) { - CvXSUB(cv) = NULL; - } - /* delete all flags except WEAKOUTSIDE and CVGV_RC, which indicate the - * ref status of CvOUTSIDE and CvGV */ - CvFLAGS(cv) &= (CVf_WEAKOUTSIDE|CVf_CVGV_RC); -} - void Perl_cv_ckproto_len(pTHX_ const CV *cv, const GV *gv, const char *p, const STRLEN len) diff --git a/pad.c b/pad.c index 52d2db6..323efc6 100644 --- a/pad.c +++ b/pad.c @@ -347,7 +347,73 @@ Perl_pad_undef(pTHX_ CV* cv) } +/* +=head1 Embedding Functions + +=for apidoc cv_undef + +Clear out all the active components of a CV. This can happen either +by an explicit C, or by the reference count going to zero. +In the former case, we keep the CvOUTSIDE pointer, so that any anonymous +children can still follow the full lexical scope chain. + +=cut +*/ + +void +Perl_cv_undef(pTHX_ CV *cv) +{ + dVAR; + + PERL_ARGS_ASSERT_CV_UNDEF; + + DEBUG_X(PerlIO_printf(Perl_debug_log, + "CV undef: cv=0x%"UVxf" comppad=0x%"UVxf"\n", + PTR2UV(cv), PTR2UV(PL_comppad)) + ); +#ifdef USE_ITHREADS + if (CvFILE(cv) && !CvISXSUB(cv)) { + /* for XSUBs CvFILE point directly to static memory; __FILE__ */ + Safefree(CvFILE(cv)); + } + CvFILE(cv) = NULL; +#endif + + if (!CvISXSUB(cv) && CvROOT(cv)) { + if (SvTYPE(cv) == SVt_PVCV && CvDEPTH(cv)) + Perl_croak(aTHX_ "Can't undef active subroutine"); + ENTER; + + PAD_SAVE_SETNULLPAD(); + + op_free(CvROOT(cv)); + CvROOT(cv) = NULL; + CvSTART(cv) = NULL; + LEAVE; + } + SvPOK_off(MUTABLE_SV(cv)); /* forget prototype */ + CvGV_set(cv, NULL); + + pad_undef(cv); + + /* remove CvOUTSIDE unless this is an undef rather than a free */ + if (!SvREFCNT(cv) && CvOUTSIDE(cv)) { + if (!CvWEAKOUTSIDE(cv)) + SvREFCNT_dec(CvOUTSIDE(cv)); + CvOUTSIDE(cv) = NULL; + } + if (CvCONST(cv)) { + SvREFCNT_dec(MUTABLE_SV(CvXSUBANY(cv).any_ptr)); + CvCONST_off(cv); + } + if (CvISXSUB(cv) && CvXSUB(cv)) { + CvXSUB(cv) = NULL; + } + /* delete all flags except WEAKOUTSIDE and CVGV_RC, which indicate the + * ref status of CvOUTSIDE and CvGV */ + CvFLAGS(cv) &= (CVf_WEAKOUTSIDE|CVf_CVGV_RC); +} static PADOFFSET S_pad_add_name_sv(pTHX_ SV *namesv, const U32 flags, HV *typestash, -- 2.7.4