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