[dpkg] 109/192: Dpkg::Shlibs::SymbolFile: Avoid many function arguments in parse()

Ximin Luo infinity0 at debian.org
Tue Oct 17 11:04:06 UTC 2017


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch pu/reproducible_builds
in repository dpkg.

commit 0d2b3cee25b74dd3fd9ddc3a469b8b144368c963
Author: Guillem Jover <guillem at debian.org>
Date:   Wed Jun 29 02:34:58 2016 +0200

    Dpkg::Shlibs::SymbolFile: Avoid many function arguments in parse()
    
    Addresses: Subroutines::ProhibitManyArgs
    Warned-by: perlcritic
---
 debian/changelog                  |  1 +
 scripts/Dpkg/Shlibs/SymbolFile.pm | 44 +++++++++++++++++++++------------------
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 0806d90..6dc7ee2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -34,6 +34,7 @@ dpkg (1.19.0) UNRELEASED; urgency=medium
       use colors, reducing the load time of many other modules.
     - Move color setup into report_pretty in Dpkg::ErrorHandling.
     - Move printforhelp initialization into usageerr() in Dpkg::ErrorHandling.
+    - Avoid many function arguments in Dpkg::Shlibs::SymbolFile parse().
   * Documentation:
     - Document currently accepted syntax for changelogs in deb-changelog(5).
       Closes: #858579
diff --git a/scripts/Dpkg/Shlibs/SymbolFile.pm b/scripts/Dpkg/Shlibs/SymbolFile.pm
index 6f7452b..60fd80f 100644
--- a/scripts/Dpkg/Shlibs/SymbolFile.pm
+++ b/scripts/Dpkg/Shlibs/SymbolFile.pm
@@ -199,34 +199,35 @@ sub _new_symbol {
     return (ref $base) ? $base->clone(@_) : $base->new(@_);
 }
 
-# Parameter seen is only used for recursive calls
+# Option state is only used for recursive calls.
 sub parse {
-    my ($self, $fh, $file, $seen, $obj_ref, $base_symbol) = @_;
+    my ($self, $fh, $file, %opts) = @_;
+    my $state = $opts{state} //= {};
 
-    if (defined($seen)) {
-	return if exists $seen->{$file}; # Avoid include loops
+    if (defined $state) {
+	return if exists $state->{seen}{$file}; # Avoid include loops
     } else {
 	$self->{file} = $file;
-	$seen = {};
+        $state->{seen} = {};
     }
-    $seen->{$file} = 1;
+    $state->{seen}{$file} = 1;
 
-    if (not ref($obj_ref)) { # Init ref to name of current object/lib
-        $$obj_ref = undef;
+    if (not ref $state->{obj_ref}) { # Init ref to name of current object/lib
+        ${$state->{obj_ref}} = undef;
     }
 
     while (<$fh>) {
 	chomp;
 
 	if (/^(?:\s+|#(?:DEPRECATED|MISSING): ([^#]+)#\s*)(.*)/) {
-	    if (not defined ($$obj_ref)) {
+	    if (not defined ${$state->{obj_ref}}) {
 		error(g_('symbol information must be preceded by a header (file %s, line %s)'), $file, $.);
 	    }
 	    # Symbol specification
 	    my $deprecated = ($1) ? $1 : 0;
-	    my $sym = _new_symbol($base_symbol, deprecated => $deprecated);
+	    my $sym = _new_symbol($state->{base_symbol}, deprecated => $deprecated);
 	    if ($self->create_symbol($2, base => $sym)) {
-		$self->add_symbol($sym, $$obj_ref);
+		$self->add_symbol($sym, ${$state->{obj_ref}});
 	    } else {
 		warning(g_('failed to parse line in %s: %s'), $file, $_);
 	    }
@@ -234,36 +235,39 @@ sub parse {
 	    my $tagspec = $1;
 	    my $filename = $2;
 	    my $dir = $file;
+	    my $old_base_symbol = $state->{base_symbol};
 	    my $new_base_symbol;
 	    if (defined $tagspec) {
-                $new_base_symbol = _new_symbol($base_symbol);
+		$new_base_symbol = _new_symbol($old_base_symbol);
 		$new_base_symbol->parse_tagspec($tagspec);
 	    }
+	    $state->{base_symbol} = $new_base_symbol;
 	    $dir =~ s{[^/]+$}{}; # Strip filename
-	    $self->load("$dir$filename", $seen, $obj_ref, $new_base_symbol);
+	    $self->load("$dir$filename", %opts);
+	    $state->{base_symbol} = $old_base_symbol;
 	} elsif (/^#|^$/) {
 	    # Skip possible comments and empty lines
 	} elsif (/^\|\s*(.*)$/) {
 	    # Alternative dependency template
-	    push @{$self->{objects}{$$obj_ref}{deps}}, "$1";
+	    push @{$self->{objects}{${$state->{obj_ref}}}{deps}}, "$1";
 	} elsif (/^\*\s*([^:]+):\s*(.*\S)\s*$/) {
 	    # Add meta-fields
-	    $self->{objects}{$$obj_ref}{fields}{field_capitalize($1)} = $2;
+	    $self->{objects}{${$state->{obj_ref}}}{fields}{field_capitalize($1)} = $2;
 	} elsif (/^(\S+)\s+(.*)$/) {
 	    # New object and dependency template
-	    $$obj_ref = $1;
-	    if (exists $self->{objects}{$$obj_ref}) {
+	    ${$state->{obj_ref}} = $1;
+	    if (exists $self->{objects}{${$state->{obj_ref}}}) {
 		# Update/override infos only
-		$self->{objects}{$$obj_ref}{deps} = [ "$2" ];
+		$self->{objects}{${$state->{obj_ref}}}{deps} = [ "$2" ];
 	    } else {
 		# Create a new object
-		$self->create_object($$obj_ref, "$2");
+		$self->create_object(${$state->{obj_ref}}, "$2");
 	    }
 	} else {
 	    warning(g_('failed to parse a line in %s: %s'), $file, $_);
 	}
     }
-    delete $seen->{$file};
+    delete $state->{seen}{$file};
 }
 
 # Beware: we reuse the data structure of the provided symfile so make

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/dpkg.git



More information about the Reproducible-commits mailing list