From 076b743fc5f369c78306040642d57f05f84f6dba Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Wed, 15 Jun 2011 21:46:16 -0700 Subject: [PATCH] Break upon : --- MANIFEST | 2 ++ lib/perl5db.pl | 27 ++++++++++++++++++++++++--- lib/perl5db.t | 32 +++++++++++++++++++++++++++++++- lib/perl5db/t/MyModule.pm | 15 +++++++++++++++ lib/perl5db/t/filename-line-breakpoint | 14 ++++++++++++++ pod/perldebug.pod | 12 ++++++++++++ 6 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 lib/perl5db/t/MyModule.pm create mode 100644 lib/perl5db/t/filename-line-breakpoint diff --git a/MANIFEST b/MANIFEST index c4e552a..33d9bbf 100644 --- a/MANIFEST +++ b/MANIFEST @@ -3942,7 +3942,9 @@ lib/perl5db.pl Perl debugging routines lib/perl5db.t Tests for the Perl debugger lib/perl5db/t/breakpoint-bug Test script used by perl5db.t lib/perl5db/t/eval-line-bug Tests for the Perl debugger +lib/perl5db/t/filename-line-breakpoint Tests for the Perl debugger lib/perl5db/t/lvalue-bug Tests for the Perl debugger +lib/perl5db/t/MyModule.pm Tests for the Perl debugger lib/perl5db/t/proxy-constants Tests for the Perl debugger lib/perl5db/t/rt-61222 Tests for the Perl debugger lib/perl5db/t/rt-66110 Tests for the Perl debugger diff --git a/lib/perl5db.pl b/lib/perl5db.pl index fcc111e..89118f6 100644 --- a/lib/perl5db.pl +++ b/lib/perl5db.pl @@ -4077,7 +4077,7 @@ sub cmd_b { my $dbline = shift; # Make . the current line number if it's there.. - $line =~ s/^\./$dbline/; + $line =~ s/^\.\b/$dbline/; # No line number, no condition. Simple break on current line. if ( $line =~ /^\s*$/ ) { @@ -4115,7 +4115,15 @@ sub cmd_b { # Save the break type for this sub. $postponed{$subname} = $break ? "break +0 if $cond" : "compile"; } ## end elsif ($line =~ ... - + # b : [] + elsif ($line =~ /\A(\S+[^:]):(\d+)\s*(.*)/ms) { + my ($filename, $line_num, $cond) = ($1, $2, $3); + cmd_b_filename_line( + $filename, + $line_num, + (length($cond) ? $cond : '1'), + ); + } # b [] elsif ( $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) { @@ -4409,6 +4417,20 @@ sub cmd_b_line { }; } ## end sub cmd_b_line +=head3 cmd_b_filename_line(line, [condition]) (command) + +Wrapper for C. Prints the failure message if it +doesn't work. + +=cut + +sub cmd_b_filename_line { + eval { break_on_filename_line(@_); 1 } or do { + local $\ = ''; + print $OUT $@ and return; + }; +} + =head3 break_on_filename_line(file, line, [condition]) (API) Switches to the file specified and then calls C to set @@ -9266,7 +9288,6 @@ sub cmd_pre580_b { my $cond = length $2 ? $2 : '1'; &cmd_b_sub( $subname, $cond ); } - # b []. elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) { my $i = $1 || $dbline; diff --git a/lib/perl5db.t b/lib/perl5db.t index f4f32da..2cc1ead 100644 --- a/lib/perl5db.t +++ b/lib/perl5db.t @@ -27,7 +27,7 @@ my $dev_tty = '/dev/tty'; } } -plan(10); +plan(11); sub rc { open RC, ">", ".perldb" or die $!; @@ -159,6 +159,36 @@ SKIP: { is($output, "", "proxy constant subroutines"); } +# Testing that we can set a line in the middle of the file. +{ + rc(<<'EOF'); +&parse_options("NonStop=0 TTY=db.out LineInfo=db.out"); + +sub afterinit { + push (@DB::typeahead, + 'b ../lib/perl5db/t/MyModule.pm:12', + 'c', + q/do { use IO::Handle; STDOUT->autoflush(1); print "Var=$var\n"; }/, + 'c', + 'q', + ); + +} +EOF + + my $output = runperl(switches => [ '-d', '-I', '../lib/perl5db/t', ], stderr => 1, progfile => '../lib/perl5db/t/filename-line-breakpoint'); + + like($output, qr/ + ^Var=Bar$ + .* + ^In\ MyModule\.$ + .* + ^In\ Main\ File\.$ + .* + /msx, + "Can set breakpoint in a line in the middle of the file."); +} + # [perl #66110] Call a subroutine inside a regex { diff --git a/lib/perl5db/t/MyModule.pm b/lib/perl5db/t/MyModule.pm new file mode 100644 index 0000000..6a72fac --- /dev/null +++ b/lib/perl5db/t/MyModule.pm @@ -0,0 +1,15 @@ +package MyModule; + +use strict; +use warnings; + +use vars qw($var); + +$var = "Bar"; + +sub function +{ + print "In MyModule.\n"; +} + +1; diff --git a/lib/perl5db/t/filename-line-breakpoint b/lib/perl5db/t/filename-line-breakpoint new file mode 100644 index 0000000..8331175 --- /dev/null +++ b/lib/perl5db/t/filename-line-breakpoint @@ -0,0 +1,14 @@ +#!/perl + +use strict; +use warnings; + +use MyModule; + +my $x = "Foo"; + +MyModule::function(); + +print "In Main File.\n"; + +1; diff --git a/pod/perldebug.pod b/pod/perldebug.pod index 59b0ab7..d44ca14 100644 --- a/pod/perldebug.pod +++ b/pod/perldebug.pod @@ -301,6 +301,18 @@ don't use C: b 237 ++$count237 < 11 b 33 /pattern/i +=item b [file]:[line] [condition] +X +X + +Set a breakpoint before the given line in a (possibly different) file. If a +condition is specified, it's evaluated each time the statement is reached: a +breakpoint is taken only if the condition is true. Breakpoints may only be set +on lines that begin an executable statement. Conditions don't use C: + + b lib/MyModule.pm:237 $x > 30 + b /usr/lib/perl5/site_perl/CGI.pm:100 ++$count100 < 11 + =item b subname [condition] X X -- 2.7.4