e1baeee
--- perl-5.10.0/op.c  2007-12-18 05:47:07.000000000 -0500
e1baeee
+++ perl-5.10.0/op.c  2007-12-31 11:15:57.000000000 -0500
e1baeee
@@ -3992,6 +3992,7 @@
e1baeee
 	static const char no_list_state[] = "Initialization of state variables"
e1baeee
 	    " in list context currently forbidden";
e1baeee
 	OP *curop;
e1baeee
+	bool maybe_common_vars = TRUE;
e1baeee
 
e1baeee
 	PL_modcount = 0;
e1baeee
 	/* Grandfathering $[ assignment here.  Bletch.*/
e1baeee
@@ -4009,6 +4010,65 @@
e1baeee
 	o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
e1baeee
 	o->op_private = (U8)(0 | (flags >> 8));
e1baeee
 
e1baeee
+	if ((left->op_type == OP_LIST
e1baeee
+	     || (left->op_type == OP_NULL && left->op_targ == OP_LIST)))
e1baeee
+	{
e1baeee
+	    OP* lop = ((LISTOP*)left)->op_first;
e1baeee
+	    maybe_common_vars = FALSE;
e1baeee
+	    while (lop) {
e1baeee
+		if (lop->op_type == OP_PADSV ||
e1baeee
+		    lop->op_type == OP_PADAV ||
e1baeee
+		    lop->op_type == OP_PADHV ||
e1baeee
+		    lop->op_type == OP_PADANY) {
e1baeee
+		    if (!(lop->op_private & OPpLVAL_INTRO))
e1baeee
+			maybe_common_vars = TRUE;
e1baeee
+
e1baeee
+		    if (lop->op_private & OPpPAD_STATE) {
e1baeee
+			if (left->op_private & OPpLVAL_INTRO) {
e1baeee
+			    /* Each variable in state($a, $b, $c) = ... */
e1baeee
+			}
e1baeee
+			else {
e1baeee
+			    /* Each state variable in
e1baeee
+			       (state $a, my $b, our $c, $d, undef) = ... */
e1baeee
+			}
e1baeee
+			yyerror(no_list_state);
e1baeee
+		    } else {
e1baeee
+			/* Each my variable in
e1baeee
+			   (state $a, my $b, our $c, $d, undef) = ... */
e1baeee
+		    }
e1baeee
+		} else if (lop->op_type == OP_UNDEF ||
e1baeee
+			   lop->op_type == OP_PUSHMARK) {
e1baeee
+		    /* undef may be interesting in
e1baeee
+		       (state $a, undef, state $c) */
e1baeee
+		} else {
e1baeee
+		    /* Other ops in the list. */
e1baeee
+		    maybe_common_vars = TRUE;
e1baeee
+		}
e1baeee
+		lop = lop->op_sibling;
e1baeee
+	    }
e1baeee
+	}
e1baeee
+	else if ((left->op_private & OPpLVAL_INTRO)
e1baeee
+		&& (   left->op_type == OP_PADSV
e1baeee
+		    || left->op_type == OP_PADAV
e1baeee
+		    || left->op_type == OP_PADHV
e1baeee
+		    || left->op_type == OP_PADANY))
e1baeee
+	{
e1baeee
+	    maybe_common_vars = FALSE;
e1baeee
+	    if (left->op_private & OPpPAD_STATE) {
e1baeee
+		/* All single variable list context state assignments, hence
e1baeee
+		   state ($a) = ...
e1baeee
+		   (state $a) = ...
e1baeee
+		   state @a = ...
e1baeee
+		   state (@a) = ...
e1baeee
+		   (state @a) = ...
e1baeee
+		   state %a = ...
e1baeee
+		   state (%a) = ...
e1baeee
+		   (state %a) = ...
e1baeee
+		*/
e1baeee
+		yyerror(no_list_state);
e1baeee
+	    }
e1baeee
+	}
e1baeee
+
e1baeee
 	/* PL_generation sorcery:
e1baeee
 	 * an assignment like ($a,$b) = ($c,$d) is easier than
e1baeee
 	 * ($a,$b) = ($c,$a), since there is no need for temporary vars.
e1baeee
@@ -4023,7 +4083,7 @@
e1baeee
 	 * to store these values, evil chicanery is done with SvUVX().
e1baeee
 	 */
e1baeee
 
e1baeee
-	{
e1baeee
+	if (maybe_common_vars) {
e1baeee
 	    OP *lastop = o;
e1baeee
 	    PL_generation++;
e1baeee
 	    for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
e1baeee
@@ -4084,54 +4144,6 @@
e1baeee
 		o->op_private |= OPpASSIGN_COMMON;
e1baeee
 	}
e1baeee
 
e1baeee
-	if ((left->op_type == OP_LIST
e1baeee
-	     || (left->op_type == OP_NULL && left->op_targ == OP_LIST))) {
e1baeee
-	    OP* lop = ((LISTOP*)left)->op_first;
e1baeee
-	    while (lop) {
e1baeee
-		if (lop->op_type == OP_PADSV ||
e1baeee
-		    lop->op_type == OP_PADAV ||
e1baeee
-		    lop->op_type == OP_PADHV ||
e1baeee
-		    lop->op_type == OP_PADANY) {
e1baeee
-		    if (lop->op_private & OPpPAD_STATE) {
e1baeee
-			if (left->op_private & OPpLVAL_INTRO) {
e1baeee
-			    /* Each variable in state($a, $b, $c) = ... */
e1baeee
-			}
e1baeee
-			else {
e1baeee
-			    /* Each state variable in
e1baeee
-			       (state $a, my $b, our $c, $d, undef) = ... */
e1baeee
-			}
e1baeee
-			yyerror(no_list_state);
e1baeee
-		    } else {
e1baeee
-			/* Each my variable in
e1baeee
-			   (state $a, my $b, our $c, $d, undef) = ... */
e1baeee
-		    }
e1baeee
-		} else {
e1baeee
-		    /* Other ops in the list. undef may be interesting in
e1baeee
-		       (state $a, undef, state $c) */
e1baeee
-		}
e1baeee
-		lop = lop->op_sibling;
e1baeee
-	    }
e1baeee
-	}
e1baeee
-	else if (((left->op_private & (OPpLVAL_INTRO | OPpPAD_STATE))
e1baeee
-		    == (OPpLVAL_INTRO | OPpPAD_STATE))
e1baeee
-		&& (   left->op_type == OP_PADSV
e1baeee
-		    || left->op_type == OP_PADAV
e1baeee
-		    || left->op_type == OP_PADHV
e1baeee
-		    || left->op_type == OP_PADANY))
e1baeee
-	{
e1baeee
-	    /* All single variable list context state assignments, hence
e1baeee
-	       state ($a) = ...
e1baeee
-	       (state $a) = ...
e1baeee
-	       state @a = ...
e1baeee
-	       state (@a) = ...
e1baeee
-	       (state @a) = ...
e1baeee
-	       state %a = ...
e1baeee
-	       state (%a) = ...
e1baeee
-	       (state %a) = ...
e1baeee
-	    */
e1baeee
-	    yyerror(no_list_state);
e1baeee
-	}
e1baeee
-
e1baeee
 	if (right && right->op_type == OP_SPLIT && !PL_madskills) {
e1baeee
 	    OP* tmpop = ((LISTOP*)right)->op_first;
e1baeee
 	    if (tmpop && (tmpop->op_type == OP_PUSHRE)) {