This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Optimisation for 'my $x; my $y;' -> 'my ($x, $y)'.
[perl5.git] / ext / B / t / optree_samples.t
1 #!perl
2
3 BEGIN {
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     if (!$Config::Config{useperlio}) {
11         print "1..0 # Skip -- need perlio to walk the optree\n";
12         exit 0;
13     }
14 }
15 use OptreeCheck;
16 use Config;
17 plan tests      => 46;
18
19 pass("GENERAL OPTREE EXAMPLES");
20
21 pass("IF,THEN,ELSE, ?:");
22
23 checkOptree ( name      => '-basic sub {if shift print then,else}',
24               bcopts    => '-basic',
25               code      => sub { if (shift) { print "then" }
26                                  else       { print "else" }
27                              },
28               strip_open_hints => 1,
29               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
30 # 7  <1> leavesub[1 ref] K/REFC,1 ->(end)
31 # -     <@> lineseq KP ->7
32 # 1        <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2
33 # -        <1> null K/1 ->-
34 # 3           <|> cond_expr(other->4) K/1 ->8
35 # 2              <0> shift s* ->3
36 # -              <@> scope K ->-
37 # -                 <0> ex-nextstate v ->4
38 # 6                 <@> print sK ->7
39 # 4                    <0> pushmark s ->5
40 # 5                    <$> const[PV "then"] s ->6
41 # d              <@> leave KP ->7
42 # 8                 <0> enter ->9
43 # 9                 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a
44 # c                 <@> print sK ->d
45 # a                    <0> pushmark s ->b
46 # b                    <$> const[PV "else"] s ->c
47 EOT_EOT
48 # 7  <1> leavesub[1 ref] K/REFC,1 ->(end)
49 # -     <@> lineseq KP ->7
50 # 1        <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2
51 # -        <1> null K/1 ->-
52 # 3           <|> cond_expr(other->4) K/1 ->8
53 # 2              <0> shift s* ->3
54 # -              <@> scope K ->-
55 # -                 <0> ex-nextstate v ->4
56 # 6                 <@> print sK ->7
57 # 4                    <0> pushmark s ->5
58 # 5                    <$> const(PV "then") s ->6
59 # d              <@> leave KP ->7
60 # 8                 <0> enter ->9
61 # 9                 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a
62 # c                 <@> print sK ->d
63 # a                    <0> pushmark s ->b
64 # b                    <$> const(PV "else") s ->c
65 EONT_EONT
66
67 checkOptree ( name      => '-basic (see above, with my $a = shift)',
68               bcopts    => '-basic',
69               code      => sub { my $a = shift;
70                                  if ($a) { print "foo" }
71                                  else    { print "bar" }
72                              },
73               strip_open_hints => 1,
74               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
75 # b  <1> leavesub[1 ref] K/REFC,1 ->(end)
76 # -     <@> lineseq KP ->b
77 # 1        <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2
78 # 4        <2> sassign vKS/2 ->5
79 # 2           <0> shift s* ->3
80 # 3           <0> padsv[$a:666,670] sRM*/LVINTRO ->4
81 # 5        <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->6
82 # -        <1> null K/1 ->-
83 # 7           <|> cond_expr(other->8) K/1 ->c
84 # 6              <0> padsv[$a:666,670] s ->7
85 # -              <@> scope K ->-
86 # -                 <0> ex-nextstate v ->8
87 # a                 <@> print sK ->b
88 # 8                    <0> pushmark s ->9
89 # 9                    <$> const[PV "foo"] s ->a
90 # h              <@> leave KP ->b
91 # c                 <0> enter ->d
92 # d                 <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->e
93 # g                 <@> print sK ->h
94 # e                    <0> pushmark s ->f
95 # f                    <$> const[PV "bar"] s ->g
96 EOT_EOT
97 # b  <1> leavesub[1 ref] K/REFC,1 ->(end)
98 # -     <@> lineseq KP ->b
99 # 1        <;> nextstate(main 666 optree_samples.t:72) v:>,<,% ->2
100 # 4        <2> sassign vKS/2 ->5
101 # 2           <0> shift s* ->3
102 # 3           <0> padsv[$a:666,670] sRM*/LVINTRO ->4
103 # 5        <;> nextstate(main 670 optree_samples.t:73) v:>,<,% ->6
104 # -        <1> null K/1 ->-
105 # 7           <|> cond_expr(other->8) K/1 ->c
106 # 6              <0> padsv[$a:666,670] s ->7
107 # -              <@> scope K ->-
108 # -                 <0> ex-nextstate v ->8
109 # a                 <@> print sK ->b
110 # 8                    <0> pushmark s ->9
111 # 9                    <$> const(PV "foo") s ->a
112 # h              <@> leave KP ->b
113 # c                 <0> enter ->d
114 # d                 <;> nextstate(main 668 optree_samples.t:74) v:>,<,% ->e
115 # g                 <@> print sK ->h
116 # e                    <0> pushmark s ->f
117 # f                    <$> const(PV "bar") s ->g
118 EONT_EONT
119
120 checkOptree ( name      => '-exec sub {if shift print then,else}',
121               bcopts    => '-exec',
122               code      => sub { if (shift) { print "then" }
123                                  else       { print "else" }
124                              },
125               strip_open_hints => 1,
126               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
127 # 1  <;> nextstate(main 674 optree_samples.t:125) v:>,<,%
128 # 2  <0> shift s*
129 # 3  <|> cond_expr(other->4) K/1
130 # 4      <0> pushmark s
131 # 5      <$> const[PV "then"] s
132 # 6      <@> print sK
133 #            goto 7
134 # 8  <0> enter 
135 # 9  <;> nextstate(main 672 optree_samples.t:126) v:>,<,%
136 # a  <0> pushmark s
137 # b  <$> const[PV "else"] s
138 # c  <@> print sK
139 # d  <@> leave KP
140 # 7  <1> leavesub[1 ref] K/REFC,1
141 EOT_EOT
142 # 1  <;> nextstate(main 674 optree_samples.t:129) v:>,<,%
143 # 2  <0> shift s*
144 # 3  <|> cond_expr(other->4) K/1
145 # 4      <0> pushmark s
146 # 5      <$> const(PV "then") s
147 # 6      <@> print sK
148 #            goto 7
149 # 8  <0> enter 
150 # 9  <;> nextstate(main 672 optree_samples.t:130) v:>,<,%
151 # a  <0> pushmark s
152 # b  <$> const(PV "else") s
153 # c  <@> print sK
154 # d  <@> leave KP
155 # 7  <1> leavesub[1 ref] K/REFC,1
156 EONT_EONT
157
158 checkOptree ( name      => '-exec (see above, with my $a = shift)',
159               bcopts    => '-exec',
160               code      => sub { my $a = shift;
161                                  if ($a) { print "foo" }
162                                  else    { print "bar" }
163                              },
164               strip_open_hints => 1,
165               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
166 # 1  <;> nextstate(main 675 optree_samples.t:165) v:>,<,%
167 # 2  <0> shift s*
168 # 3  <0> padsv[$a:675,679] sRM*/LVINTRO
169 # 4  <2> sassign vKS/2
170 # 5  <;> nextstate(main 679 optree_samples.t:166) v:>,<,%
171 # 6  <0> padsv[$a:675,679] s
172 # 7  <|> cond_expr(other->8) K/1
173 # 8      <0> pushmark s
174 # 9      <$> const[PV "foo"] s
175 # a      <@> print sK
176 #            goto b
177 # c  <0> enter 
178 # d  <;> nextstate(main 677 optree_samples.t:167) v:>,<,%
179 # e  <0> pushmark s
180 # f  <$> const[PV "bar"] s
181 # g  <@> print sK
182 # h  <@> leave KP
183 # b  <1> leavesub[1 ref] K/REFC,1
184 EOT_EOT
185 # 1  <;> nextstate(main 675 optree_samples.t:171) v:>,<,%
186 # 2  <0> shift s*
187 # 3  <0> padsv[$a:675,679] sRM*/LVINTRO
188 # 4  <2> sassign vKS/2
189 # 5  <;> nextstate(main 679 optree_samples.t:172) v:>,<,%
190 # 6  <0> padsv[$a:675,679] s
191 # 7  <|> cond_expr(other->8) K/1
192 # 8      <0> pushmark s
193 # 9      <$> const(PV "foo") s
194 # a      <@> print sK
195 #            goto b
196 # c  <0> enter 
197 # d  <;> nextstate(main 677 optree_samples.t:173) v:>,<,%
198 # e  <0> pushmark s
199 # f  <$> const(PV "bar") s
200 # g  <@> print sK
201 # h  <@> leave KP
202 # b  <1> leavesub[1 ref] K/REFC,1
203 EONT_EONT
204
205 checkOptree ( name      => '-exec sub { print (shift) ? "foo" : "bar" }',
206               code      => sub { print (shift) ? "foo" : "bar" },
207               bcopts    => '-exec',
208               strip_open_hints => 1,
209               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
210 # 1  <;> nextstate(main 680 optree_samples.t:213) v:>,<,%
211 # 2  <0> pushmark s
212 # 3  <0> shift s*
213 # 4  <@> print sK
214 # 5  <|> cond_expr(other->6) K/1
215 # 6      <$> const[PV "foo"] s
216 #            goto 7
217 # 8  <$> const[PV "bar"] s
218 # 7  <1> leavesub[1 ref] K/REFC,1
219 EOT_EOT
220 # 1  <;> nextstate(main 680 optree_samples.t:221) v:>,<,%
221 # 2  <0> pushmark s
222 # 3  <0> shift s*
223 # 4  <@> print sK
224 # 5  <|> cond_expr(other->6) K/1
225 # 6      <$> const(PV "foo") s
226 #            goto 7
227 # 8  <$> const(PV "bar") s
228 # 7  <1> leavesub[1 ref] K/REFC,1
229 EONT_EONT
230
231 pass ("FOREACH");
232
233 checkOptree ( name      => '-exec sub { foreach (1..10) {print "foo $_"} }',
234               code      => sub { foreach (1..10) {print "foo $_"} },
235               bcopts    => '-exec',
236               strip_open_hints => 1,
237               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
238 # 1  <;> nextstate(main 443 optree.t:158) v:>,<,%
239 # 2  <0> pushmark s
240 # 3  <$> const[IV 1] s
241 # 4  <$> const[IV 10] s
242 # 5  <#> gv[*_] s
243 # 6  <{> enteriter(next->d last->g redo->7) lKS/8
244 # e  <0> iter s
245 # f  <|> and(other->7) K/1
246 # 7      <;> nextstate(main 442 optree.t:158) v:>,<,%
247 # 8      <0> pushmark s
248 # 9      <$> const[PV "foo "] s
249 # a      <#> gvsv[*_] s
250 # b      <2> concat[t4] sK/2
251 # c      <@> print vK
252 # d      <0> unstack s
253 #            goto e
254 # g  <2> leaveloop K/2
255 # h  <1> leavesub[1 ref] K/REFC,1
256 EOT_EOT
257 # 1  <;> nextstate(main 444 optree_samples.t:182) v:>,<,%
258 # 2  <0> pushmark s
259 # 3  <$> const(IV 1) s
260 # 4  <$> const(IV 10) s
261 # 5  <$> gv(*_) s
262 # 6  <{> enteriter(next->d last->g redo->7) lKS/8
263 # e  <0> iter s
264 # f  <|> and(other->7) K/1
265 # 7      <;> nextstate(main 443 optree_samples.t:182) v:>,<,%
266 # 8      <0> pushmark s
267 # 9      <$> const(PV "foo ") s
268 # a      <$> gvsv(*_) s
269 # b      <2> concat[t3] sK/2
270 # c      <@> print vK
271 # d      <0> unstack s
272 #            goto e
273 # g  <2> leaveloop K/2
274 # h  <1> leavesub[1 ref] K/REFC,1
275 EONT_EONT
276
277 checkOptree ( name      => '-basic sub { print "foo $_" foreach (1..10) }',
278               code      => sub { print "foo $_" foreach (1..10) }, 
279               bcopts    => '-basic',
280               strip_open_hints => 1,
281               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
282 # g  <1> leavesub[1 ref] K/REFC,1 ->(end)
283 # -     <@> lineseq KP ->g
284 # 1        <;> nextstate(main 445 optree.t:167) v:>,<,% ->2
285 # f        <2> leaveloop K/2 ->g
286 # 6           <{> enteriter(next->c last->f redo->7) lKS/8 ->d
287 # -              <0> ex-pushmark s ->2
288 # -              <1> ex-list lK ->5
289 # 2                 <0> pushmark s ->3
290 # 3                 <$> const[IV 1] s ->4
291 # 4                 <$> const[IV 10] s ->5
292 # 5              <#> gv[*_] s ->6
293 # -           <1> null K/1 ->f
294 # e              <|> and(other->7) K/1 ->f
295 # d                 <0> iter s ->e
296 # -                 <@> lineseq sK ->-
297 # b                    <@> print vK ->c
298 # 7                       <0> pushmark s ->8
299 # -                       <1> ex-stringify sK/1 ->b
300 # -                          <0> ex-pushmark s ->8
301 # a                          <2> concat[t2] sK/2 ->b
302 # 8                             <$> const[PV "foo "] s ->9
303 # -                             <1> ex-rv2sv sK/1 ->a
304 # 9                                <#> gvsv[*_] s ->a
305 # c                    <0> unstack s ->d
306 EOT_EOT
307 # g  <1> leavesub[1 ref] K/REFC,1 ->(end)
308 # -     <@> lineseq KP ->g
309 # 1        <;> nextstate(main 446 optree_samples.t:192) v:>,<,% ->2
310 # f        <2> leaveloop K/2 ->g
311 # 6           <{> enteriter(next->c last->f redo->7) lKS/8 ->d
312 # -              <0> ex-pushmark s ->2
313 # -              <1> ex-list lK ->5
314 # 2                 <0> pushmark s ->3
315 # 3                 <$> const(IV 1) s ->4
316 # 4                 <$> const(IV 10) s ->5
317 # 5              <$> gv(*_) s ->6
318 # -           <1> null K/1 ->f
319 # e              <|> and(other->7) K/1 ->f
320 # d                 <0> iter s ->e
321 # -                 <@> lineseq sK ->-
322 # b                    <@> print vK ->c
323 # 7                       <0> pushmark s ->8
324 # -                       <1> ex-stringify sK/1 ->b
325 # -                          <0> ex-pushmark s ->8
326 # a                          <2> concat[t1] sK/2 ->b
327 # 8                             <$> const(PV "foo ") s ->9
328 # -                             <1> ex-rv2sv sK/1 ->a
329 # 9                                <$> gvsv(*_) s ->a
330 # c                    <0> unstack s ->d
331 EONT_EONT
332
333 checkOptree ( name      => '-exec -e foreach (1..10) {print qq{foo $_}}',
334               prog      => 'foreach (1..10) {print qq{foo $_}}',
335               bcopts    => '-exec',
336               strip_open_hints => 1,
337               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
338 # 1  <0> enter 
339 # 2  <;> nextstate(main 2 -e:1) v:>,<,%,{
340 # 3  <0> pushmark s
341 # 4  <$> const[IV 1] s
342 # 5  <$> const[IV 10] s
343 # 6  <#> gv[*_] s
344 # 7  <{> enteriter(next->e last->h redo->8) lKS/8
345 # f  <0> iter s
346 # g  <|> and(other->8) vK/1
347 # 8      <;> nextstate(main 1 -e:1) v:>,<,%
348 # 9      <0> pushmark s
349 # a      <$> const[PV "foo "] s
350 # b      <#> gvsv[*_] s
351 # c      <2> concat[t4] sK/2
352 # d      <@> print vK
353 # e      <0> unstack v
354 #            goto f
355 # h  <2> leaveloop vK/2
356 # i  <@> leave[1 ref] vKP/REFC
357 EOT_EOT
358 # 1  <0> enter 
359 # 2  <;> nextstate(main 2 -e:1) v:>,<,%,{
360 # 3  <0> pushmark s
361 # 4  <$> const(IV 1) s
362 # 5  <$> const(IV 10) s
363 # 6  <$> gv(*_) s
364 # 7  <{> enteriter(next->e last->h redo->8) lKS/8
365 # f  <0> iter s
366 # g  <|> and(other->8) vK/1
367 # 8      <;> nextstate(main 1 -e:1) v:>,<,%
368 # 9      <0> pushmark s
369 # a      <$> const(PV "foo ") s
370 # b      <$> gvsv(*_) s
371 # c      <2> concat[t3] sK/2
372 # d      <@> print vK
373 # e      <0> unstack v
374 #            goto f
375 # h  <2> leaveloop vK/2
376 # i  <@> leave[1 ref] vKP/REFC
377 EONT_EONT
378
379 checkOptree ( name      => '-exec sub { print "foo $_" foreach (1..10) }',
380               code      => sub { print "foo $_" foreach (1..10) }, 
381               bcopts    => '-exec',
382               strip_open_hints => 1,
383               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
384 # 1  <;> nextstate(main 445 optree.t:167) v:>,<,%
385 # 2  <0> pushmark s
386 # 3  <$> const[IV 1] s
387 # 4  <$> const[IV 10] s
388 # 5  <#> gv[*_] s
389 # 6  <{> enteriter(next->c last->f redo->7) lKS/8
390 # d  <0> iter s
391 # e  <|> and(other->7) K/1
392 # 7      <0> pushmark s
393 # 8      <$> const[PV "foo "] s
394 # 9      <#> gvsv[*_] s
395 # a      <2> concat[t2] sK/2
396 # b      <@> print vK
397 # c      <0> unstack s
398 #            goto d
399 # f  <2> leaveloop K/2
400 # g  <1> leavesub[1 ref] K/REFC,1
401 EOT_EOT
402 # 1  <;> nextstate(main 447 optree_samples.t:252) v:>,<,%
403 # 2  <0> pushmark s
404 # 3  <$> const(IV 1) s
405 # 4  <$> const(IV 10) s
406 # 5  <$> gv(*_) s
407 # 6  <{> enteriter(next->c last->f redo->7) lKS/8
408 # d  <0> iter s
409 # e  <|> and(other->7) K/1
410 # 7      <0> pushmark s
411 # 8      <$> const(PV "foo ") s
412 # 9      <$> gvsv(*_) s
413 # a      <2> concat[t1] sK/2
414 # b      <@> print vK
415 # c      <0> unstack s
416 #            goto d
417 # f  <2> leaveloop K/2
418 # g  <1> leavesub[1 ref] K/REFC,1
419 EONT_EONT
420
421 pass("GREP: SAMPLES FROM PERLDOC -F GREP");
422
423 checkOptree ( name      => '@foo = grep(!/^\#/, @bar)',
424               code      => '@foo = grep(!/^\#/, @bar)',
425               bcopts    => '-exec',
426               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
427 # 1  <;> nextstate(main 496 (eval 20):1) v:{
428 # 2  <0> pushmark s
429 # 3  <0> pushmark s
430 # 4  <#> gv[*bar] s
431 # 5  <1> rv2av[t4] lKM/1
432 # 6  <@> grepstart lK
433 # 7  <|> grepwhile(other->8)[t5] lK
434 # 8      </> match(/"^#"/) s/RTIME
435 # 9      <1> not sK/1
436 #            goto 7
437 # a  <0> pushmark s
438 # b  <#> gv[*foo] s
439 # c  <1> rv2av[t2] lKRM*/1
440 # d  <2> aassign[t6] KS/COMMON
441 # e  <1> leavesub[1 ref] K/REFC,1
442 EOT_EOT
443 # 1  <;> nextstate(main 496 (eval 20):1) v:{
444 # 2  <0> pushmark s
445 # 3  <0> pushmark s
446 # 4  <$> gv(*bar) s
447 # 5  <1> rv2av[t2] lKM/1
448 # 6  <@> grepstart lK
449 # 7  <|> grepwhile(other->8)[t3] lK
450 # 8      </> match(/"^\\#"/) s/RTIME
451 # 9      <1> not sK/1
452 #            goto 7
453 # a  <0> pushmark s
454 # b  <$> gv(*foo) s
455 # c  <1> rv2av[t1] lKRM*/1
456 # d  <2> aassign[t4] KS/COMMON
457 # e  <1> leavesub[1 ref] K/REFC,1
458 EONT_EONT
459
460
461 pass("MAP: SAMPLES FROM PERLDOC -F MAP");
462
463 checkOptree ( name      => '%h = map { getkey($_) => $_ } @a',
464               code      => '%h = map { getkey($_) => $_ } @a',
465               bcopts    => '-exec',
466               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
467 # 1  <;> nextstate(main 501 (eval 22):1) v:{
468 # 2  <0> pushmark s
469 # 3  <0> pushmark s
470 # 4  <#> gv[*a] s
471 # 5  <1> rv2av[t8] lKM/1
472 # 6  <@> mapstart lK*                 < 5.017002
473 # 6  <@> mapstart lK                  >=5.017002
474 # 7  <|> mapwhile(other->8)[t9] lK
475 # 8      <0> enter l
476 # 9      <;> nextstate(main 500 (eval 22):1) v:{
477 # a      <0> pushmark s
478 # b      <0> pushmark s
479 # c      <#> gvsv[*_] s
480 # d      <#> gv[*getkey] s/EARLYCV
481 # e      <1> entersub[t5] lKS/TARG
482 # f      <#> gvsv[*_] s
483 # g      <@> list lK
484 # h      <@> leave lKP
485 #            goto 7
486 # i  <0> pushmark s
487 # j  <#> gv[*h] s
488 # k  <1> rv2hv[t2] lKRM*/1         < 5.019006
489 # k  <1> rv2hv lKRM*/1             >=5.019006
490 # l  <2> aassign[t10] KS/COMMON
491 # m  <1> leavesub[1 ref] K/REFC,1
492 EOT_EOT
493 # 1  <;> nextstate(main 501 (eval 22):1) v:{
494 # 2  <0> pushmark s
495 # 3  <0> pushmark s
496 # 4  <$> gv(*a) s
497 # 5  <1> rv2av[t3] lKM/1
498 # 6  <@> mapstart lK*                 < 5.017002
499 # 6  <@> mapstart lK                  >=5.017002
500 # 7  <|> mapwhile(other->8)[t4] lK
501 # 8      <0> enter l
502 # 9      <;> nextstate(main 500 (eval 22):1) v:{
503 # a      <0> pushmark s
504 # b      <0> pushmark s
505 # c      <$> gvsv(*_) s
506 # d      <$> gv(*getkey) s/EARLYCV
507 # e      <1> entersub[t2] lKS/TARG
508 # f      <$> gvsv(*_) s
509 # g      <@> list lK
510 # h      <@> leave lKP
511 #            goto 7
512 # i  <0> pushmark s
513 # j  <$> gv(*h) s
514 # k  <1> rv2hv[t1] lKRM*/1         < 5.019006
515 # k  <1> rv2hv lKRM*/1             >=5.019006
516 # l  <2> aassign[t5] KS/COMMON
517 # m  <1> leavesub[1 ref] K/REFC,1
518 EONT_EONT
519
520 checkOptree ( name      => '%h=(); for $_(@a){$h{getkey($_)} = $_}',
521               code      => '%h=(); for $_(@a){$h{getkey($_)} = $_}',
522               bcopts    => '-exec',
523               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
524 # 1  <;> nextstate(main 505 (eval 24):1) v
525 # 2  <0> pushmark s
526 # 3  <0> pushmark s
527 # 4  <#> gv[*h] s
528 # 5  <1> rv2hv[t2] lKRM*/1         < 5.019006
529 # 5  <1> rv2hv lKRM*/1             >=5.019006
530 # 6  <2> aassign[t3] vKS
531 # 7  <;> nextstate(main 506 (eval 24):1) v:{
532 # 8  <0> pushmark sM
533 # 9  <#> gv[*a] s
534 # a  <1> rv2av[t6] sKRM/1
535 # b  <#> gv[*_] s
536 # c  <1> rv2gv sKRM/1
537 # d  <{> enteriter(next->o last->r redo->e) lKS/8
538 # p  <0> iter s
539 # q  <|> and(other->e) K/1
540 # e      <;> nextstate(main 505 (eval 24):1) v:{
541 # f      <#> gvsv[*_] s
542 # g      <#> gv[*h] s
543 # h      <1> rv2hv sKR/1
544 # i      <0> pushmark s
545 # j      <#> gvsv[*_] s
546 # k      <#> gv[*getkey] s/EARLYCV
547 # l      <1> entersub[t10] sKS/TARG
548 # m      <2> helem sKRM*/2
549 # n      <2> sassign vKS/2
550 # o      <0> unstack s
551 #            goto p
552 # r  <2> leaveloop KP/2
553 # s  <1> leavesub[1 ref] K/REFC,1
554 EOT_EOT
555 # 1  <;> nextstate(main 505 (eval 24):1) v
556 # 2  <0> pushmark s
557 # 3  <0> pushmark s
558 # 4  <$> gv(*h) s
559 # 5  <1> rv2hv[t1] lKRM*/1         < 5.019006
560 # 5  <1> rv2hv lKRM*/1             >=5.019006
561 # 6  <2> aassign[t2] vKS
562 # 7  <;> nextstate(main 506 (eval 24):1) v:{
563 # 8  <0> pushmark sM
564 # 9  <$> gv(*a) s
565 # a  <1> rv2av[t3] sKRM/1
566 # b  <$> gv(*_) s
567 # c  <1> rv2gv sKRM/1
568 # d  <{> enteriter(next->o last->r redo->e) lKS/8
569 # p  <0> iter s
570 # q  <|> and(other->e) K/1
571 # e      <;> nextstate(main 505 (eval 24):1) v:{
572 # f      <$> gvsv(*_) s
573 # g      <$> gv(*h) s
574 # h      <1> rv2hv sKR/1
575 # i      <0> pushmark s
576 # j      <$> gvsv(*_) s
577 # k      <$> gv(*getkey) s/EARLYCV
578 # l      <1> entersub[t4] sKS/TARG
579 # m      <2> helem sKRM*/2
580 # n      <2> sassign vKS/2
581 # o      <0> unstack s
582 #            goto p
583 # r  <2> leaveloop KP/2
584 # s  <1> leavesub[1 ref] K/REFC,1
585 EONT_EONT
586
587 checkOptree ( name      => 'map $_+42, 10..20',
588               code      => 'map $_+42, 10..20',
589               bcopts    => '-exec',
590               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
591 # 1  <;> nextstate(main 497 (eval 20):1) v
592 # 2  <0> pushmark s
593 # 3  <$> const[AV ] s
594 # 4  <1> rv2av lKPM/1
595 # 5  <@> mapstart K
596 # 6  <|> mapwhile(other->7)[t5] K
597 # 7      <#> gvsv[*_] s
598 # 8      <$> const[IV 42] s
599 # 9      <2> add[t2] sK/2
600 #            goto 6
601 # a  <1> leavesub[1 ref] K/REFC,1
602 EOT_EOT
603 # 1  <;> nextstate(main 511 (eval 26):1) v
604 # 2  <0> pushmark s
605 # 3  <$> const(AV ) s
606 # 4  <1> rv2av lKPM/1
607 # 5  <@> mapstart K
608 # 6  <|> mapwhile(other->7)[t4] K
609 # 7      <$> gvsv(*_) s
610 # 8      <$> const(IV 42) s
611 # 9      <2> add[t1] sK/2
612 #            goto 6
613 # a  <1> leavesub[1 ref] K/REFC,1
614 EONT_EONT
615
616 pass("CONSTANTS");
617
618 checkOptree ( name      => '-e use constant j => qq{junk}; print j',
619               prog      => 'use constant j => qq{junk}; print j',
620               bcopts    => '-exec',
621               strip_open_hints => 1,
622               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
623 # 1  <0> enter 
624 # 2  <;> nextstate(main 71 -e:1) v:>,<,%,{
625 # 3  <0> pushmark s
626 # 4  <$> const[PV "junk"] s*      < 5.017002
627 # 4  <$> const[PV "junk"] s*/FOLD >=5.017002
628 # 5  <@> print vK
629 # 6  <@> leave[1 ref] vKP/REFC
630 EOT_EOT
631 # 1  <0> enter 
632 # 2  <;> nextstate(main 71 -e:1) v:>,<,%,{
633 # 3  <0> pushmark s
634 # 4  <$> const(PV "junk") s*      < 5.017002
635 # 4  <$> const(PV "junk") s*/FOLD >=5.017002
636 # 5  <@> print vK
637 # 6  <@> leave[1 ref] vKP/REFC
638 EONT_EONT
639
640 pass("rpeep - return \$x at end of sub");
641
642 checkOptree ( name      => '-exec sub { return 1 }',
643               code      => sub { return 1 },
644               bcopts    => '-exec',
645               strip_open_hints => 1,
646               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
647 # 1  <;> nextstate(main 1 -e:1) v:>,<,%
648 # 2  <$> const[IV 1] s
649 # 3  <1> leavesub[1 ref] K/REFC,1
650 EOT_EOT
651 # 1  <;> nextstate(main 1 -e:1) v:>,<,%
652 # 2  <$> const(IV 1) s
653 # 3  <1> leavesub[1 ref] K/REFC,1
654 EONT_EONT
655
656 pass("rpeep - if ($a || $b)");
657
658 checkOptree ( name      => 'if ($a || $b) { } return 1',
659               code      => 'if ($a || $b) { } return 1',
660               bcopts    => '-exec',
661               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
662 # 1  <;> nextstate(main 997 (eval 15):1) v
663 # 2  <#> gvsv[*a] s
664 # 3  <|> or(other->4) sK/1
665 # 4      <#> gvsv[*b] s
666 # 5      <|> and(other->6) vK/1
667 # 6  <0> stub v
668 # 7  <;> nextstate(main 997 (eval 15):1) v
669 # 8  <$> const[IV 1] s
670 # 9  <1> leavesub[1 ref] K/REFC,1
671 EOT_EOT
672 # 1  <;> nextstate(main 997 (eval 15):1) v
673 # 2  <$> gvsv(*a) s
674 # 3  <|> or(other->4) sK/1
675 # 4      <$> gvsv(*b) s
676 # 5      <|> and(other->6) vK/1
677 # 6  <0> stub v
678 # 7  <;> nextstate(main 3 (eval 3):1) v
679 # 8  <$> const(IV 1) s
680 # 9  <1> leavesub[1 ref] K/REFC,1
681 EONT_EONT
682
683 pass("rpeep - unless ($a && $b)");
684
685 checkOptree ( name      => 'unless ($a && $b) { } return 1',
686               code      => 'unless ($a && $b) { } return 1',
687               bcopts    => '-exec',
688               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
689 # 1  <;> nextstate(main 997 (eval 15):1) v
690 # 2  <#> gvsv[*a] s
691 # 3  <|> and(other->4) sK/1
692 # 4      <#> gvsv[*b] s
693 # 5      <|> or(other->6) vK/1
694 # 6  <0> stub v
695 # 7  <;> nextstate(main 997 (eval 15):1) v
696 # 8  <$> const[IV 1] s
697 # 9  <1> leavesub[1 ref] K/REFC,1
698 EOT_EOT
699 # 1  <;> nextstate(main 997 (eval 15):1) v
700 # 2  <$> gvsv(*a) s
701 # 3  <|> and(other->4) sK/1
702 # 4      <$> gvsv(*b) s
703 # 5      <|> or(other->6) vK/1
704 # 6  <0> stub v
705 # 7  <;> nextstate(main 3 (eval 3):1) v
706 # 8  <$> const(IV 1) s
707 # 9  <1> leavesub[1 ref] K/REFC,1
708 EONT_EONT
709
710 pass("rpeep - my $a; my @b; my %c; print 'f'");
711
712 checkOptree ( name      => 'my $a; my @b; my %c; return 1',
713               code      => 'my $a; my @b; my %c; return 1',
714               bcopts    => '-exec',
715               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
716 # 1  <;> nextstate(main 991 (eval 17):1) v
717 # 2  <0> padrange[$a:991,994; @b:992,994; %c:993,994] vM/LVINTRO,3
718 # 3  <;> nextstate(main 994 (eval 17):1) v:{
719 # 4  <$> const[IV 1] s
720 # 5  <1> leavesub[1 ref] K/REFC,1
721 EOT_EOT
722 # 1  <;> nextstate(main 991 (eval 17):1) v
723 # 2  <0> padrange[$a:991,994; @b:992,994; %c:993,994] vM/LVINTRO,3
724 # 3  <;> nextstate(main 994 (eval 17):1) v:{
725 # 4  <$> const(IV 1) s
726 # 5  <1> leavesub[1 ref] K/REFC,1
727 EONT_EONT
728
729 __END__
730
731 #######################################################################
732
733 checkOptree ( name      => '-exec sub a { print (shift) ? "foo" : "bar" }',
734               code      => sub { print (shift) ? "foo" : "bar" },
735               bcopts    => '-exec',
736               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
737    insert threaded reference here
738 EOT_EOT
739    insert non-threaded reference here
740 EONT_EONT
741