Fix deparsing of reversed foreach loops,
[p5sagit/p5-mst-13.2.git] / ext / B / t / f_map.t
CommitLineData
cc02ea56 1#!perl
2
3BEGIN {
4 chdir q(t);
5 @INC = qw(../lib ../ext/B/t);
9cd8f857 6 require Config;
7 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
8 print "1..0 # Skip -- Perl configured without B module\n";
9 exit 0;
10 }
8dd2f9d4 11 if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) {
2799c206 12 print
13 "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n";
14 exit 0;
2799c206 15 }
7f046282 16 if (!$Config::Config{useperlio}) {
17 print "1..0 # Skip -- need perlio to walk the optree\n";
18 exit 0;
19 }
7252851f 20 if ($] < 5.009) {
21 print "1..0 # Skip -- TODO - provide golden result regexps for 5.8\n";
22 exit 0;
23 }
24 require q(./test.pl);
cc02ea56 25}
26use OptreeCheck;
27plan tests => 9;
28
29
30=for gentest
31
32# chunk: #!perl
33# examples shamelessly snatched from perldoc -f map
34
35=cut
36
37=for gentest
38
39# chunk: # translates a list of numbers to the corresponding characters.
40@chars = map(chr, @nums);
41
42=cut
43
44checkOptree(note => q{},
45 bcopts => q{-exec},
46 code => q{@chars = map(chr, @nums); },
47 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
48# 1 <;> nextstate(main 475 (eval 10):1) v
49# 2 <0> pushmark s
50# 3 <0> pushmark s
51# 4 <#> gv[*nums] s
52# 5 <1> rv2av[t7] lKM/1
53# 6 <@> mapstart lK
54# 7 <|> mapwhile(other->8)[t8] lK
55# 8 <#> gvsv[*_] s
56# 9 <1> chr[t5] sK/1
57# goto 7
58# a <0> pushmark s
59# b <#> gv[*chars] s
60# c <1> rv2av[t2] lKRM*/1
61# d <2> aassign[t9] KS/COMMON
62# e <1> leavesub[1 ref] K/REFC,1
63EOT_EOT
64# 1 <;> nextstate(main 559 (eval 15):1) v
65# 2 <0> pushmark s
66# 3 <0> pushmark s
67# 4 <$> gv(*nums) s
68# 5 <1> rv2av[t4] lKM/1
69# 6 <@> mapstart lK
70# 7 <|> mapwhile(other->8)[t5] lK
71# 8 <$> gvsv(*_) s
72# 9 <1> chr[t3] sK/1
73# goto 7
74# a <0> pushmark s
75# b <$> gv(*chars) s
76# c <1> rv2av[t1] lKRM*/1
77# d <2> aassign[t6] KS/COMMON
78# e <1> leavesub[1 ref] K/REFC,1
79EONT_EONT
80
81
82=for gentest
83
84# chunk: %hash = map { getkey($_) => $_ } @array;
85
86=cut
87
88checkOptree(note => q{},
89 bcopts => q{-exec},
90 code => q{%hash = map { getkey($_) => $_ } @array; },
91 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
92# 1 <;> nextstate(main 476 (eval 10):1) v
93# 2 <0> pushmark s
94# 3 <0> pushmark s
95# 4 <#> gv[*array] s
96# 5 <1> rv2av[t8] lKM/1
97# 6 <@> mapstart lK*
98# 7 <|> mapwhile(other->8)[t9] lK
99# 8 <0> enter l
100# 9 <;> nextstate(main 475 (eval 10):1) v
101# a <0> pushmark s
102# b <0> pushmark s
103# c <#> gvsv[*_] s
104# d <#> gv[*getkey] s/EARLYCV
105# e <1> entersub[t5] lKS/TARG,1
106# f <#> gvsv[*_] s
107# g <@> list lK
108# h <@> leave lKP
109# goto 7
110# i <0> pushmark s
111# j <#> gv[*hash] s
112# k <1> rv2hv[t2] lKRM*/1
113# l <2> aassign[t10] KS/COMMON
114# m <1> leavesub[1 ref] K/REFC,1
115EOT_EOT
116# 1 <;> nextstate(main 560 (eval 15):1) v
117# 2 <0> pushmark s
118# 3 <0> pushmark s
119# 4 <$> gv(*array) s
120# 5 <1> rv2av[t3] lKM/1
121# 6 <@> mapstart lK*
122# 7 <|> mapwhile(other->8)[t4] lK
123# 8 <0> enter l
124# 9 <;> nextstate(main 559 (eval 15):1) v
125# a <0> pushmark s
126# b <0> pushmark s
127# c <$> gvsv(*_) s
128# d <$> gv(*getkey) s/EARLYCV
129# e <1> entersub[t2] lKS/TARG,1
130# f <$> gvsv(*_) s
131# g <@> list lK
132# h <@> leave lKP
133# goto 7
134# i <0> pushmark s
135# j <$> gv(*hash) s
136# k <1> rv2hv[t1] lKRM*/1
137# l <2> aassign[t5] KS/COMMON
138# m <1> leavesub[1 ref] K/REFC,1
139EONT_EONT
140
141
142=for gentest
143
144# chunk: {
145 %hash = ();
146 foreach $_ (@array) {
147 $hash{getkey($_)} = $_;
148 }
149}
150
151=cut
152
153checkOptree(note => q{},
154 bcopts => q{-exec},
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
160# 4 <0> pushmark s
161# 5 <0> pushmark s
162# 6 <#> gv[*hash] s
163# 7 <1> rv2hv[t2] lKRM*/1
164# 8 <2> aassign[t3] vKS
165# 9 <;> nextstate(main 476 (eval 10):1) v
166# a <0> pushmark sM
167# b <#> gv[*array] s
168# c <1> rv2av[t6] sKRM/1
169# d <#> gv[*_] s
170# e <1> rv2gv sKRM/1
171# f <{> enteriter(next->q last->t redo->g) lKS
172# r <0> iter s
173# s <|> and(other->g) K/1
174# g <;> nextstate(main 475 (eval 10):1) v
175# h <#> gvsv[*_] s
176# i <#> gv[*hash] s
177# j <1> rv2hv sKR/1
178# k <0> pushmark s
179# l <#> gvsv[*_] s
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
184# q <0> unstack s
185# goto r
186# t <2> leaveloop K/2
187# u <2> leaveloop K/2
188# v <1> leavesub[1 ref] K/REFC,1
189EOT_EOT
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
193# 4 <0> pushmark s
194# 5 <0> pushmark s
195# 6 <$> gv(*hash) s
196# 7 <1> rv2hv[t1] lKRM*/1
197# 8 <2> aassign[t2] vKS
198# 9 <;> nextstate(main 560 (eval 15):1) v
199# a <0> pushmark sM
200# b <$> gv(*array) s
201# c <1> rv2av[t3] sKRM/1
202# d <$> gv(*_) s
203# e <1> rv2gv sKRM/1
204# f <{> enteriter(next->q last->t redo->g) lKS
205# r <0> iter s
206# s <|> and(other->g) K/1
207# g <;> nextstate(main 559 (eval 15):1) v
208# h <$> gvsv(*_) s
209# i <$> gv(*hash) s
210# j <1> rv2hv sKR/1
211# k <0> pushmark s
212# l <$> gvsv(*_) s
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
217# q <0> unstack s
218# goto r
219# t <2> leaveloop K/2
220# u <2> leaveloop K/2
221# v <1> leavesub[1 ref] K/REFC,1
222EONT_EONT
223
224
225=for gentest
226
227# chunk: #%hash = map { "\L$_", 1 } @array; # perl guesses EXPR. wrong
228%hash = map { +"\L$_", 1 } @array; # perl guesses BLOCK. right
229
230=cut
231
232checkOptree(note => q{},
233 bcopts => q{-exec},
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
237# 2 <0> pushmark s
238# 3 <0> pushmark s
239# 4 <#> gv[*array] s
240# 5 <1> rv2av[t7] lKM/1
241# 6 <@> mapstart lK*
242# 7 <|> mapwhile(other->8)[t9] lK
243# 8 <0> pushmark s
244# 9 <#> gvsv[*_] s
245# a <1> lc[t4] sK/1
246# b <@> stringify[t5] sK/1
247# c <$> const[IV 1] s
248# d <@> list lK
249# - <@> scope lK
250# goto 7
251# e <0> pushmark s
252# f <#> gv[*hash] s
253# g <1> rv2hv[t2] lKRM*/1
254# h <2> aassign[t10] KS/COMMON
255# i <1> leavesub[1 ref] K/REFC,1
256EOT_EOT
257# 1 <;> nextstate(main 560 (eval 15):1) v
258# 2 <0> pushmark s
259# 3 <0> pushmark s
260# 4 <$> gv(*array) s
261# 5 <1> rv2av[t4] lKM/1
262# 6 <@> mapstart lK*
263# 7 <|> mapwhile(other->8)[t5] lK
264# 8 <0> pushmark s
265# 9 <$> gvsv(*_) s
266# a <1> lc[t2] sK/1
267# b <@> stringify[t3] sK/1
268# c <$> const(IV 1) s
269# d <@> list lK
270# - <@> scope lK
271# goto 7
272# e <0> pushmark s
273# f <$> gv(*hash) s
274# g <1> rv2hv[t1] lKRM*/1
275# h <2> aassign[t6] KS/COMMON
276# i <1> leavesub[1 ref] K/REFC,1
277EONT_EONT
278
279
280=for gentest
281
282# chunk: %hash = map { ("\L$_", 1) } @array; # this also works
283
284=cut
285
286checkOptree(note => q{},
287 bcopts => q{-exec},
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
291# 2 <0> pushmark s
292# 3 <0> pushmark s
293# 4 <#> gv[*array] s
294# 5 <1> rv2av[t7] lKM/1
295# 6 <@> mapstart lK*
296# 7 <|> mapwhile(other->8)[t9] lK
297# 8 <0> pushmark s
298# 9 <#> gvsv[*_] s
299# a <1> lc[t4] sK/1
300# b <@> stringify[t5] sK/1
301# c <$> const[IV 1] s
302# d <@> list lKP
303# - <@> scope lK
304# goto 7
305# e <0> pushmark s
306# f <#> gv[*hash] s
307# g <1> rv2hv[t2] lKRM*/1
308# h <2> aassign[t10] KS/COMMON
309# i <1> leavesub[1 ref] K/REFC,1
310EOT_EOT
311# 1 <;> nextstate(main 560 (eval 15):1) v
312# 2 <0> pushmark s
313# 3 <0> pushmark s
314# 4 <$> gv(*array) s
315# 5 <1> rv2av[t4] lKM/1
316# 6 <@> mapstart lK*
317# 7 <|> mapwhile(other->8)[t5] lK
318# 8 <0> pushmark s
319# 9 <$> gvsv(*_) s
320# a <1> lc[t2] sK/1
321# b <@> stringify[t3] sK/1
322# c <$> const(IV 1) s
323# d <@> list lKP
324# - <@> scope lK
325# goto 7
326# e <0> pushmark s
327# f <$> gv(*hash) s
328# g <1> rv2hv[t1] lKRM*/1
329# h <2> aassign[t6] KS/COMMON
330# i <1> leavesub[1 ref] K/REFC,1
331EONT_EONT
332
333
334=for gentest
335
336# chunk: %hash = map { lc($_), 1 } @array; # as does this.
337
338=cut
339
340checkOptree(note => q{},
341 bcopts => q{-exec},
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
345# 2 <0> pushmark s
346# 3 <0> pushmark s
347# 4 <#> gv[*array] s
348# 5 <1> rv2av[t6] lKM/1
349# 6 <@> mapstart lK*
350# 7 <|> mapwhile(other->8)[t8] lK
351# 8 <0> pushmark s
352# 9 <#> gvsv[*_] s
353# a <1> lc[t4] sK/1
354# b <$> const[IV 1] s
355# c <@> list lK
356# - <@> scope lK
357# goto 7
358# d <0> pushmark s
359# e <#> gv[*hash] s
360# f <1> rv2hv[t2] lKRM*/1
361# g <2> aassign[t9] KS/COMMON
362# h <1> leavesub[1 ref] K/REFC,1
363EOT_EOT
364# 1 <;> nextstate(main 589 (eval 26):1) v
365# 2 <0> pushmark s
366# 3 <0> pushmark s
367# 4 <$> gv(*array) s
368# 5 <1> rv2av[t3] lKM/1
369# 6 <@> mapstart lK*
370# 7 <|> mapwhile(other->8)[t4] lK
371# 8 <0> pushmark s
372# 9 <$> gvsv(*_) s
373# a <1> lc[t2] sK/1
374# b <$> const(IV 1) s
375# c <@> list lK
376# - <@> scope lK
377# goto 7
378# d <0> pushmark s
379# e <$> gv(*hash) s
380# f <1> rv2hv[t1] lKRM*/1
381# g <2> aassign[t5] KS/COMMON
382# h <1> leavesub[1 ref] K/REFC,1
383EONT_EONT
384
385
386=for gentest
387
388# chunk: %hash = map +( lc($_), 1 ), @array; # this is EXPR and works!
389
390=cut
391
392checkOptree(note => q{},
393 bcopts => q{-exec},
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
397# 2 <0> pushmark s
398# 3 <0> pushmark s
399# 4 <#> gv[*array] s
400# 5 <1> rv2av[t6] lKM/1
401# 6 <@> mapstart lK
402# 7 <|> mapwhile(other->8)[t7] lK
403# 8 <0> pushmark s
404# 9 <#> gvsv[*_] s
405# a <1> lc[t4] sK/1
406# b <$> const[IV 1] s
407# c <@> list lKP
408# goto 7
409# d <0> pushmark s
410# e <#> gv[*hash] s
411# f <1> rv2hv[t2] lKRM*/1
412# g <2> aassign[t8] KS/COMMON
413# h <1> leavesub[1 ref] K/REFC,1
414EOT_EOT
415# 1 <;> nextstate(main 593 (eval 28):1) v
416# 2 <0> pushmark s
417# 3 <0> pushmark s
418# 4 <$> gv(*array) s
419# 5 <1> rv2av[t3] lKM/1
420# 6 <@> mapstart lK
421# 7 <|> mapwhile(other->8)[t4] lK
422# 8 <0> pushmark s
423# 9 <$> gvsv(*_) s
424# a <1> lc[t2] sK/1
425# b <$> const(IV 1) s
426# c <@> list lKP
427# goto 7
428# d <0> pushmark s
429# e <$> gv(*hash) s
430# f <1> rv2hv[t1] lKRM*/1
431# g <2> aassign[t5] KS/COMMON
432# h <1> leavesub[1 ref] K/REFC,1
433EONT_EONT
434
435
436=for gentest
437
438# chunk: %hash = map ( lc($_), 1 ), @array; # evaluates to (1, @array)
439
440=cut
441
442checkOptree(note => q{},
443 bcopts => q{-exec},
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
447# 2 <0> pushmark s
448# 3 <0> pushmark s
449# 4 <0> pushmark s
450# 5 <$> const[IV 1] sM
451# 6 <@> mapstart lK
452# 7 <|> mapwhile(other->8)[t5] lK
453# 8 <#> gvsv[*_] s
454# 9 <1> lc[t4] sK/1
455# goto 7
456# a <0> pushmark s
457# b <#> gv[*hash] s
458# c <1> rv2hv[t2] lKRM*/1
459# d <2> aassign[t6] KS/COMMON
460# e <#> gv[*array] s
461# f <1> rv2av[t8] K/1
462# g <@> list K
463# h <1> leavesub[1 ref] K/REFC,1
464EOT_EOT
465# 1 <;> nextstate(main 597 (eval 30):1) v
466# 2 <0> pushmark s
467# 3 <0> pushmark s
468# 4 <0> pushmark s
469# 5 <$> const(IV 1) sM
470# 6 <@> mapstart lK
471# 7 <|> mapwhile(other->8)[t3] lK
472# 8 <$> gvsv(*_) s
473# 9 <1> lc[t2] sK/1
474# goto 7
475# a <0> pushmark s
476# b <$> gv(*hash) s
477# c <1> rv2hv[t1] lKRM*/1
478# d <2> aassign[t4] KS/COMMON
479# e <$> gv(*array) s
480# f <1> rv2av[t5] K/1
481# g <@> list K
482# h <1> leavesub[1 ref] K/REFC,1
483EONT_EONT
484
485
486=for gentest
487
488# chunk: @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
489
490=cut
491
492checkOptree(note => q{},
493 bcopts => q{-exec},
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
497# 2 <0> pushmark s
498# 3 <0> pushmark s
499# 4 <#> gv[*array] s
500# 5 <1> rv2av[t6] lKM/1
501# 6 <@> mapstart lK
502# 7 <|> mapwhile(other->8)[t7] lK
503# 8 <0> pushmark s
504# 9 <#> gvsv[*_] s
505# a <1> lc[t4] sK/1
506# b <$> const[IV 1] s
507# c <@> anonhash sKRM/1
508# d <1> srefgen sK/1
509# goto 7
510# e <0> pushmark s
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
515EOT_EOT
516# 1 <;> nextstate(main 601 (eval 32):1) v
517# 2 <0> pushmark s
518# 3 <0> pushmark s
519# 4 <$> gv(*array) s
520# 5 <1> rv2av[t3] lKM/1
521# 6 <@> mapstart lK
522# 7 <|> mapwhile(other->8)[t4] lK
523# 8 <0> pushmark s
524# 9 <$> gvsv(*_) s
525# a <1> lc[t2] sK/1
526# b <$> const(IV 1) s
527# c <@> anonhash sKRM/1
528# d <1> srefgen sK/1
529# goto 7
530# e <0> pushmark s
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
535EONT_EONT