Devel-Debug-Server

 view release on metacpan or  search on metacpan

lib/Devel/Debug/Server/Agent.pm  view on Meta::CPAN

use strict;
use warnings;
package Devel::Debug::Server::Agent;

use Devel::Debug::Server;
use Devel::ebug;

use Time::HiRes qw(usleep nanosleep);
use File::Spec;

    use Data::Dumper;

my $ebug = undef;
my $programName = undef;
my $breakPointsVersion = -1; #the version of the breakpoints
my $lastEvalCommand = '';
my $lastEvalResult = '';
my %breakPointsToSet = ();

sub absoluteName($){
    my ($fileName)=@_;
    if (! File::Spec->file_name_is_absolute( $fileName )){
        $fileName = File::Spec->rel2abs( $fileName ) ;
    }
    return $fileName;
}

#keep the breakpoint list up-to-date with the debug server
sub updateBreakPoints {
    my ($breakPointsServerVersion,$breakPointsList) = @_;

    if ($breakPointsServerVersion == $breakPointsVersion){
        return; #first check if there were no modification since last time
    }

    $breakPointsVersion = $breakPointsServerVersion;
    my @breakPoints = $ebug->all_break_points_with_condition();
    foreach my $breakPoint (@breakPoints) {

        my $file = absoluteName($breakPoint->{filename});
        my $line = $breakPoint->{line}; 
        my $condition = $breakPoint->{condition}; 
        #suppress all breakpoints already set but no more needed
        if (!(exists $breakPointsList->{$file} 
            && exists $breakPointsList->{$file}{$line})){
            $ebug->break_point_delete($file,$line);
        }
    }

    my $effectiveBreakpointList = [];

    my @loadedFilenames    = ();
    foreach my $loadedFile ($ebug->filenames()){
       push @loadedFilenames, absoluteName($loadedFile); 
    }
    
    #clean old list that will be rebuilt
    %breakPointsToSet = () ;
    #add all new breakpoints
    foreach my $file (keys %$breakPointsList) {
        if (grep {$_ eq $file} @loadedFilenames){
            my $bkPointList = setBreakPointForFile($file,keys %{$breakPointsList->{$file}});
            push @{$effectiveBreakpointList}, @{$bkPointList};
        }else{
            #the source file has not yet been loaded, 
            #store breakpoints and break on file loadind
            $breakPointsToSet{$file} = $breakPointsList->{$file} ;
            $ebug->break_on_load($file);
        }
    }
    sendBreakPointsInfo($effectiveBreakpointList);
    return;
}

# set breakpoints on newly loaded file $file
# return 1 if breakpoints were effectly set
# return 0 otherwise
sub setDelayedBreakPoints {
    my ($file) = @_;
    if (!exists $breakPointsToSet{$file}){
        return 0;
    }
    my $fileBreakPoints = $breakPointsToSet{$file};
    my $bkPointList = setBreakPointForFile($file,keys %{$fileBreakPoints});
    delete $breakPointsToSet{$file};
    sendBreakPointsInfo($bkPointList);
    return 1;
}



( run in 1.551 second using v1.01-cache-2.11-cpan-39bf76dae61 )