Overeager visited-positions optimizations
[p5sagit/p5-mst-13.2.git] / t / lib / b.t
CommitLineData
ccc418af 1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
ccc418af 6}
7
8$| = 1;
9use warnings;
10use strict;
11use Config;
12
de3f1649 13print "1..15\n";
ccc418af 14
15my $test = 1;
16
17sub ok { print "ok $test\n"; $test++ }
18
19use B::Deparse;
20my $deparse = B::Deparse->new() or print "not ";
21ok;
22
23print "not " if "{\n 1;\n}" ne $deparse->coderef2text(sub {1});
24ok;
25
26print "not " if "{\n '???';\n 2;\n}" ne
27 $deparse->coderef2text(sub {1;2});
28ok;
29
30print "not " if "{\n \$test /= 2 if ++\$test;\n}" ne
31 $deparse->coderef2text(sub {++$test and $test/=2;});
32ok;
9b86dfa2 33{
34my $a = <<'EOF';
35{
36 $test = sub : lvalue {
37 1;
38 }
39 ;
40}
41EOF
42chomp $a;
43print "not " if $deparse->coderef2text(sub{$test = sub : lvalue { 1 }}) ne $a;
44ok;
45
46$a =~ s/lvalue/method/;
47print "not " if $deparse->coderef2text(sub{$test = sub : method { 1 }}) ne $a;
48ok;
49
50$a =~ s/method/locked method/;
51print "not " if $deparse->coderef2text(sub{$test = sub : method locked { 1 }})
52 ne $a;
53ok;
54}
ccc418af 55
de3f1649 56print "not " if (eval "sub ".$deparse->coderef2text(sub () { 42 }))->() != 42;
57ok;
58
59use constant 'c', 'stuff';
60print "not " if (eval "sub ".$deparse->coderef2text(\&c))->() ne 'stuff';
61ok;
62
63# XXX ToDo - constsub that returns a reference
64#use constant cr => ['hello'];
65#my $string = "sub " . $deparse->coderef2text(\&cr);
66#my $val = (eval $string)->();
67#print "not " if ref($val) ne 'ARRAY' || $val->[0] ne 'hello';
68#ok;
69
885a8af1 70my $a;
71my $Is_VMS = $^O eq 'VMS';
6b462c4a 72$a = `$^X "-I../lib" "-MO=Deparse" -anle 1 2>&1`;
5fb4d820 73$a =~ s/-e syntax OK\n//g;
ccc418af 74$b = <<'EOF';
ccc418af 75
76LINE: while (defined($_ = <ARGV>)) {
77 chomp $_;
78 @F = split(/\s+/, $_, 0);
79 '???'
80}
81continue {
82 '???'
83}
84
85EOF
5fb4d820 86print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 87ok;
88
6b462c4a 89$a = `$^X "-I../lib" "-MO=Debug" -e 1 2>&1`;
ccc418af 90print "not " unless $a =~
91/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
92ok;
93
6b462c4a 94$a = `$^X "-I../lib" "-MO=Terse" -e 1 2>&1`;
ccc418af 95print "not " unless $a =~
96/\bLISTOP\b.*leave.*\bOP\b.*enter.*\bCOP\b.*nextstate.*\bOP\b.*null/s;
97ok;
98
6b462c4a 99$a = `$^X "-I../lib" "-MO=Terse" -ane "s/foo/bar/" 2>&1`;
ccc418af 100$a =~ s/\(0x[^)]+\)//g;
101$a =~ s/\[[^\]]+\]//g;
102$a =~ s/-e syntax OK//;
103$a =~ s/[^a-z ]+//g;
104$a =~ s/\s+/ /g;
b2ec7025 105$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
ccc418af 106$a =~ s/^\s+//;
107$a =~ s/\s+$//;
208edb77 108my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
109if ($is_thread) {
cfe9256d 110 $b=<<EOF;
111leave enter nextstate label leaveloop enterloop null and defined null
112threadsv readline gv lineseq nextstate aassign null pushmark split pushre
113threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
114EOF
115} else {
116 $b=<<EOF;
ccc418af 117leave enter nextstate label leaveloop enterloop null and defined null
118null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
cfe9256d 119null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
ccc418af 120EOF
cfe9256d 121}
ccc418af 122$b=~s/\n/ /g;$b=~s/\s+/ /g;
123$b =~ s/\s+$//;
cfe9256d 124print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 125ok;
126
6b462c4a 127chomp($a = `$^X "-I../lib" "-MB::Stash" "-Mwarnings" -e1`);
ccc418af 128$a = join ',', sort split /,/, $a;
3ca0b005 129$a =~ s/-u(perlio|open)(?:::\w+)?,//g if defined $Config{'useperlio'} and $Config{'useperlio'} eq 'define';
754a99e1 130$a =~ s/-uWin32,// if $^O eq 'MSWin32';
131$a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
5d129265 132$a =~ s/-uCwd,// if $^O eq 'cygwin';
f3ff050f 133if ($Config{static_ext} eq ' ') {
134 $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
135 . '-umain,-uwarnings';
136 print "# [$a] vs [$b]\nnot " if $a ne $b;
137 ok;
138} else {
139 print "ok $test # skipped: one or more static extensions\n"; $test++;
140}
ccc418af 141
208edb77 142if ($is_thread) {
cfe9256d 143 print "# use5005threads: test $test skipped\n";
144} else {
6b462c4a 145 $a = `$^X "-I../lib" "-MO=Showlex" -e "my %one" 2>&1`;
cfe9256d 146 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
885a8af1 147}
ccc418af 148ok;