summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2003-11-18 14:25:40 +0000
committermihaylov <mihaylov@epfl.ch>2003-11-18 14:25:40 +0000
commit67c08500803b7ff349cebda9b61a38830a793ec2 (patch)
tree1ff99df632b7439eac85dfcd17431575794d52ff /sources
parent0d064c5f91d0ba8640785841858881a7e1eb9f82 (diff)
downloadscala-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.java29
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);
}