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