rev 12777 - branches/kde4.2/packages/pkg-kde-tools/trunk/symbolshelper/Debian/PkgKde/SymHelper
Modestas Vainius
modax-guest at alioth.debian.org
Sat Nov 29 19:08:35 UTC 2008
Author: modax-guest
Date: 2008-11-29 19:08:35 +0000 (Sat, 29 Nov 2008)
New Revision: 12777
Modified:
branches/kde4.2/packages/pkg-kde-tools/trunk/symbolshelper/Debian/PkgKde/SymHelper/Handlers.pm
Log:
Avoid problems with symbol name clashing on renaming operations
Modified: branches/kde4.2/packages/pkg-kde-tools/trunk/symbolshelper/Debian/PkgKde/SymHelper/Handlers.pm
===================================================================
--- branches/kde4.2/packages/pkg-kde-tools/trunk/symbolshelper/Debian/PkgKde/SymHelper/Handlers.pm 2008-11-29 19:05:53 UTC (rev 12776)
+++ branches/kde4.2/packages/pkg-kde-tools/trunk/symbolshelper/Debian/PkgKde/SymHelper/Handlers.pm 2008-11-29 19:08:35 UTC (rev 12777)
@@ -16,14 +16,18 @@
my @standalone_substitution = (
new Debian::PkgKde::SymHelper::Handler::VirtTable,
);
- my @substitution = (
- @standalone_substitution,
+ my @multiple_substitution = (
new Debian::PkgKde::SymHelper::Handler::size_t,
new Debian::PkgKde::SymHelper::Handler::ssize_t,
new Debian::PkgKde::SymHelper::Handler::qreal,
);
+ my @substitution = (
+ @standalone_substitution,
+ @multiple_substitution,
+ );
return bless { subst => \@substitution,
- standalone_subst => \ @standalone_substitution }, $cls;
+ multiple_subst => \@multiple_substitution,
+ standalone_subst => \@standalone_substitution }, $cls;
}
sub load_symbol_files {
@@ -136,8 +140,9 @@
return $osym->get_symbol();
}
-sub create_template_standalone {
+sub _process_standalone {
my $self = shift;
+ my $create = shift; # 0 - clean symbols, 1 - create template
return undef unless (exists $self->{symfiles});
@@ -146,28 +151,44 @@
while (my ($arch, $symfile) = each %$symfiles) {
while (my ($soname, $sonameobj) = each(%{$symfile->{objects}})) {
my @syms = keys(%{$sonameobj->{syms}});
+ my %rename; # We need this hash to avoid name clashing
for my $sym (@syms) {
my $symbol = new Debian::PkgKde::SymHelper::Symbol($sym, $arch);
my $symbol2 = new Debian::PkgKde::SymHelper::Symbol2($sym, $arch);
+ my $handled;
foreach my $handler (@{$self->{standalone_subst}}) {
if ($handler->detect($symbol2)) {
+ $handled = 1;
# Make symbol arch independent with regard to this handler
$handler->clean($symbol);
}
}
- my $newsym = $symbol2->get_symbol2();
+
+ my $newsym = ($create) ? $symbol2->get_symbol2() : $symbol->get_symbol();
+ my $info = $sonameobj->{syms}{$sym};
if ($sym ne $newsym) {
- # Rename symbol
- my $info = $sonameobj->{syms}{$sym};
- $sonameobj->{syms}{$newsym} = $info;
+ $rename{$newsym} = $info;
delete $sonameobj->{syms}{$sym};
}
+ # Preserve symbol2 if clean requested
+ if (!$create && $handled) {
+ $info->{__symbol2__} = $symbol2;
+ }
}
+ # We need this to avoid removal of symbols which names clash when renaming
+ while (my($newname, $info) = each %rename) {
+ $sonameobj->{syms}{$newname} = $info;
+ }
}
}
return $self->get_symfile();
}
+sub create_template_standalone {
+ my $self = shift;
+ return $self->_process_standalone(1);
+}
+
sub create_template {
my $self = shift;
@@ -176,6 +197,9 @@
my $symfiles = $self->{symfiles};
my $main_arch = $self->get_main_arch();
+ # Process with standalone handlers first. Get a symfile with __symbol2__
+ my $symbol2symfile = $self->_process_standalone();
+
# Collect new symbols from them by grouping them using the
# fully arch independent derivative name
my %symbols;
@@ -241,9 +265,15 @@
next;
}
- # Main symbol (reference)
- my $main_symbol = new Debian::PkgKde::SymHelper::Symbol2($group->{arches}{$main_arch}->get_symbol(), $main_arch);
- foreach my $handler (@{$self->{subst}}) {
+ # Main symbol
+ my $symname = $group->{arches}{$main_arch}->get_symbol();
+ my $main_symbol;
+ if (exists $symbol2symfile->{objects}{$soname}{syms}{$symname}{__symbol2__}) {
+ $main_symbol = $symbol2symfile->{objects}{$soname}{syms}{$symname}{__symbol2__};
+ } else {
+ $main_symbol = new Debian::PkgKde::SymHelper::Symbol2($symname, $main_arch);
+ }
+ foreach my $handler (@{$self->{multiple_subst}}) {
if ($handler->detect($main_symbol, $group->{arches})) {
# Make archsymbols arch independent with regard to his handler
while (my ($arch, $symbol) = each(%{$group->{arches}})) {
@@ -261,19 +291,26 @@
my @syms = keys(%{$sonameobj->{syms}});
for my $sym (@syms) {
my $g = $self->get_group_name($sym, $main_arch);
+ my $symbol2;
if (exists $symbols{$soname}{$g}) {
my $group = $symbols{$soname}{$g};
if (!exists $group->{banned}) {
- # Rename symbol
- my $info = $sonameobj->{syms}{$sym};
- my $newsym = $group->{template}->get_symbol2();
- $sonameobj->{syms}{$newsym} = $info;
- delete $sonameobj->{syms}{$sym};
- } elsif (exists $sonameobj->{syms}{$sym}) {
- delete $sonameobj->{syms}{$sym}
- unless ($sonameobj->{syms}{$sym}{deprecated});
+ $symbol2 = $group->{template};
}
+ } elsif (exists $sonameobj->{syms}{$sym}{__symbol2__}) {
+ $symbol2 = $sonameobj->{syms}{$sym}{__symbol2__};
+ } else {
+ next; # Leave this symbol alone
}
+ if (defined $symbol2) {
+ # Rename symbol
+ my $info = $sonameobj->{syms}{$sym};
+ $sonameobj->{syms}{$symbol2->get_symbol2()} = $info;
+ delete $sonameobj->{syms}{$sym};
+ } elsif (exists $sonameobj->{syms}{$sym}) {
+ delete $sonameobj->{syms}{$sym}
+ unless ($sonameobj->{syms}{$sym}{deprecated});
+ }
}
}
More information about the pkg-kde-commits
mailing list