Integrate perlio:
[p5sagit/p5-mst-13.2.git] / t / lib / b.t
CommitLineData
ccc418af 1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
1b026014 5 if ($^O eq 'MacOS') {
6 @INC = qw(: ::lib ::macos:lib);
7 } else {
8 @INC = '.';
9 push @INC, '../lib';
db5fd395 10 }
ccc418af 11}
12
13$| = 1;
14use warnings;
15use strict;
16use Config;
17
b80b6069 18print "1..18\n";
ccc418af 19
20my $test = 1;
21
22sub ok { print "ok $test\n"; $test++ }
23
24use B::Deparse;
25my $deparse = B::Deparse->new() or print "not ";
26ok;
27
28print "not " if "{\n 1;\n}" ne $deparse->coderef2text(sub {1});
29ok;
30
31print "not " if "{\n '???';\n 2;\n}" ne
32 $deparse->coderef2text(sub {1;2});
33ok;
34
35print "not " if "{\n \$test /= 2 if ++\$test;\n}" ne
36 $deparse->coderef2text(sub {++$test and $test/=2;});
37ok;
b80b6069 38
39print "not " if "{\n -((1, 2) x 2);\n}" ne
40 $deparse->coderef2text(sub {-((1,2)x2)});
41ok;
42
9b86dfa2 43{
44my $a = <<'EOF';
45{
46 $test = sub : lvalue {
78f9721b 47 my $x;
9b86dfa2 48 }
49 ;
50}
51EOF
52chomp $a;
78f9721b 53print "not " if $deparse->coderef2text(sub{$test = sub : lvalue{my $x}}) ne $a;
9b86dfa2 54ok;
55
56$a =~ s/lvalue/method/;
78f9721b 57print "not " if $deparse->coderef2text(sub{$test = sub : method{my $x}}) ne $a;
9b86dfa2 58ok;
59
60$a =~ s/method/locked method/;
78f9721b 61print "not " if $deparse->coderef2text(sub{$test = sub : method locked {my $x}})
9b86dfa2 62 ne $a;
63ok;
64}
ccc418af 65
de3f1649 66print "not " if (eval "sub ".$deparse->coderef2text(sub () { 42 }))->() != 42;
67ok;
68
69use constant 'c', 'stuff';
70print "not " if (eval "sub ".$deparse->coderef2text(\&c))->() ne 'stuff';
71ok;
72
73# XXX ToDo - constsub that returns a reference
74#use constant cr => ['hello'];
75#my $string = "sub " . $deparse->coderef2text(\&cr);
76#my $val = (eval $string)->();
77#print "not " if ref($val) ne 'ARRAY' || $val->[0] ne 'hello';
78#ok;
79
885a8af1 80my $a;
81my $Is_VMS = $^O eq 'VMS';
db5fd395 82my $Is_MacOS = $^O eq 'MacOS';
83
84my $path = join " ", map { qq["-I$_"] } @INC;
85my $redir = $Is_MacOS ? "" : "2>&1";
86
87$a = `$^X $path "-MO=Deparse" -anle 1 $redir`;
5fb4d820 88$a =~ s/-e syntax OK\n//g;
bd145f00 89$a =~ s{\\340\\242}{\\s} if (ord("\\") == 224); # EBCDIC, cp 1047 or 037
90$a =~ s{\\274\\242}{\\s} if (ord("\\") == 188); # $^O eq 'posix-bc'
ccc418af 91$b = <<'EOF';
ccc418af 92
93LINE: while (defined($_ = <ARGV>)) {
94 chomp $_;
95 @F = split(/\s+/, $_, 0);
58cccf98 96 '???';
ccc418af 97}
ccc418af 98
99EOF
5fb4d820 100print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 101ok;
102
db5fd395 103$a = `$^X $path "-MO=Debug" -e 1 $redir`;
ccc418af 104print "not " unless $a =~
105/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
106ok;
107
db5fd395 108$a = `$^X $path "-MO=Terse" -e 1 $redir`;
ccc418af 109print "not " unless $a =~
f72d64f0 110/\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s;
ccc418af 111ok;
112
db5fd395 113$a = `$^X $path "-MO=Terse" -ane "s/foo/bar/" $redir`;
ccc418af 114$a =~ s/\(0x[^)]+\)//g;
115$a =~ s/\[[^\]]+\]//g;
116$a =~ s/-e syntax OK//;
117$a =~ s/[^a-z ]+//g;
118$a =~ s/\s+/ /g;
b2ec7025 119$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
ccc418af 120$a =~ s/^\s+//;
121$a =~ s/\s+$//;
208edb77 122my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
123if ($is_thread) {
cfe9256d 124 $b=<<EOF;
125leave enter nextstate label leaveloop enterloop null and defined null
126threadsv readline gv lineseq nextstate aassign null pushmark split pushre
127threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
128EOF
129} else {
130 $b=<<EOF;
ccc418af 131leave enter nextstate label leaveloop enterloop null and defined null
132null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
cfe9256d 133null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
ccc418af 134EOF
cfe9256d 135}
ccc418af 136$b=~s/\n/ /g;$b=~s/\s+/ /g;
137$b =~ s/\s+$//;
cfe9256d 138print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 139ok;
140
db5fd395 141chomp($a = `$^X $path "-MB::Stash" "-Mwarnings" -e1`);
ccc418af 142$a = join ',', sort split /,/, $a;
3ca0b005 143$a =~ s/-u(perlio|open)(?:::\w+)?,//g if defined $Config{'useperlio'} and $Config{'useperlio'} eq 'define';
754a99e1 144$a =~ s/-uWin32,// if $^O eq 'MSWin32';
145$a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
5d129265 146$a =~ s/-uCwd,// if $^O eq 'cygwin';
f3ff050f 147if ($Config{static_ext} eq ' ') {
148 $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
1b026014 149 . '-umain,-ustrict,-uutf8,-uwarnings';
e5befd65 150 if (ord('A') == 193) { # EBCDIC sort order is qw(a A) not qw(A a)
151 $b = join ',', sort split /,/, $b;
152 }
f3ff050f 153 print "# [$a] vs [$b]\nnot " if $a ne $b;
154 ok;
155} else {
156 print "ok $test # skipped: one or more static extensions\n"; $test++;
157}
ccc418af 158
208edb77 159if ($is_thread) {
cfe9256d 160 print "# use5005threads: test $test skipped\n";
161} else {
db5fd395 162 $a = `$^X $path "-MO=Showlex" -e "my %one" $redir`;
bd145f00 163 if (ord('A') != 193) { # ASCIIish
164 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
1b026014 165 }
bd145f00 166 else { # EBCDICish C<1: PVNV (0x1a7ede34) "%\226\225\205">
167 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%\\[0-9].*sv_undef.*HV/s;
168 }
885a8af1 169}
ccc418af 170ok;
1e1dbab6 171
172# Bug 20001204.07
173{
174my $foo = $deparse->coderef2text(sub { { 234; }});
175# Constants don't get optimised here.
176print "not " unless $foo =~ /{.*{.*234;.*}.*}/sm;
177ok;
178$foo = $deparse->coderef2text(sub { { 234; } continue { 123; } });
1b026014 179print "not " unless $foo =~ /{.*{.*234;.*}.*continue.*{.*123.*}/sm;
1e1dbab6 180ok;
181}