packages: perl/perl-parameter_passing.patch (NEW) - Big slowdown in 5.10 @_...

radek radek at pld-linux.org
Tue Jul 14 17:51:18 CEST 2009


Author: radek                        Date: Tue Jul 14 15:51:18 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- Big slowdown in 5.10 @_ parameter passing

---- Files affected:
packages/perl:
   perl-parameter_passing.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/perl/perl-parameter_passing.patch
diff -u /dev/null packages/perl/perl-parameter_passing.patch:1.1
--- /dev/null	Tue Jul 14 17:51:18 2009
+++ packages/perl/perl-parameter_passing.patch	Tue Jul 14 17:51:13 2009
@@ -0,0 +1,151 @@
+commit fafafbaf705adfdf05ff97b6ab5149ba4ee3c039
+Author: Rick Delaney <rick at consumercontact.com>
+Date:   Sun Jan 6 09:14:39 2008 -0500
+
+    Big slowdown in 5.10 @_ parameter passing
+    Message-ID: <20080106191439.GF13935 at bort.ca>
+    
+    p4raw-id: //depot/perl at 32891
+
+diff --git a/op.c b/op.c
+index a732aa4..af52a3a 100644
+--- a/op.c
++++ b/op.c
+@@ -3992,6 +3992,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+ 	static const char no_list_state[] = "Initialization of state variables"
+ 	    " in list context currently forbidden";
+ 	OP *curop;
++	bool maybe_common_vars = TRUE;
+ 
+ 	PL_modcount = 0;
+ 	/* Grandfathering $[ assignment here.  Bletch.*/
+@@ -4009,6 +4010,65 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+ 	o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
+ 	o->op_private = (U8)(0 | (flags >> 8));
+ 
++	if ((left->op_type == OP_LIST
++	     || (left->op_type == OP_NULL && left->op_targ == OP_LIST)))
++	{
++	    OP* lop = ((LISTOP*)left)->op_first;
++	    maybe_common_vars = FALSE;
++	    while (lop) {
++		if (lop->op_type == OP_PADSV ||
++		    lop->op_type == OP_PADAV ||
++		    lop->op_type == OP_PADHV ||
++		    lop->op_type == OP_PADANY) {
++		    if (!(lop->op_private & OPpLVAL_INTRO))
++			maybe_common_vars = TRUE;
++
++		    if (lop->op_private & OPpPAD_STATE) {
++			if (left->op_private & OPpLVAL_INTRO) {
++			    /* Each variable in state($a, $b, $c) = ... */
++			}
++			else {
++			    /* Each state variable in
++			       (state $a, my $b, our $c, $d, undef) = ... */
++			}
++			yyerror(no_list_state);
++		    } else {
++			/* Each my variable in
++			   (state $a, my $b, our $c, $d, undef) = ... */
++		    }
++		} else if (lop->op_type == OP_UNDEF ||
++			   lop->op_type == OP_PUSHMARK) {
++		    /* undef may be interesting in
++		       (state $a, undef, state $c) */
++		} else {
++		    /* Other ops in the list. */
++		    maybe_common_vars = TRUE;
++		}
++		lop = lop->op_sibling;
++	    }
++	}
++	else if ((left->op_private & OPpLVAL_INTRO)
++		&& (   left->op_type == OP_PADSV
++		    || left->op_type == OP_PADAV
++		    || left->op_type == OP_PADHV
++		    || left->op_type == OP_PADANY))
++	{
++	    maybe_common_vars = FALSE;
++	    if (left->op_private & OPpPAD_STATE) {
++		/* All single variable list context state assignments, hence
++		   state ($a) = ...
++		   (state $a) = ...
++		   state @a = ...
++		   state (@a) = ...
++		   (state @a) = ...
++		   state %a = ...
++		   state (%a) = ...
++		   (state %a) = ...
++		*/
++		yyerror(no_list_state);
++	    }
++	}
++
+ 	/* PL_generation sorcery:
+ 	 * an assignment like ($a,$b) = ($c,$d) is easier than
+ 	 * ($a,$b) = ($c,$a), since there is no need for temporary vars.
+@@ -4023,7 +4083,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+ 	 * to store these values, evil chicanery is done with SvUVX().
+ 	 */
+ 
+-	{
++	if (maybe_common_vars) {
+ 	    OP *lastop = o;
+ 	    PL_generation++;
+ 	    for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
+@@ -4084,54 +4144,6 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
+ 		o->op_private |= OPpASSIGN_COMMON;
+ 	}
+ 
+-	if ((left->op_type == OP_LIST
+-	     || (left->op_type == OP_NULL && left->op_targ == OP_LIST))) {
+-	    OP* lop = ((LISTOP*)left)->op_first;
+-	    while (lop) {
+-		if (lop->op_type == OP_PADSV ||
+-		    lop->op_type == OP_PADAV ||
+-		    lop->op_type == OP_PADHV ||
+-		    lop->op_type == OP_PADANY) {
+-		    if (lop->op_private & OPpPAD_STATE) {
+-			if (left->op_private & OPpLVAL_INTRO) {
+-			    /* Each variable in state($a, $b, $c) = ... */
+-			}
+-			else {
+-			    /* Each state variable in
+-			       (state $a, my $b, our $c, $d, undef) = ... */
+-			}
+-			yyerror(no_list_state);
+-		    } else {
+-			/* Each my variable in
+-			   (state $a, my $b, our $c, $d, undef) = ... */
+-		    }
+-		} else {
+-		    /* Other ops in the list. undef may be interesting in
+-		       (state $a, undef, state $c) */
+-		}
+-		lop = lop->op_sibling;
+-	    }
+-	}
+-	else if (((left->op_private & (OPpLVAL_INTRO | OPpPAD_STATE))
+-		    == (OPpLVAL_INTRO | OPpPAD_STATE))
+-		&& (   left->op_type == OP_PADSV
+-		    || left->op_type == OP_PADAV
+-		    || left->op_type == OP_PADHV
+-		    || left->op_type == OP_PADANY))
+-	{
+-	    /* All single variable list context state assignments, hence
+-	       state ($a) = ...
+-	       (state $a) = ...
+-	       state @a = ...
+-	       state (@a) = ...
+-	       (state @a) = ...
+-	       state %a = ...
+-	       state (%a) = ...
+-	       (state %a) = ...
+-	    */
+-	    yyerror(no_list_state);
+-	}
+-
+ 	if (right && right->op_type == OP_SPLIT && !PL_madskills) {
+ 	    OP* tmpop = ((LISTOP*)right)->op_first;
+ 	    if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
================================================================


More information about the pld-cvs-commit mailing list