5 @INC = qw(../lib ../ext/B/t);
7 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
8 print "1..0 # Skip -- Perl configured without B module\n";
11 if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
13 "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
16 if (!$Config::Config{useperlio}) {
17 print "1..0 # Skip -- need perlio to walk the optree\n";
21 print "1..0 # Skip -- TODO - provide golden result regexps for 5.8\n";
33 # examples shamelessly snatched from perldoc -f map
39 # chunk: # translates a list of numbers to the corresponding characters.
40 @chars = map(chr, @nums);
44 checkOptree(note => q{},
46 code => q{@chars = map(chr, @nums); },
47 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
48 # 1 <;> nextstate(main 475 (eval 10):1) v
52 # 5 <1> rv2av[t7] lKM/1
54 # 7 <|> mapwhile(other->8)[t8] lK
60 # c <1> rv2av[t2] lKRM*/1
61 # d <2> aassign[t9] KS/COMMON
62 # e <1> leavesub[1 ref] K/REFC,1
64 # 1 <;> nextstate(main 559 (eval 15):1) v
68 # 5 <1> rv2av[t4] lKM/1
70 # 7 <|> mapwhile(other->8)[t5] lK
76 # c <1> rv2av[t1] lKRM*/1
77 # d <2> aassign[t6] KS/COMMON
78 # e <1> leavesub[1 ref] K/REFC,1
84 # chunk: %hash = map { getkey($_) => $_ } @array;
88 checkOptree(note => q{},
90 code => q{%hash = map { getkey($_) => $_ } @array; },
91 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
92 # 1 <;> nextstate(main 476 (eval 10):1) v
96 # 5 <1> rv2av[t8] lKM/1
98 # 7 <|> mapwhile(other->8)[t9] lK
100 # 9 <;> nextstate(main 475 (eval 10):1) v
104 # d <#> gv[*getkey] s/EARLYCV
105 # e <1> entersub[t5] lKS/TARG,1
112 # k <1> rv2hv[t2] lKRM*/1
113 # l <2> aassign[t10] KS/COMMON
114 # m <1> leavesub[1 ref] K/REFC,1
116 # 1 <;> nextstate(main 560 (eval 15):1) v
120 # 5 <1> rv2av[t3] lKM/1
122 # 7 <|> mapwhile(other->8)[t4] lK
124 # 9 <;> nextstate(main 559 (eval 15):1) v
128 # d <$> gv(*getkey) s/EARLYCV
129 # e <1> entersub[t2] lKS/TARG,1
136 # k <1> rv2hv[t1] lKRM*/1
137 # l <2> aassign[t5] KS/COMMON
138 # m <1> leavesub[1 ref] K/REFC,1
146 foreach $_ (@array) {
147 $hash{getkey($_)} = $_;
153 checkOptree(note => q{},
155 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } },
156 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
157 # 1 <;> nextstate(main 478 (eval 10):1) v
158 # 2 <{> enterloop(next->u last->u redo->3)
159 # 3 <;> nextstate(main 475 (eval 10):1) v
163 # 7 <1> rv2hv[t2] lKRM*/1
164 # 8 <2> aassign[t3] vKS
165 # 9 <;> nextstate(main 476 (eval 10):1) v
168 # c <1> rv2av[t6] sKRM/1
171 # f <{> enteriter(next->q last->t redo->g) lKS
173 # s <|> and(other->g) K/1
174 # g <;> nextstate(main 475 (eval 10):1) v
180 # m <#> gv[*getkey] s/EARLYCV
181 # n <1> entersub[t10] sKS/TARG,1
182 # o <2> helem sKRM*/2
183 # p <2> sassign vKS/2
186 # t <2> leaveloop K/2
187 # u <2> leaveloop K/2
188 # v <1> leavesub[1 ref] K/REFC,1
190 # 1 <;> nextstate(main 562 (eval 15):1) v
191 # 2 <{> enterloop(next->u last->u redo->3)
192 # 3 <;> nextstate(main 559 (eval 15):1) v
196 # 7 <1> rv2hv[t1] lKRM*/1
197 # 8 <2> aassign[t2] vKS
198 # 9 <;> nextstate(main 560 (eval 15):1) v
201 # c <1> rv2av[t3] sKRM/1
204 # f <{> enteriter(next->q last->t redo->g) lKS
206 # s <|> and(other->g) K/1
207 # g <;> nextstate(main 559 (eval 15):1) v
213 # m <$> gv(*getkey) s/EARLYCV
214 # n <1> entersub[t4] sKS/TARG,1
215 # o <2> helem sKRM*/2
216 # p <2> sassign vKS/2
219 # t <2> leaveloop K/2
220 # u <2> leaveloop K/2
221 # v <1> leavesub[1 ref] K/REFC,1
227 # chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong
228 %hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right
232 checkOptree(note => q{},
234 code => q{%hash = map { +"\L$_", 1 } @array; },
235 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
236 # 1 <;> nextstate(main 476 (eval 10):1) v
240 # 5 <1> rv2av[t7] lKM/1
242 # 7 <|> mapwhile(other->8)[t9] lK
246 # b <@> stringify[t5] sK/1
247 # c <$> const[IV 1] s
253 # g <1> rv2hv[t2] lKRM*/1
254 # h <2> aassign[t10] KS/COMMON
255 # i <1> leavesub[1 ref] K/REFC,1
257 # 1 <;> nextstate(main 560 (eval 15):1) v
261 # 5 <1> rv2av[t4] lKM/1
263 # 7 <|> mapwhile(other->8)[t5] lK
267 # b <@> stringify[t3] sK/1
268 # c <$> const(IV 1) s
274 # g <1> rv2hv[t1] lKRM*/1
275 # h <2> aassign[t6] KS/COMMON
276 # i <1> leavesub[1 ref] K/REFC,1
282 # chunk: %hash = map { ("\L$_", 1) } @array; # this also works
286 checkOptree(note => q{},
288 code => q{%hash = map { ("\L$_", 1) } @array; },
289 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
290 # 1 <;> nextstate(main 476 (eval 10):1) v
294 # 5 <1> rv2av[t7] lKM/1
296 # 7 <|> mapwhile(other->8)[t9] lK
300 # b <@> stringify[t5] sK/1
301 # c <$> const[IV 1] s
307 # g <1> rv2hv[t2] lKRM*/1
308 # h <2> aassign[t10] KS/COMMON
309 # i <1> leavesub[1 ref] K/REFC,1
311 # 1 <;> nextstate(main 560 (eval 15):1) v
315 # 5 <1> rv2av[t4] lKM/1
317 # 7 <|> mapwhile(other->8)[t5] lK
321 # b <@> stringify[t3] sK/1
322 # c <$> const(IV 1) s
328 # g <1> rv2hv[t1] lKRM*/1
329 # h <2> aassign[t6] KS/COMMON
330 # i <1> leavesub[1 ref] K/REFC,1
336 # chunk: %hash = map { lc($_), 1 } @array; # as does this.
340 checkOptree(note => q{},
342 code => q{%hash = map { lc($_), 1 } @array; },
343 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
344 # 1 <;> nextstate(main 476 (eval 10):1) v
348 # 5 <1> rv2av[t6] lKM/1
350 # 7 <|> mapwhile(other->8)[t8] lK
354 # b <$> const[IV 1] s
360 # f <1> rv2hv[t2] lKRM*/1
361 # g <2> aassign[t9] KS/COMMON
362 # h <1> leavesub[1 ref] K/REFC,1
364 # 1 <;> nextstate(main 589 (eval 26):1) v
368 # 5 <1> rv2av[t3] lKM/1
370 # 7 <|> mapwhile(other->8)[t4] lK
374 # b <$> const(IV 1) s
380 # f <1> rv2hv[t1] lKRM*/1
381 # g <2> aassign[t5] KS/COMMON
382 # h <1> leavesub[1 ref] K/REFC,1
388 # chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
392 checkOptree(note => q{},
394 code => q{%hash = map +( lc($_), 1 ), @array; },
395 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
396 # 1 <;> nextstate(main 475 (eval 10):1) v
400 # 5 <1> rv2av[t6] lKM/1
402 # 7 <|> mapwhile(other->8)[t7] lK
406 # b <$> const[IV 1] s
411 # f <1> rv2hv[t2] lKRM*/1
412 # g <2> aassign[t8] KS/COMMON
413 # h <1> leavesub[1 ref] K/REFC,1
415 # 1 <;> nextstate(main 593 (eval 28):1) v
419 # 5 <1> rv2av[t3] lKM/1
421 # 7 <|> mapwhile(other->8)[t4] lK
425 # b <$> const(IV 1) s
430 # f <1> rv2hv[t1] lKRM*/1
431 # g <2> aassign[t5] KS/COMMON
432 # h <1> leavesub[1 ref] K/REFC,1
438 # chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
442 checkOptree(note => q{},
444 code => q{%hash = map ( lc($_), 1 ), @array; },
445 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
446 # 1 <;> nextstate(main 475 (eval 10):1) v
450 # 5 <$> const[IV 1] sM
452 # 7 <|> mapwhile(other->8)[t5] lK
458 # c <1> rv2hv[t2] lKRM*/1
459 # d <2> aassign[t6] KS/COMMON
461 # f <1> rv2av[t8] K/1
463 # h <1> leavesub[1 ref] K/REFC,1
465 # 1 <;> nextstate(main 597 (eval 30):1) v
469 # 5 <$> const(IV 1) sM
471 # 7 <|> mapwhile(other->8)[t3] lK
477 # c <1> rv2hv[t1] lKRM*/1
478 # d <2> aassign[t4] KS/COMMON
480 # f <1> rv2av[t5] K/1
482 # h <1> leavesub[1 ref] K/REFC,1
488 # chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
492 checkOptree(note => q{},
494 code => q{@hashes = map +{ lc($_), 1 }, @array },
495 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
496 # 1 <;> nextstate(main 475 (eval 10):1) v
500 # 5 <1> rv2av[t6] lKM/1
502 # 7 <|> mapwhile(other->8)[t7] lK
506 # b <$> const[IV 1] s
507 # c <@> anonhash sKRM/1
511 # f <#> gv[*hashes] s
512 # g <1> rv2av[t2] lKRM*/1
513 # h <2> aassign[t8] KS/COMMON
514 # i <1> leavesub[1 ref] K/REFC,1
516 # 1 <;> nextstate(main 601 (eval 32):1) v
520 # 5 <1> rv2av[t3] lKM/1
522 # 7 <|> mapwhile(other->8)[t4] lK
526 # b <$> const(IV 1) s
527 # c <@> anonhash sKRM/1
531 # f <$> gv(*hashes) s
532 # g <1> rv2av[t1] lKRM*/1
533 # h <2> aassign[t5] KS/COMMON
534 # i <1> leavesub[1 ref] K/REFC,1