6 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7 print "1..0 # Skip -- Perl configured without B module\n";
10 if (!$Config::Config{useperlio}) {
11 print "1..0 # Skip -- need perlio to walk the optree\n";
21 Code test snippets here are adapted from `perldoc -f map`
23 Due to a bleadperl optimization (Dave Mitchell, circa may 04), the
24 (map|grep)(start|while) opcodes have different flags in 5.9, their
25 private flags /1, /2 are gone in blead (for the cases covered)
27 When the optree stuff was integrated into 5.8.6, these tests failed,
28 and were todo'd. They're now done, by version-specific tweaking in
29 mkCheckRex(), therefore the skip is removed too.
34 # examples shamelessly snatched from perldoc -f map
40 # chunk: # translates a list of numbers to the corresponding characters.
41 @chars = map(chr, @nums);
45 checkOptree(note => q{},
47 code => q{@chars = map(chr, @nums); },
48 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
49 # 1 <;> nextstate(main 475 (eval 10):1) v
53 # 5 <1> rv2av[t7] lKM/1
55 # 7 <|> mapwhile(other->8)[t8] lK
61 # c <1> rv2av[t2] lKRM*/1
62 # d <2> aassign[t9] KS/COMMON
63 # e <1> leavesub[1 ref] K/REFC,1
65 # 1 <;> nextstate(main 559 (eval 15):1) v
69 # 5 <1> rv2av[t4] lKM/1
71 # 7 <|> mapwhile(other->8)[t5] lK
77 # c <1> rv2av[t1] lKRM*/1
78 # d <2> aassign[t6] KS/COMMON
79 # e <1> leavesub[1 ref] K/REFC,1
85 # chunk: %hash = map { getkey($_) => $_ } @array;
89 checkOptree(note => q{},
91 code => q{%hash = map { getkey($_) => $_ } @array; },
92 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
93 # 1 <;> nextstate(main 476 (eval 10):1) v:{
97 # 5 <1> rv2av[t8] lKM/1
98 # 6 <@> mapstart lK* < 5.017002
99 # 6 <@> mapstart lK >=5.017002
100 # 7 <|> mapwhile(other->8)[t9] lK
102 # 9 <;> nextstate(main 475 (eval 10):1) v:{
106 # d <#> gv[*getkey] s/EARLYCV
107 # e <1> entersub[t5] lKS/TARG
114 # k <1> rv2hv[t2] lKRM*/1
115 # l <2> aassign[t10] KS/COMMON
116 # m <1> leavesub[1 ref] K/REFC,1
118 # 1 <;> nextstate(main 560 (eval 15):1) v:{
122 # 5 <1> rv2av[t3] lKM/1
123 # 6 <@> mapstart lK* < 5.017002
124 # 6 <@> mapstart lK >=5.017002
125 # 7 <|> mapwhile(other->8)[t4] lK
127 # 9 <;> nextstate(main 559 (eval 15):1) v:{
131 # d <$> gv(*getkey) s/EARLYCV
132 # e <1> entersub[t2] lKS/TARG
139 # k <1> rv2hv[t1] lKRM*/1
140 # l <2> aassign[t5] KS/COMMON
141 # m <1> leavesub[1 ref] K/REFC,1
149 foreach $_ (@array) {
150 $hash{getkey($_)} = $_;
156 checkOptree(note => q{},
158 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } },
159 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
160 # 1 <;> nextstate(main 478 (eval 10):1) v:{
161 # 2 <{> enterloop(next->u last->u redo->3)
162 # 3 <;> nextstate(main 475 (eval 10):1) v
166 # 7 <1> rv2hv[t2] lKRM*/1
167 # 8 <2> aassign[t3] vKS
168 # 9 <;> nextstate(main 476 (eval 10):1) v:{
171 # c <1> rv2av[t6] sKRM/1
174 # f <{> enteriter(next->q last->t redo->g) lKS/8
176 # s <|> and(other->g) K/1
177 # g <;> nextstate(main 475 (eval 10):1) v:{
183 # m <#> gv[*getkey] s/EARLYCV
184 # n <1> entersub[t10] sKS/TARG
185 # o <2> helem sKRM*/2
186 # p <2> sassign vKS/2
189 # t <2> leaveloop KP/2
190 # u <2> leaveloop K/2
191 # v <1> leavesub[1 ref] K/REFC,1
193 # 1 <;> nextstate(main 562 (eval 15):1) v:{
194 # 2 <{> enterloop(next->u last->u redo->3)
195 # 3 <;> nextstate(main 559 (eval 15):1) v
199 # 7 <1> rv2hv[t1] lKRM*/1
200 # 8 <2> aassign[t2] vKS
201 # 9 <;> nextstate(main 560 (eval 15):1) v:{
204 # c <1> rv2av[t3] sKRM/1
207 # f <{> enteriter(next->q last->t redo->g) lKS/8
209 # s <|> and(other->g) K/1
210 # g <;> nextstate(main 559 (eval 15):1) v:{
216 # m <$> gv(*getkey) s/EARLYCV
217 # n <1> entersub[t4] sKS/TARG
218 # o <2> helem sKRM*/2
219 # p <2> sassign vKS/2
222 # t <2> leaveloop KP/2
223 # u <2> leaveloop K/2
224 # v <1> leavesub[1 ref] K/REFC,1
230 # chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong
231 %hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right
235 checkOptree(note => q{},
237 code => q{%hash = map { +"\L$_", 1 } @array; },
238 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
239 # 1 <;> nextstate(main 476 (eval 10):1) v
243 # 5 <1> rv2av[t7] lKM/1
244 # 6 <@> mapstart lK* < 5.017002
245 # 6 <@> mapstart lK >=5.017002
246 # 7 <|> mapwhile(other->8)[t9] lK
250 # b <@> stringify[t5] sK/1
251 # c <$> const[IV 1] s
253 # - <@> scope lK < 5.017002
257 # g <1> rv2hv[t2] lKRM*/1
258 # h <2> aassign[t10] KS/COMMON
259 # i <1> leavesub[1 ref] K/REFC,1
261 # 1 <;> nextstate(main 560 (eval 15):1) v
265 # 5 <1> rv2av[t4] lKM/1
266 # 6 <@> mapstart lK* < 5.017002
267 # 6 <@> mapstart lK >=5.017002
268 # 7 <|> mapwhile(other->8)[t5] lK
272 # b <@> stringify[t3] sK/1
273 # c <$> const(IV 1) s
275 # - <@> scope lK < 5.017002
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
300 # 6 <@> mapstart lK* < 5.017002
301 # 6 <@> mapstart lK >=5.017002
302 # 7 <|> mapwhile(other->8)[t9] lK
306 # b <@> stringify[t5] sK/1
307 # c <$> const[IV 1] s
309 # - <@> scope lK < 5.017002
313 # g <1> rv2hv[t2] lKRM*/1
314 # h <2> aassign[t10] KS/COMMON
315 # i <1> leavesub[1 ref] K/REFC,1
317 # 1 <;> nextstate(main 560 (eval 15):1) v
321 # 5 <1> rv2av[t4] lKM/1
322 # 6 <@> mapstart lK* < 5.017002
323 # 6 <@> mapstart lK >=5.017002
324 # 7 <|> mapwhile(other->8)[t5] lK
328 # b <@> stringify[t3] sK/1
329 # c <$> const(IV 1) s
331 # - <@> scope lK < 5.017002
335 # g <1> rv2hv[t1] lKRM*/1
336 # h <2> aassign[t6] KS/COMMON
337 # i <1> leavesub[1 ref] K/REFC,1
343 # chunk: %hash = map { lc($_), 1 } @array; # as does this.
347 checkOptree(note => q{},
349 code => q{%hash = map { lc($_), 1 } @array; },
350 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
351 # 1 <;> nextstate(main 476 (eval 10):1) v
355 # 5 <1> rv2av[t6] lKM/1
356 # 6 <@> mapstart lK* < 5.017002
357 # 6 <@> mapstart lK >=5.017002
358 # 7 <|> mapwhile(other->8)[t8] lK
362 # b <$> const[IV 1] s
364 # - <@> scope lK < 5.017002
368 # f <1> rv2hv[t2] lKRM*/1
369 # g <2> aassign[t9] KS/COMMON
370 # h <1> leavesub[1 ref] K/REFC,1
372 # 1 <;> nextstate(main 589 (eval 26):1) v
376 # 5 <1> rv2av[t3] lKM/1
377 # 6 <@> mapstart lK* < 5.017002
378 # 6 <@> mapstart lK >=5.017002
379 # 7 <|> mapwhile(other->8)[t4] lK
383 # b <$> const(IV 1) s
385 # - <@> scope lK < 5.017002
389 # f <1> rv2hv[t1] lKRM*/1
390 # g <2> aassign[t5] KS/COMMON
391 # h <1> leavesub[1 ref] K/REFC,1
397 # chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
401 checkOptree(note => q{},
403 code => q{%hash = map +( lc($_), 1 ), @array; },
404 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
405 # 1 <;> nextstate(main 475 (eval 10):1) v
409 # 5 <1> rv2av[t6] lKM/1
411 # 7 <|> mapwhile(other->8)[t7] lK
415 # b <$> const[IV 1] s
420 # f <1> rv2hv[t2] lKRM*/1
421 # g <2> aassign[t8] KS/COMMON
422 # h <1> leavesub[1 ref] K/REFC,1
424 # 1 <;> nextstate(main 593 (eval 28):1) v
428 # 5 <1> rv2av[t3] lKM/1
430 # 7 <|> mapwhile(other->8)[t4] lK
434 # b <$> const(IV 1) s
439 # f <1> rv2hv[t1] lKRM*/1
440 # g <2> aassign[t5] KS/COMMON
441 # h <1> leavesub[1 ref] K/REFC,1
447 # chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
451 checkOptree(note => q{},
453 code => q{%hash = map ( lc($_), 1 ), @array; },
454 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
455 # 1 <;> nextstate(main 475 (eval 10):1) v
459 # 5 <$> const[IV 1] sM
461 # 7 <|> mapwhile(other->8)[t5] lK
467 # c <1> rv2hv[t2] lKRM*/1
468 # d <2> aassign[t6] KS/COMMON
470 # f <1> rv2av[t8] K/1
472 # h <1> leavesub[1 ref] K/REFC,1
474 # 1 <;> nextstate(main 597 (eval 30):1) v
478 # 5 <$> const(IV 1) sM
480 # 7 <|> mapwhile(other->8)[t3] lK
486 # c <1> rv2hv[t1] lKRM*/1
487 # d <2> aassign[t4] KS/COMMON
489 # f <1> rv2av[t5] K/1
491 # h <1> leavesub[1 ref] K/REFC,1
497 # chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
501 checkOptree(note => q{},
503 code => q{@hashes = map +{ lc($_), 1 }, @array },
504 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
505 # 1 <;> nextstate(main 475 (eval 10):1) v
509 # 5 <1> rv2av[t6] lKM/1
511 # 7 <|> mapwhile(other->8)[t7] lK
515 # b <$> const[IV 1] s
516 # c <@> anonhash sK*/1
519 # e <#> gv[*hashes] s
520 # f <1> rv2av[t2] lKRM*/1
521 # g <2> aassign[t8] KS/COMMON
522 # h <1> leavesub[1 ref] K/REFC,1
524 # 1 <;> nextstate(main 601 (eval 32):1) v
528 # 5 <1> rv2av[t3] lKM/1
530 # 7 <|> mapwhile(other->8)[t4] lK
534 # b <$> const(IV 1) s
535 # c <@> anonhash sK*/1
538 # e <$> gv(*hashes) s
539 # f <1> rv2av[t1] lKRM*/1
540 # g <2> aassign[t5] KS/COMMON
541 # h <1> leavesub[1 ref] K/REFC,1