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