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