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