Retract #8552.
[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
1e1dbab6 13print "1..17\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 {
78f9721b 37 my $x;
9b86dfa2 38 }
39 ;
40}
41EOF
42chomp $a;
78f9721b 43print "not " if $deparse->coderef2text(sub{$test = sub : lvalue{my $x}}) ne $a;
9b86dfa2 44ok;
45
46$a =~ s/lvalue/method/;
78f9721b 47print "not " if $deparse->coderef2text(sub{$test = sub : method{my $x}}) ne $a;
9b86dfa2 48ok;
49
50$a =~ s/method/locked method/;
78f9721b 51print "not " if $deparse->coderef2text(sub{$test = sub : method locked {my $x}})
9b86dfa2 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;
bd145f00 74$a =~ s{\\340\\242}{\\s} if (ord("\\") == 224); # EBCDIC, cp 1047 or 037
75$a =~ s{\\274\\242}{\\s} if (ord("\\") == 188); # $^O eq 'posix-bc'
ccc418af 76$b = <<'EOF';
ccc418af 77
78LINE: while (defined($_ = <ARGV>)) {
79 chomp $_;
80 @F = split(/\s+/, $_, 0);
58cccf98 81 '???';
ccc418af 82}
ccc418af 83
84EOF
5fb4d820 85print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 86ok;
87
6b462c4a 88$a = `$^X "-I../lib" "-MO=Debug" -e 1 2>&1`;
ccc418af 89print "not " unless $a =~
90/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
91ok;
92
6b462c4a 93$a = `$^X "-I../lib" "-MO=Terse" -e 1 2>&1`;
ccc418af 94print "not " unless $a =~
f72d64f0 95/\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s;
ccc418af 96ok;
97
6b462c4a 98$a = `$^X "-I../lib" "-MO=Terse" -ane "s/foo/bar/" 2>&1`;
ccc418af 99$a =~ s/\(0x[^)]+\)//g;
100$a =~ s/\[[^\]]+\]//g;
101$a =~ s/-e syntax OK//;
102$a =~ s/[^a-z ]+//g;
103$a =~ s/\s+/ /g;
b2ec7025 104$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
ccc418af 105$a =~ s/^\s+//;
106$a =~ s/\s+$//;
208edb77 107my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
108if ($is_thread) {
cfe9256d 109 $b=<<EOF;
110leave enter nextstate label leaveloop enterloop null and defined null
111threadsv readline gv lineseq nextstate aassign null pushmark split pushre
112threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
113EOF
114} else {
115 $b=<<EOF;
ccc418af 116leave enter nextstate label leaveloop enterloop null and defined null
117null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
cfe9256d 118null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
ccc418af 119EOF
cfe9256d 120}
ccc418af 121$b=~s/\n/ /g;$b=~s/\s+/ /g;
122$b =~ s/\s+$//;
cfe9256d 123print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
ccc418af 124ok;
125
6b462c4a 126chomp($a = `$^X "-I../lib" "-MB::Stash" "-Mwarnings" -e1`);
ccc418af 127$a = join ',', sort split /,/, $a;
3ca0b005 128$a =~ s/-u(perlio|open)(?:::\w+)?,//g if defined $Config{'useperlio'} and $Config{'useperlio'} eq 'define';
754a99e1 129$a =~ s/-uWin32,// if $^O eq 'MSWin32';
130$a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
5d129265 131$a =~ s/-uCwd,// if $^O eq 'cygwin';
f3ff050f 132if ($Config{static_ext} eq ' ') {
133 $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
c6eba773 134 . '-umain,-ustrict,-uwarnings';
f3ff050f 135 print "# [$a] vs [$b]\nnot " if $a ne $b;
136 ok;
137} else {
138 print "ok $test # skipped: one or more static extensions\n"; $test++;
139}
ccc418af 140
208edb77 141if ($is_thread) {
cfe9256d 142 print "# use5005threads: test $test skipped\n";
143} else {
6b462c4a 144 $a = `$^X "-I../lib" "-MO=Showlex" -e "my %one" 2>&1`;
bd145f00 145 if (ord('A') != 193) { # ASCIIish
146 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
147 }
148 else { # EBCDICish C<1: PVNV (0x1a7ede34) "%\226\225\205">
149 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%\\[0-9].*sv_undef.*HV/s;
150 }
885a8af1 151}
ccc418af 152ok;
1e1dbab6 153
154# Bug 20001204.07
155{
156my $foo = $deparse->coderef2text(sub { { 234; }});
157# Constants don't get optimised here.
158print "not " unless $foo =~ /{.*{.*234;.*}.*}/sm;
159ok;
160$foo = $deparse->coderef2text(sub { { 234; } continue { 123; } });
161print "not " unless $foo =~ /{.*{.*234;.*}.*continue.*{.*123.*}/sm;
162ok;
163}