X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=91c487b1f8c2540d1174c1772adff260a6191bb1;hb=153930f0ce4008b90e45fd4ba72fea446b8eede9;hp=662f24628f41392e39d2b45e97a45d61ae153983;hpb=13aba0e6afaf51b4b0de5792ac07eb8e735f9747;p=perl%2Fmodules%2FScope-Upper.git diff --git a/Upper.xs b/Upper.xs index 662f246..91c487b 100644 --- a/Upper.xs +++ b/Upper.xs @@ -1537,8 +1537,10 @@ STATIC void su_uplevel_restore(pTHX_ void *sus_) { * depth to be 0, or perl would complain about it being "still in use". * But we *know* that it cannot be so. */ if (sud->renamed) { - CvDEPTH(sud->renamed) = 0; - CvPADLIST(sud->renamed) = NULL; + if (!CvISXSUB(sud->renamed)) { + CvDEPTH(sud->renamed) = 0; + CvPADLIST(sud->renamed) = NULL; + } SvREFCNT_dec(sud->renamed); } @@ -1692,13 +1694,13 @@ STATIC CV *su_cv_clone(pTHX_ CV *proto, GV *gv) { CvROOT(cv) = OpREFCNT_inc(CvROOT(proto)); OP_REFCNT_UNLOCK; CvSTART(cv) = CvSTART(proto); + CvPADLIST(cv) = CvPADLIST(proto); } CvOUTSIDE(cv) = CvOUTSIDE(proto); #ifdef CVf_WEAKOUTSIDE if (!(CvFLAGS(proto) & CVf_WEAKOUTSIDE)) #endif SvREFCNT_inc_simple_void(CvOUTSIDE(cv)); - CvPADLIST(cv) = CvPADLIST(proto); #ifdef CvOUTSIDE_SEQ CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto); #endif @@ -1953,6 +1955,8 @@ STATIC void su_uid_bump(pTHX_ void *ud_) { su_ud_reap *ud = ud_; SAVEDESTRUCTOR_X(su_uid_drop, ud->cb); + + SU_UD_FREE(ud); } STATIC SV *su_uid_get(pTHX_ I32 cxix) {