From: Gurusamy Sarathy Date: Thu, 7 Oct 1999 22:57:52 +0000 (+0000) Subject: change#3728 was flawed (loop contexts saw the wrong statement X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=38a230cb455fb1aca316039ba1d4aed58c0c60d5;p=p5sagit%2Fp5-mst-13.2.git change#3728 was flawed (loop contexts saw the wrong statement info, causing loop control constructs to not find the label); disable OP_SETSTATE entirely and add a fix that is specifically targetted at disabling the OP_LINESEQ optimization in else BLOCK, which was what the original patch was supposed to fix TODO: remove the remainder of the setstate logic if it can't be used anywhere else (it isn't used anywhere now) p4raw-link: @3728 on //depot/perl: 7399586d384137f7ae66bcc82a83b0df7dd429e5 p4raw-id: //depot/perl@4309 --- diff --git a/cop.h b/cop.h index 829bbe8..1fdd6d1 100644 --- a/cop.h +++ b/cop.h @@ -129,8 +129,8 @@ struct block_loop { }; #define PUSHLOOP(cx, ivar, s) \ - cx->blk_loop.label = PL_curcop->cop_label; \ - cx->blk_loop.resetsp = s - PL_stack_base; \ + cx->blk_loop.label = PL_curcop->cop_label; \ + cx->blk_loop.resetsp = s - PL_stack_base; \ cx->blk_loop.redo_op = cLOOP->op_redoop; \ cx->blk_loop.next_op = cLOOP->op_nextop; \ cx->blk_loop.last_op = cLOOP->op_lastop; \ diff --git a/op.c b/op.c index a51ecb0..acde883 100644 --- a/op.c +++ b/op.c @@ -1860,11 +1860,7 @@ Perl_scope(pTHX_ OP *o) OP *kid; o->op_type = OP_SCOPE; o->op_ppaddr = PL_ppaddr[OP_SCOPE]; - kid = ((LISTOP*)o)->op_first; - if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE){ - kid->op_type = OP_SETSTATE; - kid->op_ppaddr = PL_ppaddr[OP_SETSTATE]; - } + null(((LISTOP*)o)->op_first); } else o = newLISTOP(OP_SCOPE, 0, o, Nullop); diff --git a/perly.c b/perly.c index e1458d8..9b619c9 100644 --- a/perly.c +++ b/perly.c @@ -1662,7 +1662,7 @@ case 21: break; case 22: #line 203 "perly.y" -{ yyval.opval = scope(yyvsp[0].opval); } +{ (yyvsp[0].opval)->op_flags |= OPf_PARENS; yyval.opval = scope(yyvsp[0].opval); } break; case 23: #line 205 "perly.y" diff --git a/perly.y b/perly.y index ddc0efc..c8163e1 100644 --- a/perly.y +++ b/perly.y @@ -200,7 +200,7 @@ sideff : error else : /* NULL */ { $$ = Nullop; } | ELSE mblock - { $$ = scope($2); } + { ($2)->op_flags |= OPf_PARENS; $$ = scope($2); } | ELSIF '(' mexpr ')' mblock else { PL_copline = $1; $$ = newCONDOP(0, $3, scope($5), $6);