Re: Empty subroutine as object method segfaults in 5.8.2 (sometimes)
authorAdrian M. Enache <enache@rdslink.ro>
Tue, 11 Nov 2003 15:25:29 +0000 (17:25 +0200)
committerNicholas Clark <nick@ccl4.org>
Thu, 13 Nov 2003 20:46:36 +0000 (20:46 +0000)
Message-ID: <20031111132529.GB1271@ratsnest.hole>

p4raw-id: //depot/perl@21718

op.c

diff --git a/op.c b/op.c
index 04df4de..59df02c 100644 (file)
--- 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 */