[SCM] Debian Qt/KDE packaging tools branch, master, updated. debian/0.5.3-53-gbac2493
Modestas Vainius
modax at alioth.debian.org
Fri Jan 29 23:51:20 UTC 2010
The following commit has been merged in the master branch:
commit 26609f3efd354dbdf8ec46c5574f78b2a83ace64
Author: Modestas Vainius <modestas at vainius.eu>
Date: Fri Jan 29 20:26:56 2010 +0200
"Substs" subsystem is now capable to detect c++filt'ed TypeSubsts as well.
* SymbolsHelper::Substs::TypeDiff::Cpp wrapper provides this functionality.
* Introduce SymbolsHelper::Subst::prep(). It is needed to prepare Cpp substs
for detection.
* Export @CPP_TYPE_SUBSTS.
---
symbolshelper/Debian/PkgKde/SymbolsHelper/Subst.pm | 7 +-
.../Debian/PkgKde/SymbolsHelper/Substs.pm | 4 +-
.../PkgKde/SymbolsHelper/Substs/TypeSubst.pm | 140 ++++++++++++++++----
3 files changed, 125 insertions(+), 26 deletions(-)
diff --git a/symbolshelper/Debian/PkgKde/SymbolsHelper/Subst.pm b/symbolshelper/Debian/PkgKde/SymbolsHelper/Subst.pm
index 7b2b926..01262ad 100644
--- a/symbolshelper/Debian/PkgKde/SymbolsHelper/Subst.pm
+++ b/symbolshelper/Debian/PkgKde/SymbolsHelper/Subst.pm
@@ -43,9 +43,14 @@ sub expand {
return $self->{cache}{$cache};
}
+# Prepare $rawname before detect()/neutralize()
+# my ($self, $rawname, $arch) = @_;
+sub prep {
+}
+
# Make the raw symbol name architecture neutral
+# my ($self, $rawname) = @_;
sub neutralize {
- my ($self, $rawname) = @_;
return undef;
}
diff --git a/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs.pm b/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs.pm
index b10b522..efb2c42 100644
--- a/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs.pm
+++ b/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs.pm
@@ -21,7 +21,7 @@ use Debian::PkgKde::SymbolsHelper::Substs::VirtTable;
use Debian::PkgKde::SymbolsHelper::Substs::TypeSubst;
use base 'Exporter';
-our @EXPORT = qw(%SUBSTS @SUBSTS @STANDALONE_SUBSTS @TYPE_SUBSTS);
+our @EXPORT = qw(%SUBSTS @SUBSTS @STANDALONE_SUBSTS @TYPE_SUBSTS @CPP_TYPE_SUBSTS);
my $NS = 'Debian::PkgKde::SymbolsHelper::Substs';
@@ -37,7 +37,7 @@ our @TYPE_SUBSTS = (
"${NS}::TypeSubst::qreal"->new(),
);
-my @CPP_TYPE_SUBSTS;
+our @CPP_TYPE_SUBSTS;
foreach my $subst (@TYPE_SUBSTS) {
push @CPP_TYPE_SUBSTS, "${NS}::TypeSubst::Cpp"->new($subst);
}
diff --git a/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs/TypeSubst.pm b/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs/TypeSubst.pm
index 63ffb50..1ee7957 100644
--- a/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs/TypeSubst.pm
+++ b/symbolshelper/Debian/PkgKde/SymbolsHelper/Substs/TypeSubst.pm
@@ -19,20 +19,36 @@ use strict;
use warnings;
use base 'Debian::PkgKde::SymbolsHelper::Subst';
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ $self->{'length'} = 1; # Basic typesubt must be one letter
+ return $self;
+}
+
sub get_name {
my $self = shift;
return substr($self->{substvar}, 1, -1);
}
+sub get_types_re {
+ my $self = shift;
+ unless (exists $self->{types_re}) {
+ my $s = '[' . join("", @{$self->{types}}) . ']';
+ $self->{types_re} = qr/$s/;
+ }
+ return $self->{types_re};
+}
+
sub neutralize {
my ($self, $rawname) = @_;
my $ret = 0;
my $str = "$rawname";
+ my $l = $self->{'length'};
+ my $re = $self->get_types_re();
- return undef unless exists $self->{type_re};
-
- while ($str =~ /$self->{type_re}/g) {
- $rawname->substr(pos($str)-1, 1, $self->{main_type});
+ while ($str =~ /$re/g) {
+ $rawname->substr(pos($str)-$l, $l, $self->{types}->[0]);
$ret = 1;
}
return ($ret) ? $rawname : undef;
@@ -41,6 +57,7 @@ sub neutralize {
sub detect {
my ($self, $rawname, $arch, $arch_rawnames) = @_;
+ my $l = $self->{'length'};
my $s1 = $rawname;
my $t1 = $self->expand($arch);
my ($s2, $t2);
@@ -56,19 +73,57 @@ sub detect {
return undef unless defined $s2;
- # Compare letter by letter until difference is found
- my @s1 = split(//, $s1);
- my @s2 = split(//, $s2);
+ # Verify subst and replace them with types[0] and substvar
my $ret = 0;
- for (my $i = 0; $i <= $#s1; $i++) {
- if ($s1[$i] eq $t1 && $s2[$i] eq $t2) {
- $rawname->substr($i, 1, $self->{main_type}, $self->{substvar});
+ my $pos = 0;
+ while (($pos = index($s1, $t1, $pos)) != -1) {
+ if ($t2 eq substr($s2, $pos, $l)) {
+ $rawname->substr($pos, $l, $self->{types}->[0], $self->{substvar});
$ret = 1;
}
+ $pos += $l;
}
return ($ret) ? $rawname : undef;
}
+# Operates on %l% etc. same length types that cannot be present in demanged
+# symbols. Used by ::Cpp wrapper.
+package Debian::PkgKde::SymbolsHelper::Substs::TypeSubst::CppPrivate;
+
+use strict;
+use warnings;
+use base 'Debian::PkgKde::SymbolsHelper::Substs::TypeSubst';
+
+sub new {
+ my ($class, $base) = @_;
+ my $self = $class->SUPER::new();
+ $self->{base} = $base;
+ $self->{'length'} = 3; # raw type + length('%%')
+ $self->{substvar} = '{' . $self->get_name() . '}';
+ $self->{types} = [ map { '%' . $_ . '%' } @{$base->{types}} ];
+ return $self;;
+}
+
+sub get_name {
+ my $self = shift;
+ return "c++:" . $self->{base}->get_name();
+}
+
+sub get_types_re {
+ my $self = shift;
+ unless (exists $self->{types_re}) {
+ my $s = '%[' . join("", @{$self->{base}{types}}) . ']%';
+ $self->{types_re} = qr/$s/;
+ }
+ return $self->{types_re};
+}
+
+
+sub _expand {
+ my ($self, $arch) = @_;
+ return '%'.$self->{base}->_expand($arch).'%';
+}
+
package Debian::PkgKde::SymbolsHelper::Substs::TypeSubst::Cpp;
use strict;
@@ -86,19 +141,63 @@ my %CPP_MAP = (
d => 'double',
);
+my %CPPRE_MAP = (
+ '%m%' => qr/\bunsigned long(?! long)\b/,
+ '%j%' => qr/\bunsigned int\b/,
+ '%i%' => qr/\b(?<!unsigned )int\b/,
+ '%l%' => qr/\b(?<!unsigned )long(?! long)\b/,
+ '%x%' => qr/\b(?<!unsigned )long long\b/,
+ '%y%' => qr/\bunsigned long long\b/,
+ '%f%' => qr/\bfloat\b/,
+ '%d%' => qr/\bdouble\b/,
+);
+
sub new {
my ($class, $base) = @_;
- return bless { base => $base }, $class;
+ my $self = $class->SUPER::new();
+ $self->{private} =
+ Debian::PkgKde::SymbolsHelper::Substs::TypeSubst::CppPrivate->new($base);
+ return $self;
}
sub _expand {
my ($self, $arch) = @_;
- return $CPP_MAP{$self->{base}->_expand($arch)};
+ return $CPP_MAP{$self->{private}{base}->_expand($arch)};
}
sub get_name {
my $self = shift;
- return "c++:" . $self->{base}->get_name();
+ return $self->{private}->get_name();
+}
+
+# In order for detect()/neutralize() to work, all substs must be of the same
+# length. Therefore replace demangled names with %l% etc.
+sub prep {
+ my ($self, $rawname, $arch) = @_;
+
+ # We need to prepare $rawname only once for all Cpp substs
+ return if exists $rawname->{cpp_prepped};
+
+ my $str = "$rawname";
+ foreach my $key (keys %CPPRE_MAP) {
+ my $re = $CPPRE_MAP{$key};
+ while ($str =~ /$re/g) {
+ my $l = length($&);
+ $rawname->substr(pos($str)-$l, $l, $key, $&);
+ $str = "$rawname" if $l != length($key);
+ }
+ }
+ $rawname->{cpp_prepped} = 1;
+}
+
+sub detect {
+ my $self = shift;
+ return $self->{private}->detect(@_);
+}
+
+sub neutralize {
+ my $self = shift;
+ return $self->{private}->neutralize(@_);
}
package Debian::PkgKde::SymbolsHelper::Substs::TypeSubst::size_t;
@@ -111,8 +210,7 @@ sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{substvar} = "{size_t}";
- $self->{main_type} = "m"; # unsigned long (amd64)
- $self->{type_re} = qr/[jm]/;
+ $self->{types} = [ qw(m j) ]; # unsigned long / unsigned int
return $self;
}
@@ -131,8 +229,7 @@ sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{substvar} = "{ssize_t}";
- $self->{main_type} = "l"; # long (amd64)
- $self->{type_re} = qr/[il]/;
+ $self->{types} = [ qw(l i) ]; # long / int
return $self;
}
@@ -151,8 +248,7 @@ sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{substvar} = "{int64_t}";
- $self->{main_type} = "l"; # long (amd64)
- $self->{type_re} = qr/[xl]/;
+ $self->{types} = [ qw(l x) ]; # long / long long
return $self;
}
@@ -171,8 +267,7 @@ sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{substvar} = "{uint64_t}";
- $self->{main_type} = "m"; # unsigned long (64bit)
- $self->{type_re} = qr/[ym]/;
+ $self->{types} = [ qw(m y) ]; # unsigned long / unsigned long long
return $self;
}
@@ -191,8 +286,7 @@ sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{substvar} = "{qreal}";
- $self->{main_type} = "d"; # double (not arm)
- $self->{type_re} = qr/[fd]/;
+ $self->{types} = [ qw(d f) ]; # double / float
return $self;
}
--
Debian Qt/KDE packaging tools
More information about the pkg-kde-commits
mailing list