xref: /openbsd/gnu/usr.bin/perl/ext/B/t/optree_samples.t (revision 404b540a)
1#!perl
2
3BEGIN {
4    if ($ENV{PERL_CORE}){
5	chdir('t') if -d 't';
6	@INC = ('.', '../lib', '../ext/B/t');
7    } else {
8	unshift @INC, 't';
9	push @INC, "../../t";
10    }
11    require Config;
12    if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13        print "1..0 # Skip -- Perl configured without B module\n";
14        exit 0;
15    }
16    # require 'test.pl'; # now done by OptreeCheck
17}
18use OptreeCheck;
19use Config;
20plan tests	=> 20;
21SKIP: {
22    skip "no perlio in this build", 20 unless $Config::Config{useperlio};
23
24pass("GENERAL OPTREE EXAMPLES");
25
26pass("IF,THEN,ELSE, ?:");
27
28checkOptree ( name	=> '-basic sub {if shift print then,else}',
29	      bcopts	=> '-basic',
30	      code	=> sub { if (shift) { print "then" }
31				 else       { print "else" }
32			     },
33	      strip_open_hints => 1,
34	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
35# 9  <1> leavesub[1 ref] K/REFC,1 ->(end)
36# -     <@> lineseq KP ->9
37# 1        <;> nextstate(main 426 optree.t:16) v:>,<,% ->2
38# -        <1> null K/1 ->-
39# 5           <|> cond_expr(other->6) K/1 ->a
40# 4              <1> shift sK/1 ->5
41# 3                 <1> rv2av[t2] sKRM/1 ->4
42# 2                    <#> gv[*_] s ->3
43# -              <@> scope K ->-
44# -                 <0> ex-nextstate v ->6
45# 8                 <@> print sK ->9
46# 6                    <0> pushmark s ->7
47# 7                    <$> const[PV "then"] s ->8
48# f              <@> leave KP ->9
49# a                 <0> enter ->b
50# b                 <;> nextstate(main 424 optree.t:17) v:>,<,% ->c
51# e                 <@> print sK ->f
52# c                    <0> pushmark s ->d
53# d                    <$> const[PV "else"] s ->e
54EOT_EOT
55# 9  <1> leavesub[1 ref] K/REFC,1 ->(end)
56# -     <@> lineseq KP ->9
57# 1        <;> nextstate(main 427 optree_samples.t:18) v:>,<,% ->2
58# -        <1> null K/1 ->-
59# 5           <|> cond_expr(other->6) K/1 ->a
60# 4              <1> shift sK/1 ->5
61# 3                 <1> rv2av[t1] sKRM/1 ->4
62# 2                    <$> gv(*_) s ->3
63# -              <@> scope K ->-
64# -                 <0> ex-nextstate v ->6
65# 8                 <@> print sK ->9
66# 6                    <0> pushmark s ->7
67# 7                    <$> const(PV "then") s ->8
68# f              <@> leave KP ->9
69# a                 <0> enter ->b
70# b                 <;> nextstate(main 425 optree_samples.t:19) v:>,<,% ->c
71# e                 <@> print sK ->f
72# c                    <0> pushmark s ->d
73# d                    <$> const(PV "else") s ->e
74EONT_EONT
75
76checkOptree ( name	=> '-basic (see above, with my $a = shift)',
77	      bcopts	=> '-basic',
78	      code	=> sub { my $a = shift;
79				 if ($a) { print "foo" }
80				 else    { print "bar" }
81			     },
82	      strip_open_hints => 1,
83	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
84# d  <1> leavesub[1 ref] K/REFC,1 ->(end)
85# -     <@> lineseq KP ->d
86# 1        <;> nextstate(main 431 optree.t:68) v:>,<,% ->2
87# 6        <2> sassign vKS/2 ->7
88# 4           <1> shift sK/1 ->5
89# 3              <1> rv2av[t3] sKRM/1 ->4
90# 2                 <#> gv[*_] s ->3
91# 5           <0> padsv[$a:431,435] sRM*/LVINTRO ->6
92# 7        <;> nextstate(main 435 optree.t:69) v:>,<,% ->8
93# -        <1> null K/1 ->-
94# 9           <|> cond_expr(other->a) K/1 ->e
95# 8              <0> padsv[$a:431,435] s ->9
96# -              <@> scope K ->-
97# -                 <0> ex-nextstate v ->a
98# c                 <@> print sK ->d
99# a                    <0> pushmark s ->b
100# b                    <$> const[PV "foo"] s ->c
101# j              <@> leave KP ->d
102# e                 <0> enter ->f
103# f                 <;> nextstate(main 433 optree.t:70) v:>,<,% ->g
104# i                 <@> print sK ->j
105# g                    <0> pushmark s ->h
106# h                    <$> const[PV "bar"] s ->i
107EOT_EOT
108# d  <1> leavesub[1 ref] K/REFC,1 ->(end)
109# -     <@> lineseq KP ->d
110# 1        <;> nextstate(main 428 optree_samples.t:48) v:>,<,% ->2
111# 6        <2> sassign vKS/2 ->7
112# 4           <1> shift sK/1 ->5
113# 3              <1> rv2av[t2] sKRM/1 ->4
114# 2                 <$> gv(*_) s ->3
115# 5           <0> padsv[$a:428,432] sRM*/LVINTRO ->6
116# 7        <;> nextstate(main 432 optree_samples.t:49) v:>,<,% ->8
117# -        <1> null K/1 ->-
118# 9           <|> cond_expr(other->a) K/1 ->e
119# 8              <0> padsv[$a:428,432] s ->9
120# -              <@> scope K ->-
121# -                 <0> ex-nextstate v ->a
122# c                 <@> print sK ->d
123# a                    <0> pushmark s ->b
124# b                    <$> const(PV "foo") s ->c
125# j              <@> leave KP ->d
126# e                 <0> enter ->f
127# f                 <;> nextstate(main 430 optree_samples.t:50) v:>,<,% ->g
128# i                 <@> print sK ->j
129# g                    <0> pushmark s ->h
130# h                    <$> const(PV "bar") s ->i
131EONT_EONT
132
133checkOptree ( name	=> '-exec sub {if shift print then,else}',
134	      bcopts	=> '-exec',
135	      code	=> sub { if (shift) { print "then" }
136				 else       { print "else" }
137			     },
138	      strip_open_hints => 1,
139	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
140# 1  <;> nextstate(main 426 optree.t:16) v:>,<,%
141# 2  <#> gv[*_] s
142# 3  <1> rv2av[t2] sKRM/1
143# 4  <1> shift sK/1
144# 5  <|> cond_expr(other->6) K/1
145# 6      <0> pushmark s
146# 7      <$> const[PV "then"] s
147# 8      <@> print sK
148#            goto 9
149# a  <0> enter
150# b  <;> nextstate(main 424 optree.t:17) v:>,<,%
151# c  <0> pushmark s
152# d  <$> const[PV "else"] s
153# e  <@> print sK
154# f  <@> leave KP
155# 9  <1> leavesub[1 ref] K/REFC,1
156EOT_EOT
157# 1  <;> nextstate(main 436 optree_samples.t:123) v:>,<,%
158# 2  <$> gv(*_) s
159# 3  <1> rv2av[t1] sKRM/1
160# 4  <1> shift sK/1
161# 5  <|> cond_expr(other->6) K/1
162# 6      <0> pushmark s
163# 7      <$> const(PV "then") s
164# 8      <@> print sK
165#            goto 9
166# a  <0> enter
167# b  <;> nextstate(main 434 optree_samples.t:124) v:>,<,%
168# c  <0> pushmark s
169# d  <$> const(PV "else") s
170# e  <@> print sK
171# f  <@> leave KP
172# 9  <1> leavesub[1 ref] K/REFC,1
173EONT_EONT
174
175checkOptree ( name	=> '-exec (see above, with my $a = shift)',
176	      bcopts	=> '-exec',
177	      code	=> sub { my $a = shift;
178				 if ($a) { print "foo" }
179				 else    { print "bar" }
180			     },
181	      strip_open_hints => 1,
182	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
183# 1  <;> nextstate(main 423 optree.t:16) v:>,<,%
184# 2  <#> gv[*_] s
185# 3  <1> rv2av[t3] sKRM/1
186# 4  <1> shift sK/1
187# 5  <0> padsv[$a:423,427] sRM*/LVINTRO
188# 6  <2> sassign vKS/2
189# 7  <;> nextstate(main 427 optree.t:17) v:>,<,%
190# 8  <0> padsv[$a:423,427] s
191# 9  <|> cond_expr(other->a) K/1
192# a      <0> pushmark s
193# b      <$> const[PV "foo"] s
194# c      <@> print sK
195#            goto d
196# e  <0> enter
197# f  <;> nextstate(main 425 optree.t:18) v:>,<,%
198# g  <0> pushmark s
199# h  <$> const[PV "bar"] s
200# i  <@> print sK
201# j  <@> leave KP
202# d  <1> leavesub[1 ref] K/REFC,1
203EOT_EOT
204# 1  <;> nextstate(main 437 optree_samples.t:112) v:>,<,%
205# 2  <$> gv(*_) s
206# 3  <1> rv2av[t2] sKRM/1
207# 4  <1> shift sK/1
208# 5  <0> padsv[$a:437,441] sRM*/LVINTRO
209# 6  <2> sassign vKS/2
210# 7  <;> nextstate(main 441 optree_samples.t:113) v:>,<,%
211# 8  <0> padsv[$a:437,441] s
212# 9  <|> cond_expr(other->a) K/1
213# a      <0> pushmark s
214# b      <$> const(PV "foo") s
215# c      <@> print sK
216#            goto d
217# e  <0> enter
218# f  <;> nextstate(main 439 optree_samples.t:114) v:>,<,%
219# g  <0> pushmark s
220# h  <$> const(PV "bar") s
221# i  <@> print sK
222# j  <@> leave KP
223# d  <1> leavesub[1 ref] K/REFC,1
224EONT_EONT
225
226checkOptree ( name	=> '-exec sub { print (shift) ? "foo" : "bar" }',
227	      code	=> sub { print (shift) ? "foo" : "bar" },
228	      bcopts	=> '-exec',
229	      strip_open_hints => 1,
230	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
231# 1  <;> nextstate(main 428 optree.t:31) v:>,<,%
232# 2  <0> pushmark s
233# 3  <#> gv[*_] s
234# 4  <1> rv2av[t2] sKRM/1
235# 5  <1> shift sK/1
236# 6  <@> print sK
237# 7  <|> cond_expr(other->8) K/1
238# 8      <$> const[PV "foo"] s
239#            goto 9
240# a  <$> const[PV "bar"] s
241# 9  <1> leavesub[1 ref] K/REFC,1
242EOT_EOT
243# 1  <;> nextstate(main 442 optree_samples.t:144) v:>,<,%
244# 2  <0> pushmark s
245# 3  <$> gv(*_) s
246# 4  <1> rv2av[t1] sKRM/1
247# 5  <1> shift sK/1
248# 6  <@> print sK
249# 7  <|> cond_expr(other->8) K/1
250# 8      <$> const(PV "foo") s
251#            goto 9
252# a  <$> const(PV "bar") s
253# 9  <1> leavesub[1 ref] K/REFC,1
254EONT_EONT
255
256pass ("FOREACH");
257
258checkOptree ( name	=> '-exec sub { foreach (1..10) {print "foo $_"} }',
259	      code	=> sub { foreach (1..10) {print "foo $_"} },
260	      bcopts	=> '-exec',
261	      strip_open_hints => 1,
262	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
263# 1  <;> nextstate(main 443 optree.t:158) v:>,<,%
264# 2  <0> pushmark s
265# 3  <$> const[IV 1] s
266# 4  <$> const[IV 10] s
267# 5  <#> gv[*_] s
268# 6  <{> enteriter(next->d last->g redo->7) lKS/8
269# e  <0> iter s
270# f  <|> and(other->7) K/1
271# 7      <;> nextstate(main 442 optree.t:158) v:>,<,%
272# 8      <0> pushmark s
273# 9      <$> const[PV "foo "] s
274# a      <#> gvsv[*_] s
275# b      <2> concat[t4] sK/2
276# c      <@> print vK
277# d      <0> unstack s
278#            goto e
279# g  <2> leaveloop K/2
280# h  <1> leavesub[1 ref] K/REFC,1
281EOT_EOT
282# 1  <;> nextstate(main 444 optree_samples.t:182) v:>,<,%
283# 2  <0> pushmark s
284# 3  <$> const(IV 1) s
285# 4  <$> const(IV 10) s
286# 5  <$> gv(*_) s
287# 6  <{> enteriter(next->d last->g redo->7) lKS/8
288# e  <0> iter s
289# f  <|> and(other->7) K/1
290# 7      <;> nextstate(main 443 optree_samples.t:182) v:>,<,%
291# 8      <0> pushmark s
292# 9      <$> const(PV "foo ") s
293# a      <$> gvsv(*_) s
294# b      <2> concat[t3] sK/2
295# c      <@> print vK
296# d      <0> unstack s
297#            goto e
298# g  <2> leaveloop K/2
299# h  <1> leavesub[1 ref] K/REFC,1
300EONT_EONT
301
302checkOptree ( name	=> '-basic sub { print "foo $_" foreach (1..10) }',
303	      code	=> sub { print "foo $_" foreach (1..10) },
304	      bcopts	=> '-basic',
305	      strip_open_hints => 1,
306	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
307# h  <1> leavesub[1 ref] K/REFC,1 ->(end)
308# -     <@> lineseq KP ->h
309# 1        <;> nextstate(main 445 optree.t:167) v:>,<,% ->2
310# 2        <;> nextstate(main 445 optree.t:167) v:>,<,% ->3
311# g        <2> leaveloop K/2 ->h
312# 7           <{> enteriter(next->d last->g redo->8) lKS/8 ->e
313# -              <0> ex-pushmark s ->3
314# -              <1> ex-list lK ->6
315# 3                 <0> pushmark s ->4
316# 4                 <$> const[IV 1] s ->5
317# 5                 <$> const[IV 10] s ->6
318# 6              <#> gv[*_] s ->7
319# -           <1> null K/1 ->g
320# f              <|> and(other->8) K/1 ->g
321# e                 <0> iter s ->f
322# -                 <@> lineseq sK ->-
323# c                    <@> print vK ->d
324# 8                       <0> pushmark s ->9
325# -                       <1> ex-stringify sK/1 ->c
326# -                          <0> ex-pushmark s ->9
327# b                          <2> concat[t2] sK/2 ->c
328# 9                             <$> const[PV "foo "] s ->a
329# -                             <1> ex-rv2sv sK/1 ->b
330# a                                <#> gvsv[*_] s ->b
331# d                    <0> unstack s ->e
332EOT_EOT
333# h  <1> leavesub[1 ref] K/REFC,1 ->(end)
334# -     <@> lineseq KP ->h
335# 1        <;> nextstate(main 446 optree_samples.t:192) v:>,<,% ->2
336# 2        <;> nextstate(main 446 optree_samples.t:192) v:>,<,% ->3
337# g        <2> leaveloop K/2 ->h
338# 7           <{> enteriter(next->d last->g redo->8) lKS/8 ->e
339# -              <0> ex-pushmark s ->3
340# -              <1> ex-list lK ->6
341# 3                 <0> pushmark s ->4
342# 4                 <$> const(IV 1) s ->5
343# 5                 <$> const(IV 10) s ->6
344# 6              <$> gv(*_) s ->7
345# -           <1> null K/1 ->g
346# f              <|> and(other->8) K/1 ->g
347# e                 <0> iter s ->f
348# -                 <@> lineseq sK ->-
349# c                    <@> print vK ->d
350# 8                       <0> pushmark s ->9
351# -                       <1> ex-stringify sK/1 ->c
352# -                          <0> ex-pushmark s ->9
353# b                          <2> concat[t1] sK/2 ->c
354# 9                             <$> const(PV "foo ") s ->a
355# -                             <1> ex-rv2sv sK/1 ->b
356# a                                <$> gvsv(*_) s ->b
357# d                    <0> unstack s ->e
358EONT_EONT
359
360checkOptree ( name	=> '-exec -e foreach (1..10) {print qq{foo $_}}',
361	      prog	=> 'foreach (1..10) {print qq{foo $_}}',
362	      bcopts	=> '-exec',
363	      strip_open_hints => 1,
364	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
365# 1  <0> enter
366# 2  <;> nextstate(main 2 -e:1) v:>,<,%
367# 3  <0> pushmark s
368# 4  <$> const[IV 1] s
369# 5  <$> const[IV 10] s
370# 6  <#> gv[*_] s
371# 7  <{> enteriter(next->e last->h redo->8) lKS/8
372# f  <0> iter s
373# g  <|> and(other->8) vK/1
374# 8      <;> nextstate(main 1 -e:1) v:>,<,%
375# 9      <0> pushmark s
376# a      <$> const[PV "foo "] s
377# b      <#> gvsv[*_] s
378# c      <2> concat[t4] sK/2
379# d      <@> print vK
380# e      <0> unstack v
381#            goto f
382# h  <2> leaveloop vK/2
383# i  <@> leave[1 ref] vKP/REFC
384EOT_EOT
385# 1  <0> enter
386# 2  <;> nextstate(main 2 -e:1) v:>,<,%
387# 3  <0> pushmark s
388# 4  <$> const(IV 1) s
389# 5  <$> const(IV 10) s
390# 6  <$> gv(*_) s
391# 7  <{> enteriter(next->e last->h redo->8) lKS/8
392# f  <0> iter s
393# g  <|> and(other->8) vK/1
394# 8      <;> nextstate(main 1 -e:1) v:>,<,%
395# 9      <0> pushmark s
396# a      <$> const(PV "foo ") s
397# b      <$> gvsv(*_) s
398# c      <2> concat[t3] sK/2
399# d      <@> print vK
400# e      <0> unstack v
401#            goto f
402# h  <2> leaveloop vK/2
403# i  <@> leave[1 ref] vKP/REFC
404EONT_EONT
405
406checkOptree ( name	=> '-exec sub { print "foo $_" foreach (1..10) }',
407	      code	=> sub { print "foo $_" foreach (1..10) },
408	      bcopts	=> '-exec',
409	      strip_open_hints => 1,
410	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
411# 1  <;> nextstate(main 445 optree.t:167) v:>,<,%
412# 2  <;> nextstate(main 445 optree.t:167) v:>,<,%
413# 3  <0> pushmark s
414# 4  <$> const[IV 1] s
415# 5  <$> const[IV 10] s
416# 6  <#> gv[*_] s
417# 7  <{> enteriter(next->d last->g redo->8) lKS/8
418# e  <0> iter s
419# f  <|> and(other->8) K/1
420# 8      <0> pushmark s
421# 9      <$> const[PV "foo "] s
422# a      <#> gvsv[*_] s
423# b      <2> concat[t2] sK/2
424# c      <@> print vK
425# d      <0> unstack s
426#            goto e
427# g  <2> leaveloop K/2
428# h  <1> leavesub[1 ref] K/REFC,1
429EOT_EOT
430# 1  <;> nextstate(main 447 optree_samples.t:252) v:>,<,%
431# 2  <;> nextstate(main 447 optree_samples.t:252) v:>,<,%
432# 3  <0> pushmark s
433# 4  <$> const(IV 1) s
434# 5  <$> const(IV 10) s
435# 6  <$> gv(*_) s
436# 7  <{> enteriter(next->d last->g redo->8) lKS/8
437# e  <0> iter s
438# f  <|> and(other->8) K/1
439# 8      <0> pushmark s
440# 9      <$> const(PV "foo ") s
441# a      <$> gvsv(*_) s
442# b      <2> concat[t1] sK/2
443# c      <@> print vK
444# d      <0> unstack s
445#            goto e
446# g  <2> leaveloop K/2
447# h  <1> leavesub[1 ref] K/REFC,1
448EONT_EONT
449
450pass("GREP: SAMPLES FROM PERLDOC -F GREP");
451
452checkOptree ( name	=> '@foo = grep(!/^\#/, @bar)',
453	      code	=> '@foo = grep(!/^\#/, @bar)',
454	      bcopts	=> '-exec',
455	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
456# 1  <;> nextstate(main 496 (eval 20):1) v:{
457# 2  <0> pushmark s
458# 3  <0> pushmark s
459# 4  <#> gv[*bar] s
460# 5  <1> rv2av[t4] lKM/1
461# 6  <@> grepstart lK
462# 7  <|> grepwhile(other->8)[t5] lK
463# 8      </> match(/"^#"/) s/RTIME
464# 9      <1> not sK/1
465#            goto 7
466# a  <0> pushmark s
467# b  <#> gv[*foo] s
468# c  <1> rv2av[t2] lKRM*/1
469# d  <2> aassign[t6] KS/COMMON
470# e  <1> leavesub[1 ref] K/REFC,1
471EOT_EOT
472# 1  <;> nextstate(main 496 (eval 20):1) v:{
473# 2  <0> pushmark s
474# 3  <0> pushmark s
475# 4  <$> gv(*bar) s
476# 5  <1> rv2av[t2] lKM/1
477# 6  <@> grepstart lK
478# 7  <|> grepwhile(other->8)[t3] lK
479# 8      </> match(/"^\\#"/) s/RTIME
480# 9      <1> not sK/1
481#            goto 7
482# a  <0> pushmark s
483# b  <$> gv(*foo) s
484# c  <1> rv2av[t1] lKRM*/1
485# d  <2> aassign[t4] KS/COMMON
486# e  <1> leavesub[1 ref] K/REFC,1
487EONT_EONT
488
489
490pass("MAP: SAMPLES FROM PERLDOC -F MAP");
491
492checkOptree ( name	=> '%h = map { getkey($_) => $_ } @a',
493	      code	=> '%h = map { getkey($_) => $_ } @a',
494	      bcopts	=> '-exec',
495	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
496# 1  <;> nextstate(main 501 (eval 22):1) v:{
497# 2  <0> pushmark s
498# 3  <0> pushmark s
499# 4  <#> gv[*a] s
500# 5  <1> rv2av[t8] lKM/1
501# 6  <@> mapstart lK*
502# 7  <|> mapwhile(other->8)[t9] lK
503# 8      <0> enter l
504# 9      <;> nextstate(main 500 (eval 22):1) v:{
505# a      <0> pushmark s
506# b      <0> pushmark s
507# c      <#> gvsv[*_] s
508# d      <#> gv[*getkey] s/EARLYCV
509# e      <1> entersub[t5] lKS/TARG,1
510# f      <#> gvsv[*_] s
511# g      <@> list lK
512# h      <@> leave lKP
513#            goto 7
514# i  <0> pushmark s
515# j  <#> gv[*h] s
516# k  <1> rv2hv[t2] lKRM*/1
517# l  <2> aassign[t10] KS/COMMON
518# m  <1> leavesub[1 ref] K/REFC,1
519EOT_EOT
520# 1  <;> nextstate(main 501 (eval 22):1) v:{
521# 2  <0> pushmark s
522# 3  <0> pushmark s
523# 4  <$> gv(*a) s
524# 5  <1> rv2av[t3] lKM/1
525# 6  <@> mapstart lK*
526# 7  <|> mapwhile(other->8)[t4] lK
527# 8      <0> enter l
528# 9      <;> nextstate(main 500 (eval 22):1) v:{
529# a      <0> pushmark s
530# b      <0> pushmark s
531# c      <$> gvsv(*_) s
532# d      <$> gv(*getkey) s/EARLYCV
533# e      <1> entersub[t2] lKS/TARG,1
534# f      <$> gvsv(*_) s
535# g      <@> list lK
536# h      <@> leave lKP
537#            goto 7
538# i  <0> pushmark s
539# j  <$> gv(*h) s
540# k  <1> rv2hv[t1] lKRM*/1
541# l  <2> aassign[t5] KS/COMMON
542# m  <1> leavesub[1 ref] K/REFC,1
543EONT_EONT
544
545checkOptree ( name	=> '%h=(); for $_(@a){$h{getkey($_)} = $_}',
546	      code	=> '%h=(); for $_(@a){$h{getkey($_)} = $_}',
547	      bcopts	=> '-exec',
548	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
549# 1  <;> nextstate(main 505 (eval 24):1) v
550# 2  <0> pushmark s
551# 3  <0> pushmark s
552# 4  <#> gv[*h] s
553# 5  <1> rv2hv[t2] lKRM*/1
554# 6  <2> aassign[t3] vKS
555# 7  <;> nextstate(main 506 (eval 24):1) v:{
556# 8  <0> pushmark sM
557# 9  <#> gv[*a] s
558# a  <1> rv2av[t6] sKRM/1
559# b  <#> gv[*_] s
560# c  <1> rv2gv sKRM/1
561# d  <{> enteriter(next->o last->r redo->e) lKS/8
562# p  <0> iter s
563# q  <|> and(other->e) K/1
564# e      <;> nextstate(main 505 (eval 24):1) v:{
565# f      <#> gvsv[*_] s
566# g      <#> gv[*h] s
567# h      <1> rv2hv sKR/1
568# i      <0> pushmark s
569# j      <#> gvsv[*_] s
570# k      <#> gv[*getkey] s/EARLYCV
571# l      <1> entersub[t10] sKS/TARG,1
572# m      <2> helem sKRM*/2
573# n      <2> sassign vKS/2
574# o      <0> unstack s
575#            goto p
576# r  <2> leaveloop K/2
577# s  <1> leavesub[1 ref] K/REFC,1
578EOT_EOT
579# 1  <;> nextstate(main 505 (eval 24):1) v
580# 2  <0> pushmark s
581# 3  <0> pushmark s
582# 4  <$> gv(*h) s
583# 5  <1> rv2hv[t1] lKRM*/1
584# 6  <2> aassign[t2] vKS
585# 7  <;> nextstate(main 506 (eval 24):1) v:{
586# 8  <0> pushmark sM
587# 9  <$> gv(*a) s
588# a  <1> rv2av[t3] sKRM/1
589# b  <$> gv(*_) s
590# c  <1> rv2gv sKRM/1
591# d  <{> enteriter(next->o last->r redo->e) lKS/8
592# p  <0> iter s
593# q  <|> and(other->e) K/1
594# e      <;> nextstate(main 505 (eval 24):1) v:{
595# f      <$> gvsv(*_) s
596# g      <$> gv(*h) s
597# h      <1> rv2hv sKR/1
598# i      <0> pushmark s
599# j      <$> gvsv(*_) s
600# k      <$> gv(*getkey) s/EARLYCV
601# l      <1> entersub[t4] sKS/TARG,1
602# m      <2> helem sKRM*/2
603# n      <2> sassign vKS/2
604# o      <0> unstack s
605#            goto p
606# r  <2> leaveloop K/2
607# s  <1> leavesub[1 ref] K/REFC,1
608EONT_EONT
609
610checkOptree ( name	=> 'map $_+42, 10..20',
611	      code	=> 'map $_+42, 10..20',
612	      bcopts	=> '-exec',
613	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
614# 1  <;> nextstate(main 497 (eval 20):1) v
615# 2  <0> pushmark s
616# 3  <$> const[AV ] s
617# 4  <1> rv2av lKPM/1
618# 5  <@> mapstart K
619# 6  <|> mapwhile(other->7)[t5] K
620# 7      <#> gvsv[*_] s
621# 8      <$> const[IV 42] s
622# 9      <2> add[t2] sK/2
623#            goto 6
624# a  <1> leavesub[1 ref] K/REFC,1
625EOT_EOT
626# 1  <;> nextstate(main 511 (eval 26):1) v
627# 2  <0> pushmark s
628# 3  <$> const(AV ) s
629# 4  <1> rv2av lKPM/1
630# 5  <@> mapstart K
631# 6  <|> mapwhile(other->7)[t4] K
632# 7      <$> gvsv(*_) s
633# 8      <$> const(IV 42) s
634# 9      <2> add[t1] sK/2
635#            goto 6
636# a  <1> leavesub[1 ref] K/REFC,1
637EONT_EONT
638
639pass("CONSTANTS");
640
641checkOptree ( name	=> '-e use constant j => qq{junk}; print j',
642	      prog	=> 'use constant j => qq{junk}; print j',
643	      bcopts	=> '-exec',
644	      strip_open_hints => 1,
645	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
646# 1  <0> enter
647# 2  <;> nextstate(main 71 -e:1) v:>,<,%,{
648# 3  <0> pushmark s
649# 4  <$> const[PV "junk"] s
650# 5  <@> print vK
651# 6  <@> leave[1 ref] vKP/REFC
652EOT_EOT
653# 1  <0> enter
654# 2  <;> nextstate(main 71 -e:1) v:>,<,%,{
655# 3  <0> pushmark s
656# 4  <$> const(PV "junk") s
657# 5  <@> print vK
658# 6  <@> leave[1 ref] vKP/REFC
659EONT_EONT
660
661} # skip
662
663__END__
664
665#######################################################################
666
667checkOptree ( name	=> '-exec sub a { print (shift) ? "foo" : "bar" }',
668	      code	=> sub { print (shift) ? "foo" : "bar" },
669	      bcopts	=> '-exec',
670	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
671   insert threaded reference here
672EOT_EOT
673   insert non-threaded reference here
674EONT_EONT
675
676