This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix up f_map.t following "\L$_" optimisation
[perl5.git] / ext / B / t / f_map.t
CommitLineData
cc02ea56
JC
1#!perl
2
3BEGIN {
74517a3a 4 unshift @INC, 't';
9cd8f857
NC
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 }
7f046282
NC
10 if (!$Config::Config{useperlio}) {
11 print "1..0 # Skip -- need perlio to walk the optree\n";
12 exit 0;
13 }
cc02ea56
JC
14}
15use OptreeCheck;
3857d07c 16plan tests => 18;
cc02ea56
JC
17
18
19e169bf
JC
19=head1 f_map.t
20
21Code test snippets here are adapted from `perldoc -f map`
22
23Due to a bleadperl optimization (Dave Mitchell, circa may 04), the
24(map|grep)(start|while) opcodes have different flags in 5.9, their
25private flags /1, /2 are gone in blead (for the cases covered)
26
27When the optree stuff was integrated into 5.8.6, these tests failed,
1c2e8cca 28and were todo'd. They're now done, by version-specific tweaking in
19e169bf
JC
29mkCheckRex(), therefore the skip is removed too.
30
cc02ea56
JC
31=for gentest
32
33# chunk: #!perl
34# examples shamelessly snatched from perldoc -f map
35
36=cut
37
38=for gentest
39
40# chunk: # translates a list of numbers to the corresponding characters.
41@chars = map(chr, @nums);
42
43=cut
44
45checkOptree(note => q{},
46 bcopts => q{-exec},
47 code => q{@chars = map(chr, @nums); },
48 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 49# 1 <;> nextstate(main 475 (eval 10):1) v
cc02ea56
JC
50# 2 <0> pushmark s
51# 3 <0> pushmark s
52# 4 <#> gv[*nums] s
c7fe699d 53# 5 <1> rv2av[t7] lKM/1
cc02ea56 54# 6 <@> mapstart lK
c7fe699d 55# 7 <|> mapwhile(other->8)[t8] lK
cc02ea56
JC
56# 8 <#> gvsv[*_] s
57# 9 <1> chr[t5] sK/1
58# goto 7
59# a <0> pushmark s
60# b <#> gv[*chars] s
61# c <1> rv2av[t2] lKRM*/1
c7fe699d 62# d <2> aassign[t9] KS/COMMON
cc02ea56
JC
63# e <1> leavesub[1 ref] K/REFC,1
64EOT_EOT
d1718a7c 65# 1 <;> nextstate(main 559 (eval 15):1) v
cc02ea56
JC
66# 2 <0> pushmark s
67# 3 <0> pushmark s
68# 4 <$> gv(*nums) s
c7fe699d 69# 5 <1> rv2av[t4] lKM/1
cc02ea56 70# 6 <@> mapstart lK
c7fe699d 71# 7 <|> mapwhile(other->8)[t5] lK
cc02ea56
JC
72# 8 <$> gvsv(*_) s
73# 9 <1> chr[t3] sK/1
74# goto 7
75# a <0> pushmark s
76# b <$> gv(*chars) s
77# c <1> rv2av[t1] lKRM*/1
c7fe699d 78# d <2> aassign[t6] KS/COMMON
cc02ea56
JC
79# e <1> leavesub[1 ref] K/REFC,1
80EONT_EONT
81
82
83=for gentest
84
85# chunk: %hash = map { getkey($_) => $_ } @array;
86
87=cut
88
89checkOptree(note => q{},
90 bcopts => q{-exec},
91 code => q{%hash = map { getkey($_) => $_ } @array; },
92 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 93# 1 <;> nextstate(main 476 (eval 10):1) v:{
cc02ea56
JC
94# 2 <0> pushmark s
95# 3 <0> pushmark s
96# 4 <#> gv[*array] s
97# 5 <1> rv2av[t8] lKM/1
b3153e04 98# 6 <@> mapstart lK
cc02ea56
JC
99# 7 <|> mapwhile(other->8)[t9] lK
100# 8 <0> enter l
d1718a7c 101# 9 <;> nextstate(main 475 (eval 10):1) v:{
cc02ea56 102# a <0> pushmark s
7d3c8a68
S
103# b <#> gvsv[*_] s
104# c <#> gv[*getkey] s/EARLYCV
105# d <1> entersub[t5] lKS/TARG
106# e <#> gvsv[*_] s
107# f <@> leave lKP
cc02ea56 108# goto 7
7d3c8a68
S
109# g <0> pushmark s
110# h <#> gv[*hash] s
b3153e04 111# i <1> rv2hv lKRM*/1
7d3c8a68
S
112# j <2> aassign[t10] KS/COMMON
113# k <1> leavesub[1 ref] K/REFC,1
cc02ea56 114EOT_EOT
d1718a7c 115# 1 <;> nextstate(main 560 (eval 15):1) v:{
cc02ea56
JC
116# 2 <0> pushmark s
117# 3 <0> pushmark s
118# 4 <$> gv(*array) s
119# 5 <1> rv2av[t3] lKM/1
b3153e04 120# 6 <@> mapstart lK
cc02ea56
JC
121# 7 <|> mapwhile(other->8)[t4] lK
122# 8 <0> enter l
d1718a7c 123# 9 <;> nextstate(main 559 (eval 15):1) v:{
cc02ea56 124# a <0> pushmark s
7d3c8a68
S
125# b <$> gvsv(*_) s
126# c <$> gv(*getkey) s/EARLYCV
127# d <1> entersub[t2] lKS/TARG
128# e <$> gvsv(*_) s
129# f <@> leave lKP
cc02ea56 130# goto 7
7d3c8a68
S
131# g <0> pushmark s
132# h <$> gv(*hash) s
b3153e04 133# i <1> rv2hv lKRM*/1
7d3c8a68
S
134# j <2> aassign[t5] KS/COMMON
135# k <1> leavesub[1 ref] K/REFC,1
cc02ea56
JC
136EONT_EONT
137
138
139=for gentest
140
141# chunk: {
142 %hash = ();
143 foreach $_ (@array) {
144 $hash{getkey($_)} = $_;
145 }
146}
147
148=cut
149
150checkOptree(note => q{},
151 bcopts => q{-exec},
152 code => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; } } },
153 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 154# 1 <;> nextstate(main 478 (eval 10):1) v:{
cc02ea56 155# 2 <{> enterloop(next->u last->u redo->3)
d1718a7c 156# 3 <;> nextstate(main 475 (eval 10):1) v
cc02ea56
JC
157# 4 <0> pushmark s
158# 5 <0> pushmark s
159# 6 <#> gv[*hash] s
b3153e04 160# 7 <1> rv2hv lKRM*/1
cc02ea56 161# 8 <2> aassign[t3] vKS
d1718a7c 162# 9 <;> nextstate(main 476 (eval 10):1) v:{
cc02ea56
JC
163# a <0> pushmark sM
164# b <#> gv[*array] s
165# c <1> rv2av[t6] sKRM/1
166# d <#> gv[*_] s
167# e <1> rv2gv sKRM/1
c486bd5c 168# f <{> enteriter(next->q last->t redo->g) lKS/DEF
cc02ea56
JC
169# r <0> iter s
170# s <|> and(other->g) K/1
d1718a7c 171# g <;> nextstate(main 475 (eval 10):1) v:{
cc02ea56
JC
172# h <#> gvsv[*_] s
173# i <#> gv[*hash] s
174# j <1> rv2hv sKR/1
175# k <0> pushmark s
176# l <#> gvsv[*_] s
177# m <#> gv[*getkey] s/EARLYCV
767eda44 178# n <1> entersub[t10] sKS/TARG
cc02ea56
JC
179# o <2> helem sKRM*/2
180# p <2> sassign vKS/2
181# q <0> unstack s
182# goto r
eae48c89 183# t <2> leaveloop KP/2
cc02ea56
JC
184# u <2> leaveloop K/2
185# v <1> leavesub[1 ref] K/REFC,1
186EOT_EOT
d1718a7c 187# 1 <;> nextstate(main 562 (eval 15):1) v:{
cc02ea56 188# 2 <{> enterloop(next->u last->u redo->3)
d1718a7c 189# 3 <;> nextstate(main 559 (eval 15):1) v
cc02ea56
JC
190# 4 <0> pushmark s
191# 5 <0> pushmark s
192# 6 <$> gv(*hash) s
b3153e04 193# 7 <1> rv2hv lKRM*/1
cc02ea56 194# 8 <2> aassign[t2] vKS
d1718a7c 195# 9 <;> nextstate(main 560 (eval 15):1) v:{
cc02ea56
JC
196# a <0> pushmark sM
197# b <$> gv(*array) s
198# c <1> rv2av[t3] sKRM/1
199# d <$> gv(*_) s
200# e <1> rv2gv sKRM/1
c486bd5c 201# f <{> enteriter(next->q last->t redo->g) lKS/DEF
cc02ea56
JC
202# r <0> iter s
203# s <|> and(other->g) K/1
d1718a7c 204# g <;> nextstate(main 559 (eval 15):1) v:{
cc02ea56
JC
205# h <$> gvsv(*_) s
206# i <$> gv(*hash) s
207# j <1> rv2hv sKR/1
208# k <0> pushmark s
209# l <$> gvsv(*_) s
210# m <$> gv(*getkey) s/EARLYCV
e77205b9 211# n <1> entersub[t4] sKS/TARG
cc02ea56
JC
212# o <2> helem sKRM*/2
213# p <2> sassign vKS/2
214# q <0> unstack s
215# goto r
eae48c89 216# t <2> leaveloop KP/2
cc02ea56
JC
217# u <2> leaveloop K/2
218# v <1> leavesub[1 ref] K/REFC,1
219EONT_EONT
220
221
222=for gentest
223
224# chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong
225%hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right
226
227=cut
228
229checkOptree(note => q{},
230 bcopts => q{-exec},
231 code => q{%hash = map { +"\L$_", 1 } @array; },
232 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 233# 1 <;> nextstate(main 476 (eval 10):1) v
cc02ea56
JC
234# 2 <0> pushmark s
235# 3 <0> pushmark s
236# 4 <#> gv[*array] s
237# 5 <1> rv2av[t7] lKM/1
b3153e04 238# 6 <@> mapstart lK
cc02ea56 239# 7 <|> mapwhile(other->8)[t9] lK
6aa68307
FC
240# 8 <#> gvsv[*_] s
241# 9 <1> lc[t4] sK/1
383542ae 242# a <$> const[IV 1] s
cc02ea56 243# goto 7
383542ae
FC
244# b <0> pushmark s
245# c <#> gv[*hash] s
246# d <1> rv2hv lKRM*/1
247# e <2> aassign[t10] KS/COMMON
248# f <1> leavesub[1 ref] K/REFC,1
cc02ea56 249EOT_EOT
d1718a7c 250# 1 <;> nextstate(main 560 (eval 15):1) v
cc02ea56
JC
251# 2 <0> pushmark s
252# 3 <0> pushmark s
253# 4 <$> gv(*array) s
254# 5 <1> rv2av[t4] lKM/1
b3153e04 255# 6 <@> mapstart lK
cc02ea56 256# 7 <|> mapwhile(other->8)[t5] lK
6aa68307
FC
257# 8 <$> gvsv(*_) s
258# 9 <1> lc[t2] sK/1
383542ae 259# a <$> const(IV 1) s
cc02ea56 260# goto 7
383542ae
FC
261# b <0> pushmark s
262# c <$> gv(*hash) s
263# d <1> rv2hv lKRM*/1
264# e <2> aassign[t6] KS/COMMON
265# f <1> leavesub[1 ref] K/REFC,1
cc02ea56
JC
266EONT_EONT
267
268
269=for gentest
270
271# chunk: %hash = map { ("\L$_", 1) } @array; # this also works
272
273=cut
274
275checkOptree(note => q{},
276 bcopts => q{-exec},
277 code => q{%hash = map { ("\L$_", 1) } @array; },
278 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 279# 1 <;> nextstate(main 476 (eval 10):1) v
cc02ea56
JC
280# 2 <0> pushmark s
281# 3 <0> pushmark s
282# 4 <#> gv[*array] s
283# 5 <1> rv2av[t7] lKM/1
b3153e04 284# 6 <@> mapstart lK
cc02ea56 285# 7 <|> mapwhile(other->8)[t9] lK
6aa68307
FC
286# 8 <#> gvsv[*_] s
287# 9 <1> lc[t4] sK/1
383542ae 288# a <$> const[IV 1] s
cc02ea56 289# goto 7
383542ae
FC
290# b <0> pushmark s
291# c <#> gv[*hash] s
292# d <1> rv2hv lKRM*/1
293# e <2> aassign[t10] KS/COMMON
294# f <1> leavesub[1 ref] K/REFC,1
cc02ea56 295EOT_EOT
d1718a7c 296# 1 <;> nextstate(main 560 (eval 15):1) v
cc02ea56
JC
297# 2 <0> pushmark s
298# 3 <0> pushmark s
299# 4 <$> gv(*array) s
300# 5 <1> rv2av[t4] lKM/1
b3153e04 301# 6 <@> mapstart lK
cc02ea56 302# 7 <|> mapwhile(other->8)[t5] lK
6aa68307
FC
303# 8 <$> gvsv(*_) s
304# 9 <1> lc[t2] sK/1
383542ae 305# a <$> const(IV 1) s
cc02ea56 306# goto 7
383542ae
FC
307# b <0> pushmark s
308# c <$> gv(*hash) s
309# d <1> rv2hv lKRM*/1
310# e <2> aassign[t6] KS/COMMON
311# f <1> leavesub[1 ref] K/REFC,1
cc02ea56
JC
312EONT_EONT
313
314
315=for gentest
316
317# chunk: %hash = map { lc($_), 1 } @array; # as does this.
318
319=cut
320
321checkOptree(note => q{},
322 bcopts => q{-exec},
323 code => q{%hash = map { lc($_), 1 } @array; },
324 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 325# 1 <;> nextstate(main 476 (eval 10):1) v
cc02ea56
JC
326# 2 <0> pushmark s
327# 3 <0> pushmark s
328# 4 <#> gv[*array] s
329# 5 <1> rv2av[t6] lKM/1
b3153e04 330# 6 <@> mapstart lK
cc02ea56 331# 7 <|> mapwhile(other->8)[t8] lK
6aa68307
FC
332# 8 <#> gvsv[*_] s
333# 9 <1> lc[t4] sK/1
334# a <$> const[IV 1] s
cc02ea56 335# goto 7
6aa68307
FC
336# b <0> pushmark s
337# c <#> gv[*hash] s
338# d <1> rv2hv lKRM*/1
339# e <2> aassign[t9] KS/COMMON
340# f <1> leavesub[1 ref] K/REFC,1
cc02ea56 341EOT_EOT
d1718a7c 342# 1 <;> nextstate(main 589 (eval 26):1) v
cc02ea56
JC
343# 2 <0> pushmark s
344# 3 <0> pushmark s
345# 4 <$> gv(*array) s
346# 5 <1> rv2av[t3] lKM/1
b3153e04 347# 6 <@> mapstart lK
cc02ea56 348# 7 <|> mapwhile(other->8)[t4] lK
6aa68307
FC
349# 8 <$> gvsv(*_) s
350# 9 <1> lc[t2] sK/1
351# a <$> const(IV 1) s
cc02ea56 352# goto 7
6aa68307
FC
353# b <0> pushmark s
354# c <$> gv(*hash) s
355# d <1> rv2hv lKRM*/1
356# e <2> aassign[t5] KS/COMMON
357# f <1> leavesub[1 ref] K/REFC,1
cc02ea56
JC
358EONT_EONT
359
360
361=for gentest
362
363# chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
364
365=cut
366
367checkOptree(note => q{},
368 bcopts => q{-exec},
369 code => q{%hash = map +( lc($_), 1 ), @array; },
370 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 371# 1 <;> nextstate(main 475 (eval 10):1) v
cc02ea56
JC
372# 2 <0> pushmark s
373# 3 <0> pushmark s
374# 4 <#> gv[*array] s
375# 5 <1> rv2av[t6] lKM/1
376# 6 <@> mapstart lK
377# 7 <|> mapwhile(other->8)[t7] lK
6aa68307
FC
378# 8 <#> gvsv[*_] s
379# 9 <1> lc[t4] sK/1
380# a <$> const[IV 1] s
cc02ea56 381# goto 7
6aa68307
FC
382# b <0> pushmark s
383# c <#> gv[*hash] s
384# d <1> rv2hv lKRM*/1
385# e <2> aassign[t8] KS/COMMON
386# f <1> leavesub[1 ref] K/REFC,1
cc02ea56 387EOT_EOT
d1718a7c 388# 1 <;> nextstate(main 593 (eval 28):1) v
cc02ea56
JC
389# 2 <0> pushmark s
390# 3 <0> pushmark s
391# 4 <$> gv(*array) s
392# 5 <1> rv2av[t3] lKM/1
393# 6 <@> mapstart lK
394# 7 <|> mapwhile(other->8)[t4] lK
6aa68307
FC
395# 8 <$> gvsv(*_) s
396# 9 <1> lc[t2] sK/1
397# a <$> const(IV 1) s
cc02ea56 398# goto 7
6aa68307
FC
399# b <0> pushmark s
400# c <$> gv(*hash) s
401# d <1> rv2hv lKRM*/1
402# e <2> aassign[t5] KS/COMMON
403# f <1> leavesub[1 ref] K/REFC,1
cc02ea56
JC
404EONT_EONT
405
406
407=for gentest
408
409# chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
410
411=cut
412
413checkOptree(note => q{},
414 bcopts => q{-exec},
415 code => q{%hash = map ( lc($_), 1 ), @array; },
416 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 417# 1 <;> nextstate(main 475 (eval 10):1) v
cc02ea56
JC
418# 2 <0> pushmark s
419# 3 <0> pushmark s
420# 4 <0> pushmark s
421# 5 <$> const[IV 1] sM
422# 6 <@> mapstart lK
423# 7 <|> mapwhile(other->8)[t5] lK
424# 8 <#> gvsv[*_] s
425# 9 <1> lc[t4] sK/1
426# goto 7
427# a <0> pushmark s
428# b <#> gv[*hash] s
b3153e04 429# c <1> rv2hv lKRM*/1
cc02ea56
JC
430# d <2> aassign[t6] KS/COMMON
431# e <#> gv[*array] s
432# f <1> rv2av[t8] K/1
433# g <@> list K
434# h <1> leavesub[1 ref] K/REFC,1
435EOT_EOT
d1718a7c 436# 1 <;> nextstate(main 597 (eval 30):1) v
cc02ea56
JC
437# 2 <0> pushmark s
438# 3 <0> pushmark s
439# 4 <0> pushmark s
440# 5 <$> const(IV 1) sM
441# 6 <@> mapstart lK
442# 7 <|> mapwhile(other->8)[t3] lK
443# 8 <$> gvsv(*_) s
444# 9 <1> lc[t2] sK/1
445# goto 7
446# a <0> pushmark s
447# b <$> gv(*hash) s
b3153e04 448# c <1> rv2hv lKRM*/1
cc02ea56
JC
449# d <2> aassign[t4] KS/COMMON
450# e <$> gv(*array) s
451# f <1> rv2av[t5] K/1
452# g <@> list K
453# h <1> leavesub[1 ref] K/REFC,1
454EONT_EONT
455
456
457=for gentest
458
459# chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
460
461=cut
462
463checkOptree(note => q{},
464 bcopts => q{-exec},
465 code => q{@hashes = map +{ lc($_), 1 }, @array },
466 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
d1718a7c 467# 1 <;> nextstate(main 475 (eval 10):1) v
cc02ea56
JC
468# 2 <0> pushmark s
469# 3 <0> pushmark s
470# 4 <#> gv[*array] s
471# 5 <1> rv2av[t6] lKM/1
472# 6 <@> mapstart lK
473# 7 <|> mapwhile(other->8)[t7] lK
474# 8 <0> pushmark s
475# 9 <#> gvsv[*_] s
476# a <1> lc[t4] sK/1
477# b <$> const[IV 1] s
78c72037 478# c <@> anonhash sK*/1
cc02ea56 479# goto 7
78c72037
NC
480# d <0> pushmark s
481# e <#> gv[*hashes] s
482# f <1> rv2av[t2] lKRM*/1
483# g <2> aassign[t8] KS/COMMON
484# h <1> leavesub[1 ref] K/REFC,1
cc02ea56 485EOT_EOT
d1718a7c 486# 1 <;> nextstate(main 601 (eval 32):1) v
cc02ea56
JC
487# 2 <0> pushmark s
488# 3 <0> pushmark s
489# 4 <$> gv(*array) s
490# 5 <1> rv2av[t3] lKM/1
491# 6 <@> mapstart lK
492# 7 <|> mapwhile(other->8)[t4] lK
493# 8 <0> pushmark s
494# 9 <$> gvsv(*_) s
495# a <1> lc[t2] sK/1
496# b <$> const(IV 1) s
78c72037 497# c <@> anonhash sK*/1
cc02ea56 498# goto 7
78c72037
NC
499# d <0> pushmark s
500# e <$> gv(*hashes) s
501# f <1> rv2av[t1] lKRM*/1
502# g <2> aassign[t5] KS/COMMON
503# h <1> leavesub[1 ref] K/REFC,1
cc02ea56 504EONT_EONT