6 @INC = qw(: ::lib ::macos:lib);
22 sub ok { print "ok $test\n"; $test++ }
25 my $deparse = B::Deparse->new() or print "not ";
28 # Tell B::Deparse about our ambient pragmas
29 { my ($hint_bits, $warning_bits);
30 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
31 $deparse->ambient_pragmas (
32 hint_bits => $hint_bits,
33 warning_bits => $warning_bits,
38 print "not " if "{\n 1;\n}" ne $deparse->coderef2text(sub {1});
41 print "not " if "{\n '???';\n 2;\n}" ne
42 $deparse->coderef2text(sub {1;2});
45 print "not " if "{\n \$test /= 2 if ++\$test;\n}" ne
46 $deparse->coderef2text(sub {++$test and $test/=2;});
49 print "not " if "{\n -((1, 2) x 2);\n}" ne
50 $deparse->coderef2text(sub {-((1,2)x2)});
56 $test = sub : lvalue {
63 print "not " if $deparse->coderef2text(sub{$test = sub : lvalue{my $x}}) ne $a;
66 $a =~ s/lvalue/method/;
67 print "not " if $deparse->coderef2text(sub{$test = sub : method{my $x}}) ne $a;
70 $a =~ s/method/locked method/;
71 print "not " if $deparse->coderef2text(sub{$test = sub : method locked {my $x}})
76 print "not " if (eval "sub ".$deparse->coderef2text(sub () { 42 }))->() != 42;
79 use constant 'c', 'stuff';
80 print "not " if (eval "sub ".$deparse->coderef2text(\&c))->() ne 'stuff';
84 print "not " if "{\n (-1) ** \$a;\n}"
85 ne $deparse->coderef2text(sub{(-1) ** $a });
88 # XXX ToDo - constsub that returns a reference
89 #use constant cr => ['hello'];
90 #my $string = "sub " . $deparse->coderef2text(\&cr);
91 #my $val = (eval $string)->();
92 #print "not " if ref($val) ne 'ARRAY' || $val->[0] ne 'hello';
96 my $Is_VMS = $^O eq 'VMS';
97 my $Is_MacOS = $^O eq 'MacOS';
99 my $path = join " ", map { qq["-I$_"] } @INC;
100 my $redir = $Is_MacOS ? "" : "2>&1";
102 $a = `$^X $path "-MO=Deparse" -anle 1 $redir`;
103 $a =~ s/-e syntax OK\n//g;
104 $a =~ s{\\340\\242}{\\s} if (ord("\\") == 224); # EBCDIC, cp 1047 or 037
105 $a =~ s{\\274\\242}{\\s} if (ord("\\") == 188); # $^O eq 'posix-bc'
108 LINE: while (defined($_ = <ARGV>)) {
110 @F = split(/\s+/, $_, 0);
115 print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
118 $a = `$^X $path "-MO=Debug" -e 1 $redir`;
119 print "not " unless $a =~
120 /\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
123 $a = `$^X $path "-MO=Terse" -e 1 $redir`;
124 print "not " unless $a =~
125 /\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s;
128 $a = `$^X $path "-MO=Terse" -ane "s/foo/bar/" $redir`;
129 $a =~ s/\(0x[^)]+\)//g;
130 $a =~ s/\[[^\]]+\]//g;
131 $a =~ s/-e syntax OK//;
134 $a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
137 my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
140 leave enter nextstate label leaveloop enterloop null and defined null
141 threadsv readline gv lineseq nextstate aassign null pushmark split pushre
142 threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
146 leave enter nextstate label leaveloop enterloop null and defined null
147 null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
148 null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
151 $b=~s/\n/ /g;$b=~s/\s+/ /g;
153 print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
156 chomp($a = `$^X $path "-MB::Stash" "-Mwarnings" -e1`);
157 $a = join ',', sort split /,/, $a;
158 $a =~ s/-u(PerlIO|open)(?:::\w+)?,//g if defined $Config{'useperlio'} and $Config{'useperlio'} eq 'define';
159 $a =~ s/-uWin32,// if $^O eq 'MSWin32';
160 $a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
161 $a =~ s/-uCwd,// if $^O eq 'cygwin';
162 if ($Config{static_ext} eq ' ') {
163 $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
164 . '-umain,-ustrict,-uutf8,-uwarnings';
165 if (ord('A') == 193) { # EBCDIC sort order is qw(a A) not qw(A a)
166 $b = join ',', sort split /,/, $b;
168 print "# [$a] vs [$b]\nnot " if $a ne $b;
171 print "ok $test # skipped: one or more static extensions\n"; $test++;
175 print "# use5005threads: test $test skipped\n";
177 $a = `$^X $path "-MO=Showlex" -e "my %one" $redir`;
178 if (ord('A') != 193) { # ASCIIish
179 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
181 else { # EBCDICish C<1: PVNV (0x1a7ede34) "%\226\225\205">
182 print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%\\[0-9].*sv_undef.*HV/s;
189 my $foo = $deparse->coderef2text(sub { { 234; }});
190 # Constants don't get optimised here.
191 print "not " unless $foo =~ /{.*{.*234;.*}.*}/sm;
193 $foo = $deparse->coderef2text(sub { { 234; } continue { 123; } });
194 print "not " unless $foo =~ /{.*{.*234;.*}.*continue.*{.*123.*}/sm;