diff options
author | mihaylov <mihaylov@epfl.ch> | 2003-11-18 14:25:40 +0000 |
---|---|---|
committer | mihaylov <mihaylov@epfl.ch> | 2003-11-18 14:25:40 +0000 |
commit | 67c08500803b7ff349cebda9b61a38830a793ec2 (patch) | |
tree | 1ff99df632b7439eac85dfcd17431575794d52ff /sources | |
parent | 0d064c5f91d0ba8640785841858881a7e1eb9f82 (diff) | |
download | scala-67c08500803b7ff349cebda9b61a38830a793ec2.tar.gz scala-67c08500803b7ff349cebda9b61a38830a793ec2.tar.bz2 scala-67c08500803b7ff349cebda9b61a38830a793ec2.zip |
When targetting the MSIL backend, add an abstra...
When targetting the MSIL backend, add an abstract method for every
method in the class interfaces, for which the class does not provide
declaration or definition.
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index 572767a3dc..0dfb41112b 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -83,6 +83,8 @@ public class Erasure extends GenTransformer implements Modifiers { /** The current unit */ private Unit unit; + private final boolean forMSIL; + //######################################################################## // Public Constructors @@ -91,6 +93,7 @@ public class Erasure extends GenTransformer implements Modifiers { super(global); this.definitions = global.definitions; this.primitives = global.primitives; + this.forMSIL = global.target == global.TARGET_MSIL; } //######################################################################## @@ -608,6 +611,29 @@ public class Erasure extends GenTransformer implements Modifiers { } + /** Add an "empty bridge" (abstract method declaration) to satisfy + * CLR's requirement that classes should provide declaration + * for all methods of the interfaces they implement + */ + public void addEmptyBridge(Symbol owner, Symbol method) { + Type bridgeType = method.nextType(); + Symbol bridgeSym = method.cloneSymbol(owner); + bridgeSym.flags = bridgeSym.flags & ~JAVA | SYNTHETIC | DEFERRED; + //bridgeSym.setOwner(owner); + switch (bridgeType) { + case MethodType(Symbol[] params, Type restp): + // assign to bridge symbol its bridge type + // where owner of all parameters is bridge symbol itself. + Symbol[] params1 = new Symbol[params.length]; + for (int i = 0; i < params.length; i++) { + params1[i] = params[i].cloneSymbol(bridgeSym); + } + bridgeSym.setType(Type.MethodType(params1, restp)); + Tree bridge = gen.DefDef(bridgeSym, Tree.Empty); + bridges.append(bridge); + } + } + private final Map interfaces/*<Symbol,Set<Symbol>>*/ = new HashMap(); private Set getInterfacesOf(Symbol clasz) { @@ -666,6 +692,9 @@ public class Erasure extends GenTransformer implements Modifiers { Symbol overridden = method.overriddenSymbol(owner.thisType().parents()[0], owner); if (overridden != Symbol.NONE && !isSameAs(overridden.nextType(), method.nextType())) addBridge(owner, method, overridden); + if (forMSIL && (overridden == Symbol.NONE + || (overridden != Symbol.NONE && overridden.owner() != owner))) + addEmptyBridge(owner, method); } else if (overriding != Symbol.NONE && !isSameAs(overriding.nextType(), method.nextType())) addBridge(owner, overriding, method); } |