# b <@> stringify[t5] sK/1
# c <$> const[IV 1] s
# d <@> list lK
-# - <@> scope lK
# goto 7
# e <0> pushmark s
# f <#> gv[*hash] s
# b <@> stringify[t3] sK/1
# c <$> const(IV 1) s
# d <@> list lK
-# - <@> scope lK
# goto 7
# e <0> pushmark s
# f <$> gv(*hash) s
# b <@> stringify[t5] sK/1
# c <$> const[IV 1] s
# d <@> list lKP
-# - <@> scope lK
# goto 7
# e <0> pushmark s
# f <#> gv[*hash] s
# b <@> stringify[t3] sK/1
# c <$> const(IV 1) s
# d <@> list lKP
-# - <@> scope lK
# goto 7
# e <0> pushmark s
# f <$> gv(*hash) s
# a <1> lc[t4] sK/1
# b <$> const[IV 1] s
# c <@> list lK
-# - <@> scope lK
# goto 7
# d <0> pushmark s
# e <#> gv[*hash] s
# a <1> lc[t2] sK/1
# b <$> const(IV 1) s
# c <@> list lK
-# - <@> scope lK
# goto 7
# d <0> pushmark s
# e <$> gv(*hash) s
# o <1> rv2av[t4] sKR/1
# p <$> const[IV 0] s
# q <2> aelem sK/2
-# - <@> scope lK
# goto l
# r <0> pushmark s
# s <#> gv[*new] s
# o <1> rv2av[t2] sKR/1
# p <$> const(IV 0) s
# q <2> aelem sK/2
-# - <@> scope lK
# goto l
# r <0> pushmark s
# s <$> gv(*new) s
# 9 <#> gvsv[*_] s
# a <#> gvsv[*_] s
# b <2> eq sK/2
-# - <@> scope sK
# goto 8
# c <@> sort lK/NUM
# d <0> pushmark s
# 9 <$> gvsv(*_) s
# a <$> gvsv(*_) s
# b <2> eq sK/2
-# - <@> scope sK
# goto 8
# c <@> sort lK/NUM
# d <0> pushmark s
# 8 <#> gvsv[*_] s
# 9 <#> gvsv[*_] s
# a <2> eq sK/2
-# - <@> scope sK
# goto 7
# b <@> sort K/NUM
# c <1> leavesub[1 ref] K/REFC,1
# 8 <$> gvsv(*_) s
# 9 <$> gvsv(*_) s
# a <2> eq sK/2
-# - <@> scope sK
# goto 7
# b <@> sort K/NUM
# c <1> leavesub[1 ref] K/REFC,1
# 8 <#> gvsv[*_] s
# 9 <#> gvsv[*_] s
# a <2> eq sK/2
-# - <@> scope sK
# goto 7
# b <@> sort sK/NUM
# c <#> gvsv[*s] s
# 8 <$> gvsv(*_) s
# 9 <$> gvsv(*_) s
# a <2> eq sK/2
-# - <@> scope sK
# goto 7
# b <@> sort sK/NUM
# c <$> gvsv(*s) s
kid->op_next = 0; /* just disconnect the leave */
k = kLISTOP->op_first;
}
- CALL_PEEP(k);
kid = firstkid;
if (o->op_type == OP_SORT) {
#define MAX_DEFERRED 4
#define DEFER(o) \
+ STMT_START { \
if (defer_ix == (MAX_DEFERRED-1)) { \
CALL_RPEEP(defer_queue[defer_base]); \
defer_base = (defer_base + 1) % MAX_DEFERRED; \
defer_ix--; \
} \
- defer_queue[(defer_base + ++defer_ix) % MAX_DEFERRED] = o;
+ defer_queue[(defer_base + ++defer_ix) % MAX_DEFERRED] = o; \
+ } STMT_END
/* A peephole optimizer. We visit the ops in the order they're to execute.
* See the comments at the top of this file for more details about when
break;
case OP_SORT: {
+ OP *oright;
+
+ if (o->op_flags & OPf_STACKED) {
+ OP * const kid =
+ cUNOPx(cLISTOP->op_first->op_sibling)->op_first;
+ if (kid->op_type == OP_SCOPE
+ || (kid->op_type == OP_NULL && kid->op_targ == OP_LEAVE)) DEFER(kLISTOP->op_first);
+ }
+
/* check that RHS of sort is a single plain array */
- OP *oright = cUNOPo->op_first;
+ oright = cUNOPo->op_first;
if (!oright || oright->op_type != OP_PUSHMARK)
break;
chdir 't';
@INC = qw(../lib);
require './test.pl';
- plan (tests => 13);
+ plan (tests => 17);
}
is __SUB__, "__SUB__", '__SUB__ is a bareword outside of use feature';
return "begin 2" if @_;
is &CORE::__SUB__->(0), "begin 2", 'in BEGIN block via & (unoptimised)'
}
+
+sub bar;
+sub bar {
+ () = sort {
+ is CORE::__SUB__, \&bar, 'in sort block in sub with forw decl'
+ } 1,2;
+}
+bar();
+sub bur;
+sub bur {
+ () = sort {
+ is &CORE::__SUB__, \&bur, '& in sort block in sub with forw decl'
+ } 1,2;
+}
+bur();
+
+sub squog;
+sub squog {
+ grep { is CORE::__SUB__, \&squog,
+ 'in grep block in sub with forw decl'
+ } 1;
+}
+squog();
+sub squag;
+sub squag {
+ grep { is &CORE::__SUB__, \&squag,
+ '& in grep block in sub with forw decl'
+ } 1;
+}
+squag();