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