xref: /openbsd-src/gnu/usr.bin/perl/ext/B/t/optree_misc.t (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
1#!perl
2
3BEGIN {
4    if ($ENV{PERL_CORE}){
5	chdir('t') if -d 't';
6	@INC = ('.', '../lib', '../ext/B/t');
7    } else {
8	unshift @INC, 't';
9	push @INC, "../../t";
10    }
11    require Config;
12    if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13        print "1..0 # Skip -- Perl configured without B module\n";
14        exit 0;
15    }
16}
17use OptreeCheck;
18use Config;
19plan tests => 2;
20
21SKIP: {
22skip "no perlio in this build", 1 unless $Config::Config{useperlio};
23
24# The regression this is testing is that the first aelemfast, derived
25# from a lexical array, is supposed to be a BASEOP "<0>", while the
26# second, from a global, is an SVOP "<$>" or a PADOP "<#>" depending
27# on threading. In buggy versions, both showed up as SVOPs/PADOPs. See
28# B.xs:cc_opclass() for the relevant code.
29
30checkOptree ( name	=> 'OP_AELEMFAST opclass',
31	      code	=> sub { my @x; our @y; $x[0] + $y[0]},
32	      strip_open_hints => 1,
33	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
34# a  <1> leavesub[1 ref] K/REFC,1 ->(end)
35# -     <@> lineseq KP ->a
36# 1        <;> nextstate(main 634 optree_misc.t:25) v:>,<,% ->2
37# 2        <0> padav[@x:634,636] vM/LVINTRO ->3
38# 3        <;> nextstate(main 635 optree_misc.t:25) v:>,<,% ->4
39# 5        <1> rv2av[t4] vK/OURINTR,1 ->6
40# 4           <#> gv[*y] s ->5
41# 6        <;> nextstate(main 636 optree_misc.t:25) v:>,<,%,{ ->7
42# 9        <2> add[t6] sK/2 ->a
43# -           <1> ex-aelem sK/2 ->8
44# 7              <0> aelemfast[@x:634,636] sR* ->8
45# -              <0> ex-const s ->-
46# -           <1> ex-aelem sK/2 ->9
47# -              <1> ex-rv2av sKR/1 ->-
48# 8                 <#> aelemfast[*y] s ->9
49# -              <0> ex-const s ->-
50EOT_EOT
51# a  <1> leavesub[1 ref] K/REFC,1 ->(end)
52# -     <@> lineseq KP ->a
53# 1        <;> nextstate(main 634 optree_misc.t:27) v:>,<,% ->2
54# 2        <0> padav[@x:634,636] vM/LVINTRO ->3
55# 3        <;> nextstate(main 635 optree_misc.t:27) v:>,<,% ->4
56# 5        <1> rv2av[t3] vK/OURINTR,1 ->6
57# 4           <$> gv(*y) s ->5
58# 6        <;> nextstate(main 636 optree_misc.t:27) v:>,<,%,{ ->7
59# 9        <2> add[t4] sK/2 ->a
60# -           <1> ex-aelem sK/2 ->8
61# 7              <0> aelemfast[@x:634,636] sR* ->8
62# -              <0> ex-const s ->-
63# -           <1> ex-aelem sK/2 ->9
64# -              <1> ex-rv2av sKR/1 ->-
65# 8                 <$> aelemfast(*y) s ->9
66# -              <0> ex-const s ->-
67EONT_EONT
68
69
70} #skip
71
72my $t = <<'EOT_EOT';
73# 8  <@> leave[1 ref] vKP/REFC ->(end)
74# 1     <0> enter ->2
75# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
76# 7     <2> sassign vKS/2 ->8
77# 5        <@> index[t2] sK/2 ->6
78# -           <0> ex-pushmark s ->3
79# 3           <$> const[PV "foo"] s ->4
80# 4           <$> const[GV "foo"] s ->5
81# -        <1> ex-rv2sv sKRM*/1 ->7
82# 6           <#> gvsv[*_] s ->7
83EOT_EOT
84my $nt = <<'EONT_EONT';
85# 8  <@> leave[1 ref] vKP/REFC ->(end)
86# 1     <0> enter ->2
87# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
88# 7     <2> sassign vKS/2 ->8
89# 5        <@> index[t1] sK/2 ->6
90# -           <0> ex-pushmark s ->3
91# 3           <$> const(PV "foo") s ->4
92# 4           <$> const(GV "foo") s ->5
93# -        <1> ex-rv2sv sKRM*/1 ->7
94# 6           <$> gvsv(*_) s ->7
95EONT_EONT
96
97if ($] < 5.009) {
98    $t =~ s/GV /BM /;
99    $nt =~ s/GV /BM /;
100}
101
102checkOptree ( name      => 'index and PVBM',
103	      prog	=> '$_ = index q(foo), q(foo)',
104	      strip_open_hints => 1,
105	      expect	=> $t,  expect_nt => $nt);
106
107__END__
108
109