[patch perlguts.pod] save_item doesn't handle magic
[p5sagit/p5-mst-13.2.git] / op.c
diff --git a/op.c b/op.c
index 62d9b03..871a0f6 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1769,9 +1769,6 @@ int
 Perl_block_start(pTHX_ int full)
 {
     int retval = PL_savestack_ix;
-    /* If there were syntax errors, don't try to start a block */
-    if (PL_yynerrs) return retval;
-
     pad_block_start(full);
     SAVEHINTS();
     PL_hints &= ~HINT_BLOCK_SCOPE;
@@ -1793,8 +1790,6 @@ Perl_block_end(pTHX_ I32 floor, OP *seq)
 {
     int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
     OP* retval = scalarseq(seq);
-    /* If there were syntax errors, don't try to close a block */
-    if (PL_yynerrs) return retval;
     LEAVE_SCOPE(floor);
     PL_compiling.op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
     if (needblockscope)
@@ -3721,7 +3716,14 @@ Perl_newFOROP(pTHX_ I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *blo
            Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
     }
     else {
-       sv = newGVOP(OP_GV, 0, PL_defgv);
+       I32 offset = pad_findmy("$_");
+       if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS(offset) & SVpad_OUR) {
+           sv = newGVOP(OP_GV, 0, PL_defgv);
+       }
+       else {
+           padoff = offset;
+           iterpflags = OPpLVAL_INTRO; /* my $_; for () */
+       }
     }
     if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
        expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
@@ -5051,6 +5053,9 @@ Perl_ck_ftst(pTHX_ OP *o)
              OP_IS_FILETEST_ACCESS(o))
            o->op_private |= OPpFT_ACCESS;
        }
+       if (PL_check[kid->op_type] == MEMBER_TO_FPTR(Perl_ck_ftst)
+               && kid->op_type != OP_STAT && kid->op_type != OP_LSTAT)
+           o->op_private |= OPpFT_STACKED;
     }
     else {
        op_free(o);