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