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:{
105 # c <#> gv[*getkey] s/EARLYCV
106 # d <1> entersub[t5] lKS/TARG
112 # i <1> rv2hv[t2] lKRM*/1 < 5.019006
113 # i <1> rv2hv lKRM*/1 >=5.019006
114 # j <2> aassign[t10] KS/COMMON
115 # k <1> leavesub[1 ref] K/REFC,1
117 # 1 <;> nextstate(main 560 (eval 15):1) v:{
121 # 5 <1> rv2av[t3] lKM/1
122 # 6 <@> mapstart lK* < 5.017002
123 # 6 <@> mapstart lK >=5.017002
124 # 7 <|> mapwhile(other->8)[t4] lK
126 # 9 <;> nextstate(main 559 (eval 15):1) v:{
129 # c <$> gv(*getkey) s/EARLYCV
130 # d <1> entersub[t2] lKS/TARG
136 # i <1> rv2hv[t1] lKRM*/1 < 5.019006
137 # i <1> rv2hv lKRM*/1 >=5.019006
138 # j <2> aassign[t5] KS/COMMON
139 # k <1> leavesub[1 ref] K/REFC,1
147 foreach $_ (@array) {
148 $hash{getkey($_)} = $_;
154 checkOptree(note => q{},
156 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } },
157 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
158 # 1 <;> nextstate(main 478 (eval 10):1) v:{
159 # 2 <{> enterloop(next->u last->u redo->3)
160 # 3 <;> nextstate(main 475 (eval 10):1) v
164 # 7 <1> rv2hv[t2] lKRM*/1 < 5.019006
165 # 7 <1> rv2hv lKRM*/1 >=5.019006
166 # 8 <2> aassign[t3] vKS
167 # 9 <;> nextstate(main 476 (eval 10):1) v:{
170 # c <1> rv2av[t6] sKRM/1
173 # f <{> enteriter(next->q last->t redo->g) lKS/8
175 # s <|> and(other->g) K/1
176 # g <;> nextstate(main 475 (eval 10):1) v:{
182 # m <#> gv[*getkey] s/EARLYCV
183 # n <1> entersub[t10] sKS/TARG
184 # o <2> helem sKRM*/2
185 # p <2> sassign vKS/2
188 # t <2> leaveloop KP/2
189 # u <2> leaveloop K/2
190 # v <1> leavesub[1 ref] K/REFC,1
192 # 1 <;> nextstate(main 562 (eval 15):1) v:{
193 # 2 <{> enterloop(next->u last->u redo->3)
194 # 3 <;> nextstate(main 559 (eval 15):1) v
198 # 7 <1> rv2hv[t1] lKRM*/1 < 5.019006
199 # 7 <1> rv2hv lKRM*/1 >=5.019006
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 < 5.019006
258 # g <1> rv2hv lKRM*/1 >=5.019006
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
267 # 6 <@> mapstart lK* < 5.017002
268 # 6 <@> mapstart lK >=5.017002
269 # 7 <|> mapwhile(other->8)[t5] lK
273 # b <@> stringify[t3] sK/1
274 # c <$> const(IV 1) s
276 # - <@> scope lK < 5.017002
280 # g <1> rv2hv[t1] lKRM*/1 < 5.019006
281 # g <1> rv2hv lKRM*/1 >=5.019006
282 # h <2> aassign[t6] KS/COMMON
283 # i <1> leavesub[1 ref] K/REFC,1
289 # chunk: %hash = map { ("\L$_", 1) } @array; # this also works
293 checkOptree(note => q{},
295 code => q{%hash = map { ("\L$_", 1) } @array; },
296 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
297 # 1 <;> nextstate(main 476 (eval 10):1) v
301 # 5 <1> rv2av[t7] lKM/1
302 # 6 <@> mapstart lK* < 5.017002
303 # 6 <@> mapstart lK >=5.017002
304 # 7 <|> mapwhile(other->8)[t9] lK
308 # b <@> stringify[t5] sK/1
309 # c <$> const[IV 1] s
311 # - <@> scope lK < 5.017002
315 # g <1> rv2hv[t2] lKRM*/1 < 5.019006
316 # g <1> rv2hv lKRM*/1 >=5.019006
317 # h <2> aassign[t10] KS/COMMON
318 # i <1> leavesub[1 ref] K/REFC,1
320 # 1 <;> nextstate(main 560 (eval 15):1) v
324 # 5 <1> rv2av[t4] lKM/1
325 # 6 <@> mapstart lK* < 5.017002
326 # 6 <@> mapstart lK >=5.017002
327 # 7 <|> mapwhile(other->8)[t5] lK
331 # b <@> stringify[t3] sK/1
332 # c <$> const(IV 1) s
334 # - <@> scope lK < 5.017002
338 # g <1> rv2hv[t1] lKRM*/1 < 5.019006
339 # g <1> rv2hv lKRM*/1 >=5.019006
340 # h <2> aassign[t6] KS/COMMON
341 # i <1> leavesub[1 ref] K/REFC,1
347 # chunk: %hash = map { lc($_), 1 } @array; # as does this.
351 checkOptree(note => q{},
353 code => q{%hash = map { lc($_), 1 } @array; },
354 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
355 # 1 <;> nextstate(main 476 (eval 10):1) v
359 # 5 <1> rv2av[t6] lKM/1
360 # 6 <@> mapstart lK* < 5.017002
361 # 6 <@> mapstart lK >=5.017002
362 # 7 <|> mapwhile(other->8)[t8] lK
366 # b <$> const[IV 1] s
368 # - <@> scope lK < 5.017002
372 # f <1> rv2hv[t2] lKRM*/1 < 5.019006
373 # f <1> rv2hv lKRM*/1 >=5.019006
374 # g <2> aassign[t9] KS/COMMON
375 # h <1> leavesub[1 ref] K/REFC,1
377 # 1 <;> nextstate(main 589 (eval 26):1) v
381 # 5 <1> rv2av[t3] lKM/1
382 # 6 <@> mapstart lK* < 5.017002
383 # 6 <@> mapstart lK >=5.017002
384 # 7 <|> mapwhile(other->8)[t4] lK
388 # b <$> const(IV 1) s
390 # - <@> scope lK < 5.017002
394 # f <1> rv2hv[t1] lKRM*/1 < 5.019006
395 # f <1> rv2hv lKRM*/1 >=5.019006
396 # g <2> aassign[t5] KS/COMMON
397 # h <1> leavesub[1 ref] K/REFC,1
403 # chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
407 checkOptree(note => q{},
409 code => q{%hash = map +( lc($_), 1 ), @array; },
410 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
411 # 1 <;> nextstate(main 475 (eval 10):1) v
415 # 5 <1> rv2av[t6] lKM/1
417 # 7 <|> mapwhile(other->8)[t7] lK
421 # b <$> const[IV 1] s
426 # f <1> rv2hv[t2] lKRM*/1 < 5.019006
427 # f <1> rv2hv lKRM*/1 >=5.019006
428 # g <2> aassign[t8] KS/COMMON
429 # h <1> leavesub[1 ref] K/REFC,1
431 # 1 <;> nextstate(main 593 (eval 28):1) v
435 # 5 <1> rv2av[t3] lKM/1
437 # 7 <|> mapwhile(other->8)[t4] lK
441 # b <$> const(IV 1) s
446 # f <1> rv2hv[t1] lKRM*/1 < 5.019006
447 # f <1> rv2hv lKRM*/1 >=5.019006
448 # g <2> aassign[t5] KS/COMMON
449 # h <1> leavesub[1 ref] K/REFC,1
455 # chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
459 checkOptree(note => q{},
461 code => q{%hash = map ( lc($_), 1 ), @array; },
462 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
463 # 1 <;> nextstate(main 475 (eval 10):1) v
467 # 5 <$> const[IV 1] sM
469 # 7 <|> mapwhile(other->8)[t5] lK
475 # c <1> rv2hv[t2] lKRM*/1 < 5.019006
476 # c <1> rv2hv lKRM*/1 >=5.019006
477 # d <2> aassign[t6] KS/COMMON
479 # f <1> rv2av[t8] K/1
481 # h <1> leavesub[1 ref] K/REFC,1
483 # 1 <;> nextstate(main 597 (eval 30):1) v
487 # 5 <$> const(IV 1) sM
489 # 7 <|> mapwhile(other->8)[t3] lK
495 # c <1> rv2hv[t1] lKRM*/1 < 5.019006
496 # c <1> rv2hv lKRM*/1 >=5.019006
497 # d <2> aassign[t4] KS/COMMON
499 # f <1> rv2av[t5] K/1
501 # h <1> leavesub[1 ref] K/REFC,1
507 # chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
511 checkOptree(note => q{},
513 code => q{@hashes = map +{ lc($_), 1 }, @array },
514 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
515 # 1 <;> nextstate(main 475 (eval 10):1) v
519 # 5 <1> rv2av[t6] lKM/1
521 # 7 <|> mapwhile(other->8)[t7] lK
525 # b <$> const[IV 1] s
526 # c <@> anonhash sK*/1
529 # e <#> gv[*hashes] s
530 # f <1> rv2av[t2] lKRM*/1
531 # g <2> aassign[t8] KS/COMMON
532 # h <1> leavesub[1 ref] K/REFC,1
534 # 1 <;> nextstate(main 601 (eval 32):1) v
538 # 5 <1> rv2av[t3] lKM/1
540 # 7 <|> mapwhile(other->8)[t4] lK
544 # b <$> const(IV 1) s
545 # c <@> anonhash sK*/1
548 # e <$> gv(*hashes) s
549 # f <1> rv2av[t1] lKRM*/1
550 # g <2> aassign[t5] KS/COMMON
551 # h <1> leavesub[1 ref] K/REFC,1