This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Simplify ck_grep
authorFather Chrysostomos <sprout@cpan.org>
Sat, 14 Jul 2012 13:58:29 +0000 (06:58 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 15 Jul 2012 00:35:31 +0000 (17:35 -0700)
Back in perl 5.000, ck_grep would call ck_sort (which was still the
case until 354dd559d99 just recently) and the latter would traverse
its way through the op_next pointers to find an op that tried to
escape the block, setting its op_next pointer to null.  Then ck_grep
would traverse op_next pointers itself to find the place where ck_sort
stopped.  That caused problems for grep which were fixed in 748a93069b
(perl 5.001).  It was fixed by setting op_next to 0 on the first op,
so that the loop in ck_grep would not do anything.  But that loop was
left there.  This commit removes it.

There are also a couple of things I missed when disentangling
ck_grep and ck_sort in commit /354dd559d9.  I accidentally put
if (o->op_flags & OPf_STACKED) inside if (o->op_flags & OPf_STACKED).
And the OPf_SPECIAL flag was only being set for sort’s use, so ck_grep
doesn’t need to copy that.

ext/B/t/f_map.t
ext/B/t/f_sort.t
ext/B/t/optree_samples.t
op.c

index 4506543..014861a 100644 (file)
@@ -95,7 +95,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
 # 5  <1> rv2av[t8] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> enter l
 # 9      <;> nextstate(main 475 (eval 10):1) v:{
@@ -119,7 +119,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
 # 5  <1> rv2av[t3] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t4] lK
 # 8      <0> enter l
 # 9      <;> nextstate(main 559 (eval 15):1) v:{
@@ -239,7 +239,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
 # 5  <1> rv2av[t7] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> pushmark s
 # 9      <#> gvsv[*_] s
@@ -259,7 +259,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
 # 5  <1> rv2av[t4] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t5] lK
 # 8      <0> pushmark s
 # 9      <$> gvsv(*_) s
@@ -291,7 +291,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
 # 5  <1> rv2av[t7] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> pushmark s
 # 9      <#> gvsv[*_] s
@@ -311,7 +311,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
 # 5  <1> rv2av[t4] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t5] lK
 # 8      <0> pushmark s
 # 9      <$> gvsv(*_) s
@@ -343,7 +343,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
 # 5  <1> rv2av[t6] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t8] lK
 # 8      <0> pushmark s
 # 9      <#> gvsv[*_] s
@@ -362,7 +362,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
 # 5  <1> rv2av[t3] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t4] lK
 # 8      <0> pushmark s
 # 9      <$> gvsv(*_) s
index f17976f..fc4a009 100644 (file)
@@ -500,7 +500,7 @@ checkOptree(name   => q{Compound sort/map Expression },
 # 5  <0> pushmark s
 # 6  <#> gv[*old] s
 # 7  <1> rv2av[t19] lKM/1
-# 8  <@> mapstart lK*
+# 8  <@> mapstart lK
 # 9  <|> mapwhile(other->a)[t20] lK
 # a      <0> enter l
 # b      <;> nextstate(main 608 (eval 34):2) v:{
@@ -513,7 +513,7 @@ checkOptree(name   => q{Compound sort/map Expression },
 # i      <@> leave lKP
 #            goto 9
 # j  <@> sort lKMS*
-# k  <@> mapstart lK*
+# k  <@> mapstart lK
 # l  <|> mapwhile(other->m)[t26] lK
 # m      <#> gv[*_] s
 # n      <1> rv2sv sKM/DREFAV,1
@@ -534,7 +534,7 @@ EOT_EOT
 # 5  <0> pushmark s
 # 6  <$> gv(*old) s
 # 7  <1> rv2av[t10] lKM/1
-# 8  <@> mapstart lK*
+# 8  <@> mapstart lK
 # 9  <|> mapwhile(other->a)[t11] lK
 # a      <0> enter l
 # b      <;> nextstate(main 608 (eval 34):2) v:{
@@ -547,7 +547,7 @@ EOT_EOT
 # i      <@> leave lKP
 #            goto 9
 # j  <@> sort lKMS*
-# k  <@> mapstart lK*
+# k  <@> mapstart lK
 # l  <|> mapwhile(other->m)[t12] lK
 # m      <$> gv(*_) s
 # n      <1> rv2sv sKM/DREFAV,1
@@ -783,7 +783,7 @@ checkOptree(note   => q{},
 # 4  <0> pushmark s
 # 5  <#> gv[*input] s
 # 6  <1> rv2av[t9] lKM/1
-# 7  <@> grepstart lK*
+# 7  <@> grepstart lK
 # 8  <|> grepwhile(other->9)[t10] lK
 # 9      <#> gvsv[*_] s
 # a      <#> gvsv[*_] s
@@ -802,7 +802,7 @@ EOT_EOT
 # 4  <0> pushmark s
 # 5  <$> gv(*input) s
 # 6  <1> rv2av[t3] lKM/1
-# 7  <@> grepstart lK*
+# 7  <@> grepstart lK
 # 8  <|> grepwhile(other->9)[t4] lK
 # 9      <$> gvsv(*_) s
 # a      <$> gvsv(*_) s
@@ -860,7 +860,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*input] s
 # 5  <1> rv2av[t7] lKM/1
-# 6  <@> grepstart lK*
+# 6  <@> grepstart lK
 # 7  <|> grepwhile(other->8)[t8] lK
 # 8      <#> gvsv[*_] s
 # 9      <#> gvsv[*_] s
@@ -874,7 +874,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*input) s
 # 5  <1> rv2av[t2] lKM/1
-# 6  <@> grepstart lK*
+# 6  <@> grepstart lK
 # 7  <|> grepwhile(other->8)[t3] lK
 # 8      <$> gvsv(*_) s
 # 9      <$> gvsv(*_) s
@@ -931,7 +931,7 @@ checkOptree(note   => q{},
 # 3  <0> pushmark s
 # 4  <#> gv[*input] s
 # 5  <1> rv2av[t8] lKM/1
-# 6  <@> grepstart lK*
+# 6  <@> grepstart lK
 # 7  <|> grepwhile(other->8)[t9] lK
 # 8      <#> gvsv[*_] s
 # 9      <#> gvsv[*_] s
@@ -947,7 +947,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*input) s
 # 5  <1> rv2av[t2] lKM/1
-# 6  <@> grepstart lK*
+# 6  <@> grepstart lK
 # 7  <|> grepwhile(other->8)[t3] lK
 # 8      <$> gvsv(*_) s
 # 9      <$> gvsv(*_) s
index 5db514c..f4a6e3c 100644 (file)
@@ -469,7 +469,7 @@ checkOptree ( name  => '%h = map { getkey($_) => $_ } @a',
 # 3  <0> pushmark s
 # 4  <#> gv[*a] s
 # 5  <1> rv2av[t8] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> enter l
 # 9      <;> nextstate(main 500 (eval 22):1) v:{
@@ -493,7 +493,7 @@ EOT_EOT
 # 3  <0> pushmark s
 # 4  <$> gv(*a) s
 # 5  <1> rv2av[t3] lKM/1
-# 6  <@> mapstart lK*
+# 6  <@> mapstart lK
 # 7  <|> mapwhile(other->8)[t4] lK
 # 8      <0> enter l
 # 9      <;> nextstate(main 500 (eval 22):1) v:{
diff --git a/op.c b/op.c
index 211ffb2..acea933 100644 (file)
--- a/op.c
+++ b/op.c
@@ -8580,20 +8580,12 @@ Perl_ck_grep(pTHX_ OP *o)
     /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
 
     if (o->op_flags & OPf_STACKED) {
-       OP* k;
        OP *firstkid = cLISTOPo->op_first->op_sibling;
         kid = cUNOPx(firstkid)->op_first;
        if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE)
            return no_fh_allowed(o);
-       if (o->op_flags & OPf_STACKED) {
-           LINKLIST(kid);
-           firstkid->op_next = kLISTOP->op_first;
-           kid->op_next = 0; /* just disconnect the leave/scope */
-           o->op_flags |= OPf_SPECIAL;
-       }
-       for (k = kid; k; k = k->op_next) {
-           kid = k;
-       }
+       LINKLIST(kid);
+       firstkid->op_next = kLISTOP->op_first;
        NewOp(1101, gwop, 1, LOGOP);
        kid->op_next = (OP*)gwop;
        o->op_flags &= ~OPf_STACKED;