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