Once again syncing after too long an absence
[p5sagit/p5-mst-13.2.git] / t / lib / b.t
CommitLineData
ee8c7f54 1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
22d4bb9c 5 @INC = '../lib';
ee8c7f54 6}
7
8$| = 1;
9use warnings;
10use strict;
11use Config;
12
0e06870b 13print "1..17\n";
ee8c7f54 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;
22d4bb9c 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}
ee8c7f54 55
0e06870b 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
4b19af01 70my $a;
71my $Is_VMS = $^O eq 'VMS';
22d4bb9c 72$a = `$^X "-I../lib" "-MO=Deparse" -anle 1 2>&1`;
ee8c7f54 73$a =~ s/-e syntax OK\n//g;
74$b = <<'EOF';
75
76LINE: while (defined($_ = <ARGV>)) {
77 chomp $_;
78 @F = split(/\s+/, $_, 0);
0e06870b 79 '???';
ee8c7f54 80}
81
82EOF
83print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
84ok;
85
22d4bb9c 86$a = `$^X "-I../lib" "-MO=Debug" -e 1 2>&1`;
ee8c7f54 87print "not " unless $a =~
88/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
89ok;
90
22d4bb9c 91$a = `$^X "-I../lib" "-MO=Terse" -e 1 2>&1`;
ee8c7f54 92print "not " unless $a =~
0e06870b 93/\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s;
ee8c7f54 94ok;
95
22d4bb9c 96$a = `$^X "-I../lib" "-MO=Terse" -ane "s/foo/bar/" 2>&1`;
ee8c7f54 97$a =~ s/\(0x[^)]+\)//g;
98$a =~ s/\[[^\]]+\]//g;
99$a =~ s/-e syntax OK//;
100$a =~ s/[^a-z ]+//g;
101$a =~ s/\s+/ /g;
102$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
103$a =~ s/^\s+//;
104$a =~ s/\s+$//;
22d4bb9c 105my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
106if ($is_thread) {
107 $b=<<EOF;
108leave enter nextstate label leaveloop enterloop null and defined null
109threadsv readline gv lineseq nextstate aassign null pushmark split pushre
110threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
111EOF
112} else {
113 $b=<<EOF;
ee8c7f54 114leave enter nextstate label leaveloop enterloop null and defined null
115null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
22d4bb9c 116null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
ee8c7f54 117EOF
22d4bb9c 118}
ee8c7f54 119$b=~s/\n/ /g;$b=~s/\s+/ /g;
120$b =~ s/\s+$//;
22d4bb9c 121print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
ee8c7f54 122ok;
123
22d4bb9c 124chomp($a = `$^X "-I../lib" "-MB::Stash" "-Mwarnings" -e1`);
ee8c7f54 125$a = join ',', sort split /,/, $a;
0e06870b 126$a =~ s/-u(perlio|open)(?:::\w+)?,//g if defined $Config{'useperlio'} and $Config{'useperlio'} eq 'define';
4b19af01 127$a =~ s/-uWin32,// if $^O eq 'MSWin32';
128$a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
22d4bb9c 129$a =~ s/-uCwd,// if $^O eq 'cygwin';
4b19af01 130if ($Config{static_ext} eq ' ') {
131 $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
0e06870b 132 . '-umain,-ustrict,-uwarnings';
4b19af01 133 print "# [$a] vs [$b]\nnot " if $a ne $b;
134 ok;
135} else {
136 print "ok $test # skipped: one or more static extensions\n"; $test++;
137}
ee8c7f54 138
22d4bb9c 139if ($is_thread) {
140 print "# use5005threads: test $test skipped\n";
141} else {
142 $a = `$^X "-I../lib" "-MO=Showlex" -e "my %one" 2>&1`;
143 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
4b19af01 144}
ee8c7f54 145ok;
0e06870b 146
147# Bug 20001204.07
148{
149my $foo = $deparse->coderef2text(sub { { 234; }});
150# Constants don't get optimised here.
151print "not " unless $foo =~ /{.*{.*234;.*}.*}/sm;
152ok;
153$foo = $deparse->coderef2text(sub { { 234; } continue { 123; } });
154print "not " unless $foo =~ /{.*{.*234;.*}.*continue.*{.*123.*}/sm;
155ok;
156}