From 8490d8db14241033dad46f6e13cb62785ac6fad9 Mon Sep 17 00:00:00 2001 From: paltherr Date: Fri, 17 Oct 2003 16:08:03 +0000 Subject: - Reduced number of added bridge methods - Reduced computations needed to add bridge methods --- sources/scalac/transformer/Erasure.java | 71 ++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index a8f0c2014e..b3a15e6cd0 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -9,7 +9,11 @@ package scalac.transformer; +import java.util.Iterator; +import java.util.Map; import java.util.HashMap; +import java.util.Set; +import java.util.HashSet; import scalac.Global; import scalac.Unit; @@ -450,6 +454,43 @@ public class Erasure extends Transformer implements Modifiers { // Transformer ///////////////////////////////////////////////////////////////////////////////// + private final Map interfaces/*>*/ = new HashMap(); + + private Set getInterfacesOf(Symbol clasz) { + assert clasz.isClass(): Debug.show(clasz); + Set set = (Set)interfaces.get(clasz); + if (set == null) { + set = new HashSet(); + interfaces.put(clasz, set); + Type parents[] = clasz.parents(); + for (int i = 0; i < parents.length; i++) + set.addAll(getInterfacesOf(parents[i].symbol())); + if (clasz.isInterface()) set.add(clasz); + } + return set; + } + + private void addInterfaceBridges_(Symbol clasz) { + assert clasz.isClass() && !clasz.isInterface(): Debug.show(clasz); + assert clasz.parents().length > 0: Debug.show(clasz)+": "+clasz.info(); + Symbol svper = clasz.parents()[0].symbol(); + assert svper.isClass() && !svper.isInterface(): Debug.show(clasz); + Set interfaces = new HashSet(getInterfacesOf(clasz)); + interfaces.removeAll(getInterfacesOf(svper)); + for (Iterator i = interfaces.iterator(); i.hasNext(); ) { + Symbol inter = (Symbol)i.next(); + addInterfaceBridgesAux(clasz, inter.members()); + } + } + + private void addInterfaceBridgesAux(Symbol owner, Scope symbols) { + for (Scope.SymbolIterator i = symbols.iterator(true); i.hasNext();) { + Symbol member = i.next(); + if (!member.isTerm() || !member.isDeferred()) continue; + addInterfaceBridges(owner, member); + } + } + private Symbol getOverriddenMethod(Symbol method) { Type[] parents = method.owner().parents(); @@ -467,7 +508,11 @@ public class Erasure extends Transformer implements Modifiers { public void addInterfaceBridges(Symbol owner, Symbol method) { assert owner.isClass() && !owner.isInterface(): Debug.show(owner); Symbol overriding = method.overridingSymbol(owner.thisType()); - if (overriding != Symbol.NONE && !isSameAs(overriding.nextType(), method.nextType())) + if (overriding == method) { + Symbol overridden = method.overriddenSymbol(owner.thisType().parents()[0], owner); + if (overridden != Symbol.NONE && !isSameAs(overridden.nextType(), method.nextType())) + addBridge(owner, method, overridden); + } else if (overriding != Symbol.NONE && !isSameAs(overriding.nextType(), method.nextType())) addBridge(owner, overriding, method); } @@ -485,7 +530,7 @@ public class Erasure extends Transformer implements Modifiers { addBridgeMethodsTo(members.get(i).symbol()); } } - addInterfaceBridges(clasz); + addInterfaceBridges_(clasz); } members.append(bridges); @@ -692,28 +737,6 @@ public class Erasure extends Transformer implements Modifiers { return transform(tree, false); } - // !!! This is just rapid fix. Needs to be reviewed. - private void addInterfaceBridges(Symbol owner) { - Type[] parents = owner.info().parents(); - for (int i = 1; i < parents.length; i++) - addInterfaceBridgesRec(owner, parents[i].symbol()); - } - private void addInterfaceBridgesRec(Symbol owner, Symbol interfase) { - addInterfaceBridgesAux(owner, interfase.nextInfo().members()); - Type[] parents = interfase.parents(); - for (int i = 0; i < parents.length; i++) { - Symbol clasz = parents[i].symbol(); - if (clasz.isInterface()) addInterfaceBridgesRec(owner, clasz); - } - } - private void addInterfaceBridgesAux(Symbol owner, Scope symbols) { - for (Scope.SymbolIterator i = symbols.iterator(true); i.hasNext();) { - Symbol member = i.next(); - if (!member.isTerm() || !member.isDeferred()) continue; - addInterfaceBridges(owner, member); - } - } - /** Transform with prototype */ Tree transform(Tree expr, Type pt) { -- cgit v1.2.3