From: Gurusamy Sarathy Date: Sun, 4 Mar 2001 22:33:15 +0000 (-0800) Subject: Re: [ID 20010301.005] corrupt memory (since @8531, in 5.6.1-T2) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ddffee5993cd7260a47b848bbf8a343ef79b4f53;p=p5sagit%2Fp5-mst-13.2.git Re: [ID 20010301.005] corrupt memory (since @8531, in 5.6.1-T2) Message-Id: <200103050633.f256XFo06998@smtp3.ActiveState.com> PMOPs need to remember their own stash so that they can gracefully remove themselves from their linked list. p4raw-id: //depot/perl@9033 --- diff --git a/op.c b/op.c index 4c5dd13..13fe21b 100644 --- a/op.c +++ b/op.c @@ -843,6 +843,29 @@ S_op_clear(pTHX_ OP *o) case OP_MATCH: case OP_QR: clear_pmop: + { + HV *pmstash = PmopSTASH(cPMOPo); + if (pmstash) { + PMOP *pmop = HvPMROOT(pmstash); + PMOP *lastpmop = NULL; + while (pmop) { + if (cPMOPo == pmop) { + if (lastpmop) + lastpmop->op_pmnext = pmop->op_pmnext; + else + HvPMROOT(pmstash) = pmop->op_pmnext; + break; + } + lastpmop = pmop; + pmop = pmop->op_pmnext; + } +#ifdef USE_ITHREADS + Safefree(PmopSTASHPV(cPMOPo)); +#else + /* NOTE: PMOP.op_pmstash is not refcounted */ +#endif + } + } cPMOPo->op_pmreplroot = Nullop; ReREFCNT_dec(cPMOPo->op_pmregexp); cPMOPo->op_pmregexp = (REGEXP*)NULL; @@ -2934,6 +2957,7 @@ Perl_newPMOP(pTHX_ I32 type, I32 flags) if (type != OP_TRANS && PL_curstash) { pmop->op_pmnext = HvPMROOT(PL_curstash); HvPMROOT(PL_curstash) = pmop; + PmopSTASH_set(pmop,PL_curstash); } return (OP*)pmop;