From: Adrian M. Enache Date: Tue, 11 Nov 2003 15:25:29 +0000 (+0200) Subject: Re: Empty subroutine as object method segfaults in 5.8.2 (sometimes) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=09c2fd240e8f8c1831b17c7a56caa83d177fe688;p=p5sagit%2Fp5-mst-13.2.git Re: Empty subroutine as object method segfaults in 5.8.2 (sometimes) Message-ID: <20031111132529.GB1271@ratsnest.hole> p4raw-id: //depot/perl@21718 --- diff --git a/op.c b/op.c index 04df4de..59df02c 100644 --- a/op.c +++ b/op.c @@ -4213,6 +4213,11 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) mod(scalarseq(block), OP_LEAVESUBLV)); } else { + /* This makes sub {}; work as expected. */ + if (block->op_type == OP_STUB) { + op_free(block); + block = newSTATEOP(0, Nullch, 0); + } CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block)); } CvROOT(cv)->op_private |= OPpREFCOUNTED; @@ -6277,21 +6282,6 @@ Perl_peep(pTHX_ register OP *o) o->op_seq = PL_op_seqmax++; break; case OP_STUB: - /* XXX This makes sub {}; work as expected. - ie {return;} not {return @_;} - When optimiser is properly split into fixups and - optimisations, this needs to stay in the fixups. */ - if(!oldop && - o->op_next && - o->op_next->op_type == OP_LEAVESUB) { - OP* newop = newSTATEOP(0, Nullch, 0); - newop->op_next = o->op_next; - o->op_next = 0; - op_free(o); - o = newop; - ((UNOP*)o->op_next)->op_first = newop; - CvSTART(PL_compcv) = newop; - } if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) { o->op_seq = PL_op_seqmax++; break; /* Scalar stub must produce undef. List stub is noop */