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