change#3728 was flawed (loop contexts saw the wrong statement
Gurusamy Sarathy [Thu, 7 Oct 1999 22:57:52 +0000 (22:57 +0000)]
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

cop.h
op.c
perly.c
perly.y

diff --git a/cop.h b/cop.h
index 829bbe8..1fdd6d1 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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 (file)
--- 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);