diff options
Diffstat (limited to 'gnu/usr.bin/perl/op.c')
-rw-r--r-- | gnu/usr.bin/perl/op.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/gnu/usr.bin/perl/op.c b/gnu/usr.bin/perl/op.c index 2c4ae5cce08..25e7f8961d7 100644 --- a/gnu/usr.bin/perl/op.c +++ b/gnu/usr.bin/perl/op.c @@ -1877,6 +1877,7 @@ Perl_newPROG(pTHX_ OP *o) if (o->op_type == OP_STUB) { PL_comppad_name = 0; PL_compcv = 0; + FreeOp(o); return; } PL_main_root = scope(sawparens(scalarvoid(o))); @@ -4299,6 +4300,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; @@ -4797,7 +4803,8 @@ OP * Perl_ck_concat(pTHX_ OP *o) { OP *kid = cUNOPo->op_first; - if (kid->op_type == OP_CONCAT && !(kUNOP->op_first->op_flags & OPf_MOD)) + if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) && + !(kUNOP->op_first->op_flags & OPf_MOD)) o->op_flags |= OPf_STACKED; return o; } @@ -5329,8 +5336,7 @@ Perl_ck_fun(pTHX_ OP *o) } if (tmpstr) { - name = savepv(SvPVX(tmpstr)); - len = strlen(name); + name = SvPV(tmpstr, len); sv_2mortal(tmpstr); } } @@ -6369,17 +6375,6 @@ Perl_peep(pTHX_ register OP *o) o->op_seq = PL_op_seqmax++; break; case OP_STUB: - 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 */ |