This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate CPAN release of version.pm 0.9905
[perl5.git] / cpan / B-Debug / t / debug.t
... / ...
CommitLineData
1#!./perl
2
3BEGIN {
4 delete $ENV{PERL_DL_NONLAZY} if $] < 5.005_58; #Perl_byterun problem
5 if ($ENV{PERL_CORE}){
6 chdir('t') if -d 't';
7 if ($^O eq 'MacOS') {
8 @INC = qw(: ::lib ::macos:lib);
9 } else {
10 @INC = '.';
11 push @INC, '../lib';
12 }
13 } else {
14 unshift @INC, 't';
15 }
16 require Config;
17 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
18 print "1..0 # Skip -- Perl configured without B module\n";
19 exit 0;
20 }
21}
22
23$| = 1;
24use warnings;
25use strict;
26use Config;
27use Test::More tests => 11;
28use B;
29use B::Debug;
30use File::Spec;
31
32my $a;
33my $X = $^X =~ m/\s/ ? qq{"$^X"} : $^X;
34
35my $path = join " ", map { qq["-I$_"] } (File::Spec->catfile("blib","lib"), @INC);
36my $redir = $^O =~ /VMS|MSWin32|MacOS/ ? "" : "2>&1";
37
38$a = `$X $path "-MO=Debug" -e 1 $redir`;
39like($a, qr/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s);
40
41
42$a = `$X $path "-MO=Terse" -e 1 $redir`;
43like($a, qr/\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s);
44
45$a = `$X $path "-MO=Terse" -ane "s/foo/bar/" $redir`;
46$a =~ s/\(0x[^)]+\)//g;
47$a =~ s/\[[^\]]+\]//g;
48$a =~ s/-e syntax OK//;
49$a =~ s/[^a-z ]+//g;
50$a =~ s/\s+/ /g;
51$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
52$a =~ s/^\s+//;
53$a =~ s/\s+$//;
54$a =~ s/\s+nextstate$//; # if $] < 5.008001; # 5.8.0 adds it. 5.8.8 not anymore
55my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
56if ($is_thread) {
57 $b=<<EOF;
58leave enter nextstate label leaveloop enterloop null and defined null
59threadsv readline gv lineseq nextstate aassign null pushmark split pushre
60threadsv const null pushmark rvav gv nextstate subst const unstack
61EOF
62} else {
63 $b=<<EOF;
64leave enter nextstate label leaveloop enterloop null and defined null null
65gvsv readline gv lineseq nextstate aassign null pushmark split pushre null
66gvsv const null pushmark rvav gv nextstate subst const unstack
67EOF
68}
69#$b .= " nextstate" if $] < 5.008001; # ??
70$b=~s/\n/ /g; $b=~s/\s+/ /g;
71$b =~ s/\s+$//;
72is($a, $b);
73
74like(B::Debug::_printop(B::main_root), qr/LISTOP\s+\[OP_LEAVE\]/);
75like(B::Debug::_printop(B::main_start), qr/OP\s+\[OP_ENTER\]/);
76
77$a = `$X $path "-MO=Debug" -e "B::main_root->debug" $redir`;
78like($a, qr/op_next\s+0x0/m);
79$a = `$X $path "-MO=Debug" -e "B::main_start->debug" $redir`;
80like($a, qr/\[OP_ENTER\]/m);
81
82# pass missing FETCHSIZE, fixed with 1.06
83my $e = q(BEGIN{tie @a, __PACKAGE__;sub TIEARRAY {bless{}} sub FETCH{1}};print $a[1]);
84$a = `$X $path "-MO=Debug" -e"$e" $redir`;
85unlike($a, qr/locate object method "FETCHSIZE"/m);
86
87# NV assertion with CV, fixed with 1.13
88my $tmp = "tmp.pl";
89open TMP, ">", $tmp;
90print TMP 'my $p=1;$g=2;sub p($){my $i=1;$i+1};print p(0)+$g;';
91close TMP;
92$a = `$X $path "-MO=Debug" $tmp $redir`;
93ok(! $?);
94unlike($a, qr/assertion "SvTYPE(sv) != SVt_PVCV" failed.*function: S_sv_2iuv_common/m);
95unlike($a, qr/Use of uninitialized value in print/m);
96
97END { unlink $tmp if $tmp; }