File Coverage

lib/Devel/Trepan/CmdProcessor/Command/Quit.pm
Criterion Covered Total %
statement 63 105 60.0
branch 0 20 0.0
condition 0 18 0.0
subroutine 21 23 91.3
pod 0 2 0.0
total 84 168 50.0


line stmt bran cond sub pod time code
1             # Copyright (C) 2011-2012, 2014 Rocky Bernstein <rocky@cpan.org>
2 12     12   95 use warnings; no warnings 'redefine';
  12     12   28  
  12     1   403  
  12     1   62  
  12         26  
  12         386  
  1         7  
  1         2  
  1         21  
  1         5  
  1         1  
  1         26  
3              
4 12     12   64 use rlib '../../../..';
  12     1   25  
  12         64  
  1         5  
  1         2  
  1         3  
5              
6             package Devel::Trepan::CmdProcessor::Command::Quit;
7 12     12   4461 use if !@ISA, Devel::Trepan::CmdProcessor::Command ;
  12     1   25  
  12         63  
  1         369  
  1         2  
  1         4  
8              
9             unless (@ISA) {
10 12     12   272 eval <<'EOE';
  12     12   29  
  12     12   623  
  12     12   68  
  12     12   25  
  12         476  
  12         66  
  12         27  
  12         453  
  12         91  
  12         26  
  12         493  
  12         62  
  12         28  
  12         374  
11             use constant ALIASES => ('quit!', 'q', 'q!');
12             use constant CATEGORY => 'running';
13             use constant SHORT_HELP => 'Gently exit debugged program';
14             use constant MIN_ARGS => 0; # Need at least this many
15             use constant MAX_ARGS => 2; # Need at most this many - undef -> unlimited.
16             EOE
17             }
18              
19 12     12   1800 use strict;
  12     1   25  
  12         277  
  1         57  
  1         3  
  1         19  
20              
21 12     12   51 use vars qw(@ISA); @ISA = @CMD_ISA;
  12     1   24  
  12         520  
  1         5  
  1         2  
  1         56  
22 12     12   58 use vars @CMD_VARS; # Value inherited from parent
  12     1   27  
  12         2833  
  1         6  
  1         2  
  1         285  
23              
24             our $NAME = set_name();
25             =head2 Synopsis:
26              
27             =cut
28             our $HELP = <<'HELP';
29             =pod
30              
31             B<quit>[B<!>] [B<unconditionally>] [I<exit-code>]
32              
33             Gently exit the debugger and debugged program.
34              
35             The program being debugged is exited via I<exit()> which runs the
36             Kernel I<at_exit()> finalizers. If a return code is given, that is the
37             return code passed to I<exit()> E<mdash> presumably the return code that will
38             be passed back to the OS. If no exit code is given, 0 is used.
39              
40             =head2 Examples:
41              
42             quit # quit; prompt if we are interactive
43             quit unconditionally # quit without prompting
44             quit! # same as above
45             quit 0 # same as "quit"
46             quit! 1 # unconditional quit setting exit code 1
47              
48             =head2 See also:
49              
50             L<C<set confirm>|Devel::Trepan::CmdProcssor::Command::Set::Confirm> and
51             L<C<kill>|Devel::Trepan::CmdProcessor::Command::Kill>.
52              
53             =cut
54             HELP
55              
56             # This method runs the command
57             sub run($$)
58             {
59 0     0 0   my ($self, $args) = @_;
  0     0 0    
60 0           my $proc = $self->{proc};
  0            
61 0           my @args = @$args;
  0            
62 0           my $unconditional = 0;
  0            
63 0 0 0       if (scalar(@args) > 1 && $args->[-1] eq 'unconditionally') {
  0 0 0        
    0          
    0          
64 0           pop @args;
  0            
65 0           $unconditional = 1;
  0            
66             } elsif (substr($args[0], -1) eq '!') {
67 0           $unconditional = 1;
  0            
68             }
69 0 0 0       unless ($unconditional || $proc->{terminated} ||
  0 0 0        
      0        
      0        
70             $proc->confirm('Really quit?', 0)) {
71 0           $self->msg('Quit not confirmed.');
  0            
72 0           return;
  0            
73             }
74              
75 0           my $exitrc = 0;
  0            
76 0 0         if (scalar(@args) > 1) {
  0 0          
77 0 0         if ($args[1] =~ /\d+/) {
  0 0          
78 0           $exitrc = $args[1];
  0            
79             } else {
80 0           $self->errmsg("Bad an Integer return type \"$args[1]\"");
  0            
81 0           return;
  0            
82             }
83             }
84 12     12   76 no warnings 'once';
  12     1   26  
  12         2145  
  1         7  
  1         2  
  1         200  
85 0           $DB::single = 0;
  0            
86 0           $DB::fall_off_on_end = 1;
  0            
87 0           $proc->terminated();
  0            
88             # No graceful way to stop threads...
89 0           exit $exitrc;
  0            
90             }
91              
92             unless (caller) {
93             require Devel::Trepan::CmdProcessor::Mock;
94             my $proc = Devel::Trepan::CmdProcessor->new(undef, 'bogus');
95             my $cmd = __PACKAGE__->new($proc);
96             my $child_pid = fork;
97             if ($child_pid == 0) {
98             $cmd->run([$NAME, 'unconditionally']);
99             } else {
100             wait;
101             }
102             $cmd->run([$NAME, '5', 'unconditionally']);
103             }
104              
105             1;