6 @INC = ('.', '../lib', '../ext/B/t');
12 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13 print "1..0 # Skip -- Perl configured without B module\n";
16 if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
18 "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
21 if (!$Config::Config{useperlio}) {
22 print "1..0 # Skip -- need perlio to walk the optree\n";
26 print "1..0 # Skip -- TODO - provide golden result regexps for 5.8\n";
38 # examples shamelessly snatched from perldoc -f map
44 # chunk: # translates a list of numbers to the corresponding characters.
45 @chars = map(chr, @nums);
49 checkOptree(note => q{},
51 code => q{@chars = map(chr, @nums); },
52 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
53 # 1 <;> nextstate(main 475 (eval 10):1) v
57 # 5 <1> rv2av[t7] lKM/1
59 # 7 <|> mapwhile(other->8)[t8] lK
65 # c <1> rv2av[t2] lKRM*/1
66 # d <2> aassign[t9] KS/COMMON
67 # e <1> leavesub[1 ref] K/REFC,1
69 # 1 <;> nextstate(main 559 (eval 15):1) v
73 # 5 <1> rv2av[t4] lKM/1
75 # 7 <|> mapwhile(other->8)[t5] lK
81 # c <1> rv2av[t1] lKRM*/1
82 # d <2> aassign[t6] KS/COMMON
83 # e <1> leavesub[1 ref] K/REFC,1
89 # chunk: %hash = map { getkey($_) => $_ } @array;
93 checkOptree(note => q{},
95 code => q{%hash = map { getkey($_) => $_ } @array; },
96 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
97 # 1 <;> nextstate(main 476 (eval 10):1) v
101 # 5 <1> rv2av[t8] lKM/1
103 # 7 <|> mapwhile(other->8)[t9] lK
105 # 9 <;> nextstate(main 475 (eval 10):1) v
109 # d <#> gv[*getkey] s/EARLYCV
110 # e <1> entersub[t5] lKS/TARG,1
117 # k <1> rv2hv[t2] lKRM*/1
118 # l <2> aassign[t10] KS/COMMON
119 # m <1> leavesub[1 ref] K/REFC,1
121 # 1 <;> nextstate(main 560 (eval 15):1) v
125 # 5 <1> rv2av[t3] lKM/1
127 # 7 <|> mapwhile(other->8)[t4] lK
129 # 9 <;> nextstate(main 559 (eval 15):1) v
133 # d <$> gv(*getkey) s/EARLYCV
134 # e <1> entersub[t2] lKS/TARG,1
141 # k <1> rv2hv[t1] lKRM*/1
142 # l <2> aassign[t5] KS/COMMON
143 # m <1> leavesub[1 ref] K/REFC,1
151 foreach $_ (@array) {
152 $hash{getkey($_)} = $_;
158 checkOptree(note => q{},
160 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } },
161 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
162 # 1 <;> nextstate(main 478 (eval 10):1) v
163 # 2 <{> enterloop(next->u last->u redo->3)
164 # 3 <;> nextstate(main 475 (eval 10):1) v
168 # 7 <1> rv2hv[t2] lKRM*/1
169 # 8 <2> aassign[t3] vKS
170 # 9 <;> nextstate(main 476 (eval 10):1) v
173 # c <1> rv2av[t6] sKRM/1
176 # f <{> enteriter(next->q last->t redo->g) lKS
178 # s <|> and(other->g) K/1
179 # g <;> nextstate(main 475 (eval 10):1) v
185 # m <#> gv[*getkey] s/EARLYCV
186 # n <1> entersub[t10] sKS/TARG,1
187 # o <2> helem sKRM*/2
188 # p <2> sassign vKS/2
191 # t <2> leaveloop K/2
192 # u <2> leaveloop K/2
193 # v <1> leavesub[1 ref] K/REFC,1
195 # 1 <;> nextstate(main 562 (eval 15):1) v
196 # 2 <{> enterloop(next->u last->u redo->3)
197 # 3 <;> nextstate(main 559 (eval 15):1) v
201 # 7 <1> rv2hv[t1] lKRM*/1
202 # 8 <2> aassign[t2] vKS
203 # 9 <;> nextstate(main 560 (eval 15):1) v
206 # c <1> rv2av[t3] sKRM/1
209 # f <{> enteriter(next->q last->t redo->g) lKS
211 # s <|> and(other->g) K/1
212 # g <;> nextstate(main 559 (eval 15):1) v
218 # m <$> gv(*getkey) s/EARLYCV
219 # n <1> entersub[t4] sKS/TARG,1
220 # o <2> helem sKRM*/2
221 # p <2> sassign vKS/2
224 # t <2> leaveloop K/2
225 # u <2> leaveloop K/2
226 # v <1> leavesub[1 ref] K/REFC,1
232 # chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong
233 %hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right
237 checkOptree(note => q{},
239 code => q{%hash = map { +"\L$_", 1 } @array; },
240 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
241 # 1 <;> nextstate(main 476 (eval 10):1) v
245 # 5 <1> rv2av[t7] lKM/1
247 # 7 <|> mapwhile(other->8)[t9] lK
251 # b <@> stringify[t5] sK/1
252 # c <$> const[IV 1] s
258 # g <1> rv2hv[t2] lKRM*/1
259 # h <2> aassign[t10] KS/COMMON
260 # i <1> leavesub[1 ref] K/REFC,1
262 # 1 <;> nextstate(main 560 (eval 15):1) v
266 # 5 <1> rv2av[t4] lKM/1
268 # 7 <|> mapwhile(other->8)[t5] lK
272 # b <@> stringify[t3] sK/1
273 # c <$> const(IV 1) s
279 # g <1> rv2hv[t1] lKRM*/1
280 # h <2> aassign[t6] KS/COMMON
281 # i <1> leavesub[1 ref] K/REFC,1
287 # chunk: %hash = map { ("\L$_", 1) } @array; # this also works
291 checkOptree(note => q{},
293 code => q{%hash = map { ("\L$_", 1) } @array; },
294 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
295 # 1 <;> nextstate(main 476 (eval 10):1) v
299 # 5 <1> rv2av[t7] lKM/1
301 # 7 <|> mapwhile(other->8)[t9] lK
305 # b <@> stringify[t5] sK/1
306 # c <$> const[IV 1] s
312 # g <1> rv2hv[t2] lKRM*/1
313 # h <2> aassign[t10] KS/COMMON
314 # i <1> leavesub[1 ref] K/REFC,1
316 # 1 <;> nextstate(main 560 (eval 15):1) v
320 # 5 <1> rv2av[t4] lKM/1
322 # 7 <|> mapwhile(other->8)[t5] lK
326 # b <@> stringify[t3] sK/1
327 # c <$> const(IV 1) s
333 # g <1> rv2hv[t1] lKRM*/1
334 # h <2> aassign[t6] KS/COMMON
335 # i <1> leavesub[1 ref] K/REFC,1
341 # chunk: %hash = map { lc($_), 1 } @array; # as does this.
345 checkOptree(note => q{},
347 code => q{%hash = map { lc($_), 1 } @array; },
348 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
349 # 1 <;> nextstate(main 476 (eval 10):1) v
353 # 5 <1> rv2av[t6] lKM/1
355 # 7 <|> mapwhile(other->8)[t8] lK
359 # b <$> const[IV 1] s
365 # f <1> rv2hv[t2] lKRM*/1
366 # g <2> aassign[t9] KS/COMMON
367 # h <1> leavesub[1 ref] K/REFC,1
369 # 1 <;> nextstate(main 589 (eval 26):1) v
373 # 5 <1> rv2av[t3] lKM/1
375 # 7 <|> mapwhile(other->8)[t4] lK
379 # b <$> const(IV 1) s
385 # f <1> rv2hv[t1] lKRM*/1
386 # g <2> aassign[t5] KS/COMMON
387 # h <1> leavesub[1 ref] K/REFC,1
393 # chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
397 checkOptree(note => q{},
399 code => q{%hash = map +( lc($_), 1 ), @array; },
400 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
401 # 1 <;> nextstate(main 475 (eval 10):1) v
405 # 5 <1> rv2av[t6] lKM/1
407 # 7 <|> mapwhile(other->8)[t7] lK
411 # b <$> const[IV 1] s
416 # f <1> rv2hv[t2] lKRM*/1
417 # g <2> aassign[t8] KS/COMMON
418 # h <1> leavesub[1 ref] K/REFC,1
420 # 1 <;> nextstate(main 593 (eval 28):1) v
424 # 5 <1> rv2av[t3] lKM/1
426 # 7 <|> mapwhile(other->8)[t4] lK
430 # b <$> const(IV 1) s
435 # f <1> rv2hv[t1] lKRM*/1
436 # g <2> aassign[t5] KS/COMMON
437 # h <1> leavesub[1 ref] K/REFC,1
443 # chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
447 checkOptree(note => q{},
449 code => q{%hash = map ( lc($_), 1 ), @array; },
450 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
451 # 1 <;> nextstate(main 475 (eval 10):1) v
455 # 5 <$> const[IV 1] sM
457 # 7 <|> mapwhile(other->8)[t5] lK
463 # c <1> rv2hv[t2] lKRM*/1
464 # d <2> aassign[t6] KS/COMMON
466 # f <1> rv2av[t8] K/1
468 # h <1> leavesub[1 ref] K/REFC,1
470 # 1 <;> nextstate(main 597 (eval 30):1) v
474 # 5 <$> const(IV 1) sM
476 # 7 <|> mapwhile(other->8)[t3] lK
482 # c <1> rv2hv[t1] lKRM*/1
483 # d <2> aassign[t4] KS/COMMON
485 # f <1> rv2av[t5] K/1
487 # h <1> leavesub[1 ref] K/REFC,1
493 # chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
497 checkOptree(note => q{},
499 code => q{@hashes = map +{ lc($_), 1 }, @array },
500 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
501 # 1 <;> nextstate(main 475 (eval 10):1) v
505 # 5 <1> rv2av[t6] lKM/1
507 # 7 <|> mapwhile(other->8)[t7] lK
511 # b <$> const[IV 1] s
512 # c <@> anonhash sKRM/1
516 # f <#> gv[*hashes] s
517 # g <1> rv2av[t2] lKRM*/1
518 # h <2> aassign[t8] KS/COMMON
519 # i <1> leavesub[1 ref] K/REFC,1
521 # 1 <;> nextstate(main 601 (eval 32):1) v
525 # 5 <1> rv2av[t3] lKM/1
527 # 7 <|> mapwhile(other->8)[t4] lK
531 # b <$> const(IV 1) s
532 # c <@> anonhash sKRM/1
536 # f <$> gv(*hashes) s
537 # g <1> rv2av[t1] lKRM*/1
538 # h <2> aassign[t5] KS/COMMON
539 # i <1> leavesub[1 ref] K/REFC,1