xref: /openbsd-src/gnu/usr.bin/perl/ext/B/t/optree_for.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
1#!perl
2
3BEGIN {
4    unshift @INC, 't';
5    require Config;
6    if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7        print "1..0 # Skip -- Perl configured without B module\n";
8        exit 0;
9    }
10}
11use OptreeCheck;
12plan tests => 19;
13
14pass("FOR LOOPS");
15
16checkOptree ( name      => 'for (@a)',
17              code      => sub {for (@a) {}},
18              bcopts    => '-exec',
19              strip_open_hints => 1,
20              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
211  <;> nextstate(main 424 optree_for.t:14) v:>,<,%
222  <0> pushmark sM
233  <#> gv[*a] s
244  <1> rv2av[t2] sKRM/1
255  <#> gv[*_] s
266  <{> enteriter(next->8 last->b redo->7) KS/DEF
279  <0> iter s
28a  <|> and(other->7) K/1
297      <0> stub v
308      <0> unstack s
31           goto 9
32b  <2> leaveloop K/2
33c  <1> leavesub[1 ref] K/REFC,1
34EOT_EOT
351  <;> nextstate(main 424 optree_for.t:14) v:>,<,%
362  <0> pushmark sM
373  <$> gv(*a) s
384  <1> rv2av[t1] sKRM/1
395  <$> gv(*_) s
406  <{> enteriter(next->8 last->b redo->7) KS/DEF
419  <0> iter s
42a  <|> and(other->7) K/1
437      <0> stub v
448      <0> unstack s
45           goto 9
46b  <2> leaveloop K/2
47c  <1> leavesub[1 ref] K/REFC,1
48EONT_EONT
49
50my @lexical;
51
52checkOptree ( name      => 'for (@lexical)',
53              code      => sub {for (@lexical) {}},
54              bcopts    => '-exec',
55              strip_open_hints => 1,
56              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
571  <;> nextstate(main 424 optree_for.t:14) v:>,<,%
582  <0> pushmark sM
593  <0> padav[@lexical:FAKE::7] sRM
604  <#> gv[*_] s
615  <{> enteriter(next->7 last->a redo->6) KS/DEF
628  <0> iter s
639  <|> and(other->6) K/1
646      <0> stub v
657      <0> unstack s
66           goto 8
67a  <2> leaveloop K/2
68b  <1> leavesub[2 refs] K/REFC,1
69EOT_EOT
701  <;> nextstate(main 424 optree_for.t:14) v:>,<,%
712  <0> pushmark sM
723  <0> padav[@lexical:FAKE::2] sRM
734  <$> gv(*_) s
745  <{> enteriter(next->7 last->a redo->6) KS/DEF
758  <0> iter s
769  <|> and(other->6) K/1
776      <0> stub v
787      <0> unstack s
79           goto 8
80a  <2> leaveloop K/2
81b  <1> leavesub[2 refs] K/REFC,1
82EONT_EONT
83
84checkOptree ( name      => 'for $var (@a)',
85              code      => sub {for $var (@a) {}},
86              bcopts    => '-exec',
87              strip_open_hints => 1,
88              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
891  <;> nextstate(main 1453 optree_for.t:68) v:{
902  <0> pushmark sM
913  <#> gv[*a] s
924  <1> rv2av[t3] sKRM/1
935  <#> gv[*var] s
946  <1> rv2gv sKRM/1
957  <{> enteriter(next->9 last->c redo->8) KS
96a  <0> iter s
97b  <|> and(other->8) K/1
988      <0> stub v
999      <0> unstack s
100           goto a
101c  <2> leaveloop KP/2
102d  <1> leavesub[1 ref] K/REFC,1
103EOT_EOT
1041  <;> nextstate(main 1453 optree_for.t:67) v:{
1052  <0> pushmark sM
1063  <$> gv(*a) s
1074  <1> rv2av[t1] sKRM/1
1085  <$> gv(*var) s
1096  <1> rv2gv sKRM/1
1107  <{> enteriter(next->9 last->c redo->8) KS
111a  <0> iter s
112b  <|> and(other->8) K/1
1138      <0> stub v
1149      <0> unstack s
115           goto a
116c  <2> leaveloop KP/2
117d  <1> leavesub[1 ref] K/REFC,1
118EONT_EONT
119
120checkOptree ( name      => 'for my $var (@a)',
121              code      => sub {for my $var (@a) {}},
122              bcopts    => '-exec',
123              strip_open_hints => 1,
124              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1251  <;> nextstate(main 1459 optree_for.t:90) v
1262  <0> pushmark sM
1273  <#> gv[*a] s
1284  <1> rv2av[t3] sKRM/1
1295  <{> enteriter(next->7 last->a redo->6)[$var:1460,1463] KS/LVINTRO
1308  <0> iter s
1319  <|> and(other->6) K/1
1326      <0> stub v
1337      <0> unstack s
134           goto 8
135a  <2> leaveloop K/2
136b  <1> leavesub[1 ref] K/REFC,1
137EOT_EOT
1381  <;> nextstate(main 424 optree_for.t:14) v:>,<,%
1392  <0> pushmark sM
1403  <$> gv(*a) s
1414  <1> rv2av[t2] sKRM/1
1425  <{> enteriter(next->7 last->a redo->6)[$var:1460,1463] KS/LVINTRO
1438  <0> iter s
1449  <|> and(other->6) K/1
1456      <0> stub v
1467      <0> unstack s
147           goto 8
148a  <2> leaveloop K/2
149b  <1> leavesub[1 ref] K/REFC,1
150EONT_EONT
151
152checkOptree ( name      => 'for our $var (@a)',
153              code      => sub {for our $var (@a) {}},
154              bcopts    => '-exec',
155              strip_open_hints => 1,
156              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1571  <;> nextstate(main 1466 optree_for.t:100) v
1582  <0> pushmark sM
1593  <#> gv[*a] s
1604  <1> rv2av[t4] sKRM/1
1615  <#> gv[*var] s
1626  <1> rv2gv sK/FAKE,1
1637  <{> enteriter(next->9 last->c redo->8) KS/OURINTR
164a  <0> iter s
165b  <|> and(other->8) K/1
1668      <0> stub v
1679      <0> unstack s
168           goto a
169c  <2> leaveloop K/2
170d  <1> leavesub[1 ref] K/REFC,1
171EOT_EOT
1721  <;> nextstate(main 424 optree_for.t:111) v:>,<,%
1732  <0> pushmark sM
1743  <$> gv(*a) s
1754  <1> rv2av[t2] sKRM/1
1765  <$> gv(*var) s
1776  <1> rv2gv sK/FAKE,1
1787  <{> enteriter(next->9 last->c redo->8) KS/OURINTR
179a  <0> iter s
180b  <|> and(other->8) K/1
1818      <0> stub v
1829      <0> unstack s
183           goto a
184c  <2> leaveloop K/2
185d  <1> leavesub[1 ref] K/REFC,1
186EONT_EONT
187
188checkOptree ( name      => 'for my ($var) (@a)',
189              code      => sub {for my ($var) (@a) {}},
190              bcopts    => '-exec',
191              strip_open_hints => 1,
192              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1931  <;> nextstate(main 1466 optree_for.t:100) v
1942  <0> pushmark sM
1953  <#> gv[*a] s
1964  <1> rv2av[t3] sKRM/1
1975  <{> enteriter(next->7 last->a redo->6)[$var:1474,1477] KPS/LVINTRO
1988  <0> iter s
1999  <|> and(other->6) K/1
2006      <0> stub v
2017      <0> unstack s
202           goto 8
203a  <2> leaveloop K/2
204b  <1> leavesub[1 ref] K/REFC,1
205EOT_EOT
2061  <;> nextstate(main 424 optree_for.t:111) v:>,<,%
2072  <0> pushmark sM
2083  <$> gv(*a) s
2094  <1> rv2av[t2] sKRM/1
2105  <{> enteriter(next->7 last->a redo->6)[$var:1474,1477] KPS/LVINTRO
2118  <0> iter s
2129  <|> and(other->6) K/1
2136      <0> stub v
2147      <0> unstack s
215           goto 8
216a  <2> leaveloop K/2
217b  <1> leavesub[1 ref] K/REFC,1
218EONT_EONT
219
220checkOptree ( name      => 'for my ($var) (@lexical)',
221              code      => sub {for my ($var) (@lexical) {}},
222              bcopts    => '-exec',
223              strip_open_hints => 1,
224              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2251  <;> nextstate(main 1466 optree_for.t:100) v
2262  <0> pushmark sM
2273  <0> padav[@lexical:FAKE::7] sRM
2284  <{> enteriter(next->6 last->9 redo->5)[$var:1481,1484] KPS/LVINTRO
2297  <0> iter s
2308  <|> and(other->5) K/1
2315      <0> stub v
2326      <0> unstack s
233           goto 7
2349  <2> leaveloop K/2
235a  <1> leavesub[2 refs] K/REFC,1
236EOT_EOT
2371  <;> nextstate(main 424 optree_for.t:111) v:>,<,%
2382  <0> pushmark sM
2393  <0> padav[@lexical:FAKE::2] sRM
2404  <{> enteriter(next->6 last->9 redo->5)[$var:1481,1484] KPS/LVINTRO
2417  <0> iter s
2428  <|> and(other->5) K/1
2435      <0> stub v
2446      <0> unstack s
245           goto 7
2469  <2> leaveloop K/2
247a  <1> leavesub[2 refs] K/REFC,1
248EONT_EONT
249
250checkOptree ( name      => 'for my ($key, $value) (%h)',
251              code      => sub {for my ($key, $value) (%h) {}},
252              bcopts    => '-exec',
253              strip_open_hints => 1,
254              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2551  <;> nextstate(main 1466 optree_for.t:100) v
2562  <0> pushmark sM
2573  <#> gv[*h] s
2584  <1> rv2hv[t4] lKM
2595  <{> enteriter(next->7 last->a redo->6)[$key:1488,1491; $value:1488,1491] KP/LVINTRO
2608  <0> iter s
2619  <|> and(other->6) K/1
2626      <0> stub v
2637      <0> unstack s
264           goto 8
265a  <2> leaveloop K/2
266b  <1> leavesub[1 ref] K/REFC,1
267EOT_EOT
2681  <;> nextstate(main 424 optree_for.t:111) v:>,<,%
2692  <0> pushmark sM
2703  <$> gv(*h) s
2714  <1> rv2hv[t3] lKM
2725  <{> enteriter(next->7 last->a redo->6)[$key:1488,1491; $value:1488,1491] KP/LVINTRO
2738  <0> iter s
2749  <|> and(other->6) K/1
2756      <0> stub v
2767      <0> unstack s
277           goto 8
278a  <2> leaveloop K/2
279b  <1> leavesub[1 ref] K/REFC,1
280EONT_EONT
281
282checkOptree ( name      => 'for my ($foo, $bar, $baz) (@a)',
283              code      => sub {for my ($foo, $bar, $baz) (@a) {}},
284              bcopts    => '-exec',
285              strip_open_hints => 1,
286              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2871  <;> nextstate(main 1466 optree_for.t:100) v
2882  <0> pushmark sM
2893  <#> gv[*a] s
2904  <1> rv2av[t5] sKRM/1
2915  <{> enteriter(next->7 last->a redo->6)[$foo:1495,1498; $bar:1495,1498; $baz:1495,1498] KPS/LVINTRO
2928  <0> iter s
2939  <|> and(other->6) K/1
2946      <0> stub v
2957      <0> unstack s
296           goto 8
297a  <2> leaveloop K/2
298b  <1> leavesub[1 ref] K/REFC,1
299EOT_EOT
3001  <;> nextstate(main 424 optree_for.t:111) v:>,<,%
3012  <0> pushmark sM
3023  <$> gv(*a) s
3034  <1> rv2av[t4] sKRM/1
3045  <{> enteriter(next->7 last->a redo->6)[$foo:1495,1498; $bar:1495,1498; $baz:1495,1498] KPS/LVINTRO
3058  <0> iter s
3069  <|> and(other->6) K/1
3076      <0> stub v
3087      <0> unstack s
309           goto 8
310a  <2> leaveloop K/2
311b  <1> leavesub[1 ref] K/REFC,1
312EONT_EONT
313