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