X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=op.c;h=a6a5422f3bb3436e783685f88cabf3b360a335a6;hb=abbb319842d03cfdb615b06ae57e058d7e36b88c;hp=518b525d1b228e609856b559899692d5229e50af;hpb=3cc8d5892ed2db9918b7fc38862edb74459a28d0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/op.c b/op.c index 518b525..a6a5422 100644 --- a/op.c +++ b/op.c @@ -335,7 +335,9 @@ Perl_op_clear(pTHX_ OP *o) /* FIXME for MAD - if I uncomment these two lines t/op/pack.t fails with "modification of a read only value" for a reason I can't fathom why. It's the "" stringification of $_, where $_ was set to '' in a foreach - loop, but it defies simplification into a small test case. */ + loop, but it defies simplification into a small test case. + However, commenting them out has caused ext/List/Util/t/weak.t to fail + the last test. */ /* mad_free(o->op_madprop); o->op_madprop = 0; @@ -6363,13 +6365,15 @@ Perl_ck_fun(pTHX_ OP *o) listkids(o); } else if (PL_opargs[type] & OA_DEFGV) { - OP *newop = newUNOP(type, 0, newDEFSVOP()); #ifdef PERL_MAD + OP *newop = newUNOP(type, 0, newDEFSVOP()); op_getmad(o,newop,'O'); + return newop; #else + /* Ordering of these two is important to keep f_map.t passing. */ op_free(o); + return newUNOP(type, 0, newDEFSVOP()); #endif - return newop; } if (oa) { @@ -6440,13 +6444,13 @@ OP * Perl_ck_grep(pTHX_ OP *o) { dVAR; - LOGOP *gwop; + LOGOP *gwop = NULL; OP *kid; const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE; I32 offset; o->op_ppaddr = PL_ppaddr[OP_GREPSTART]; - NewOp(1101, gwop, 1, LOGOP); + /* don't allocate gwop here, as we may leak it if PL_error_count > 0 */ if (o->op_flags & OPf_STACKED) { OP* k; @@ -6457,6 +6461,7 @@ Perl_ck_grep(pTHX_ OP *o) for (k = cUNOPx(kid)->op_first; k; k = k->op_next) { kid = k; } + NewOp(1101, gwop, 1, LOGOP); kid->op_next = (OP*)gwop; o->op_flags &= ~OPf_STACKED; } @@ -6473,6 +6478,8 @@ Perl_ck_grep(pTHX_ OP *o) Perl_croak(aTHX_ "panic: ck_grep"); kid = kUNOP->op_first; + if (!gwop) + NewOp(1101, gwop, 1, LOGOP); gwop->op_type = type; gwop->op_ppaddr = PL_ppaddr[type]; gwop->op_first = listkids(o); @@ -6832,18 +6839,18 @@ Perl_ck_require(pTHX_ OP *o) if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) { OP * const kid = cUNOPo->op_first; - OP * newop - = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED, - append_elem(OP_LIST, kid, - scalar(newUNOP(OP_RV2CV, 0, - newGVOP(OP_GV, 0, - gv)))))); + OP * newop; + cUNOPo->op_first = 0; -#ifdef PERL_MAD - op_getmad(o,newop,'O'); -#else +#ifndef PERL_MAD op_free(o); #endif + newop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED, + append_elem(OP_LIST, kid, + scalar(newUNOP(OP_RV2CV, 0, + newGVOP(OP_GV, 0, + gv)))))); + op_getmad(o,newop,'O'); return newop; }