ext/B/t/optree_check.t test OptreeCheck apparatus
ext/B/t/optree_concise.t more B::Concise tests
ext/B/t/optree_constants.t B::Concise rendering of optimized constant subs
-ext/B/t/optree_samples.t various basic codes: if for while
+ext/B/t/optree_misc.t misc optree tests
+ext/B/t/optree_samples.t various basic codes: if for while
ext/B/t/optree_sort.t inplace sort optimization regression
ext/B/t/optree_specials.t BEGIN, END, etc code
ext/B/t/optree_varinit.t my,our,local var init optimization
--- /dev/null
+#!perl
+
+BEGIN {
+ if ($ENV{PERL_CORE}){
+ chdir('t') if -d 't';
+ @INC = ('.', '../lib', '../ext/B/t');
+ } else {
+ unshift @INC, 't';
+ push @INC, "../../t";
+ }
+ require Config;
+ if (($Config::Config{'extensions'} !~ /\bB\b/) ){
+ print "1..0 # Skip -- Perl configured without B module\n";
+ exit 0;
+ }
+}
+use OptreeCheck;
+use Config;
+plan tests => 1;
+
+SKIP: {
+skip "no perlio in this build", 1 unless $Config::Config{useperlio};
+
+# The regression this is testing is that the first aelemfast, derived
+# from a lexical array, is supposed to be a BASEOP "<0>", while the
+# second, from a global, is an SVOP "<$>" or a PADOP "<#>" depending
+# on threading. In buggy versions, both showed up as SVOPs/PADOPs. See
+# B.xs:cc_opclass() for the relevant code.
+
+checkOptree ( name => 'OP_AELEMFAST opclass',
+ code => sub { my @x; our @y; $x[0] + $y[0]},
+ expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
+# a <1> leavesub[1 ref] K/REFC,1 ->(end)
+# - <@> lineseq KP ->a
+# 1 <;> nextstate(main 634 optree_misc.t:25) v ->2
+# 2 <0> padav[@x:634,636] vM/LVINTRO ->3
+# 3 <;> nextstate(main 635 optree_misc.t:25) v ->4
+# 5 <1> rv2av[t4] vK/OURINTR,1 ->6
+# 4 <#> gv[*y] s ->5
+# 6 <;> nextstate(main 636 optree_misc.t:25) v ->7
+# 9 <2> add[t6] sK/2 ->a
+# - <1> ex-aelem sK/2 ->8
+# 7 <0> aelemfast[@x:634,636] sR* ->8
+# - <0> ex-const s ->-
+# - <1> ex-aelem sK/2 ->9
+# - <1> ex-rv2av sKR/1 ->-
+# 8 <#> aelemfast[*y] s ->9
+# - <0> ex-const s ->-
+EOT_EOT
+# a <1> leavesub[1 ref] K/REFC,1 ->(end)
+# - <@> lineseq KP ->a
+# 1 <;> nextstate(main 634 optree_misc.t:27) v ->2
+# 2 <0> padav[@x:634,636] vM/LVINTRO ->3
+# 3 <;> nextstate(main 635 optree_misc.t:27) v ->4
+# 5 <1> rv2av[t3] vK/OURINTR,1 ->6
+# 4 <$> gv(*y) s ->5
+# 6 <;> nextstate(main 636 optree_misc.t:27) v ->7
+# 9 <2> add[t4] sK/2 ->a
+# - <1> ex-aelem sK/2 ->8
+# 7 <0> aelemfast[@x:634,636] sR* ->8
+# - <0> ex-const s ->-
+# - <1> ex-aelem sK/2 ->9
+# - <1> ex-rv2av sKR/1 ->-
+# 8 <$> aelemfast(*y) s ->9
+# - <0> ex-const s ->-
+EONT_EONT
+
+
+} #skip
+
+__END__
+