From 762356c02d6b9a089f0413c4c52372558dff2dff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 22:08:05 +0200 Subject: [PATCH 1/7] Fix package version parsing in $PKG_REGEXP The regexp was parsing "package xx::3;" as package "xx", version "3" --- lib/Module/Metadata.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index 281d738..2b7c70e 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -68,8 +68,10 @@ my $PKG_REGEXP = qr{ # match a package declaration package # the word 'package' \s+ # whitespace ($PKG_NAME_REGEXP) # a package name - \s* # optional whitespace - ($V_NUM_REGEXP)? # optional version number + (?: + \s+ # whitespace + ($V_NUM_REGEXP) # optional version number + )? \s* # optional whitesapce [;\{] # semicolon line terminator or block start (since 5.16) }x; From b50a51e263b11010fb3d7dd54163a0c1d8122b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 22:12:50 +0200 Subject: [PATCH 2/7] Optimization in _parse_fh: use index() instead of a regexp --- lib/Module/Metadata.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index 2b7c70e..76eb664 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -573,7 +573,7 @@ sub _parse_fh { # parse $line to see if it's a $VERSION declaration my( $version_sigil, $version_fullname, $version_package ) = - ($line =~ /VERSION/) + index($line, 'VERSION') >= 1 ? $self->_parse_version_expression( $line ) : (); From 64d7abb8296ea4c4766b69d4a99e6ee71e6f6476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 22:23:10 +0200 Subject: [PATCH 3/7] Encode source as UTF-8 Non-ASCII char in comment at line 83. --- lib/Module/Metadata.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index 76eb664..a568b04 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -80,7 +80,7 @@ my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name ([\$*]) # sigil - $ or * ( ( # optional leading package name - (?:::|\')? # possibly starting like just :: (Ì la $::VERSION) + (?:::|\')? # possibly starting like just :: (à la $::VERSION) (?:\w+(?:::|\'))* # Foo::Bar:: ... )? VERSION From e0b96c2be75bf26f865c718e7742ff3882651e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 22:44:44 +0200 Subject: [PATCH 4/7] _parse_fh: optimize expression order in conditions --- lib/Module/Metadata.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index a568b04..24ede9a 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -593,14 +593,14 @@ sub _parse_fh { } # first non-comment line in undeclared package main is VERSION - } elsif ( !exists($vers{main}) && $package eq 'main' && $version_fullname ) { + } elsif ( $package eq 'main' && $version_fullname && !exists($vers{main}) ) { $need_vers = 0; my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line ); $vers{$package} = $v; push( @packages, 'main' ); # first non-comment line in undeclared package defines package main - } elsif ( !exists($vers{main}) && $package eq 'main' && $line =~ /\w+/ ) { + } elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w+/ ) { $need_vers = 1; $vers{main} = ''; push( @packages, 'main' ); From 4bc9783cd032c51c7a4bcb5f0f9e9afa4f0a9a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 22:48:35 +0200 Subject: [PATCH 5/7] _parse_fh: minor regexp optimization --- lib/Module/Metadata.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index 24ede9a..c2a3850 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -600,7 +600,7 @@ sub _parse_fh { push( @packages, 'main' ); # first non-comment line in undeclared package defines package main - } elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w+/ ) { + } elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w/ ) { $need_vers = 1; $vers{main} = ''; push( @packages, 'main' ); From 145dec76096f0b81edfd9231ac39628f8b1d3a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 3 Apr 2014 23:30:07 +0200 Subject: [PATCH 6/7] _init: several micro-optimizations in module name extraction --- lib/Module/Metadata.pm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index c2a3850..ed0792f 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -401,13 +401,12 @@ sub _init { unless($self->{module} and length($self->{module})) { my ($v, $d, $f) = File::Spec->splitpath($self->{filename}); - if($f =~ /\.pm$/) { - $f =~ s/\..+$//; - my @candidates = grep /$f$/, @{$self->{packages}}; + if($f =~ s/\.pm$//) { + my @candidates = grep /\Q$f\E$/, @{$self->{packages}}; $self->{module} = shift(@candidates); # punt } else { - if(grep /main/, @{$self->{packages}}) { + if(grep $_ eq 'main', @{$self->{packages}}) { $self->{module} = 'main'; } else { From 17432d7a6efc7cd7f1c5bfb009e995b8f79eb6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Fri, 4 Apr 2014 00:04:59 +0200 Subject: [PATCH 7/7] _do_find_module: micro-optimization --- lib/Module/Metadata.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Module/Metadata.pm b/lib/Module/Metadata.pm index ed0792f..b4f460d 100644 --- a/lib/Module/Metadata.pm +++ b/lib/Module/Metadata.pm @@ -432,8 +432,9 @@ sub _do_find_module { my $testfile = File::Spec->catfile($dir, $file); return [ File::Spec->rel2abs( $testfile ), $dir ] if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp - return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ] - if -e "$testfile.pm"; + $testfile .= '.pm'; + return [ File::Spec->rel2abs( $testfile ), $dir ] + if -e $testfile; } return; }