summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-10-25 03:32:43 +0000
committerMartin Odersky <odersky@gmail.com>2005-10-25 03:32:43 +0000
commit5ffdc57de965d2f9e70e9128f5e726a50a7da656 (patch)
tree527aa164233c8751d6c7de0b10b859ae06605407 /sources
parent1806bcbab41e2a3d896838c9c826963c99b329bd (diff)
downloadscala-5ffdc57de965d2f9e70e9128f5e726a50a7da656.tar.gz
scala-5ffdc57de965d2f9e70e9128f5e726a50a7da656.tar.bz2
scala-5ffdc57de965d2f9e70e9128f5e726a50a7da656.zip
*** empty log message ***
Diffstat (limited to 'sources')
-rwxr-xr-xsources/scala/tools/nsc/symtab/Types.scala2
-rwxr-xr-xsources/scala/tools/nsc/transform/Erasure.scala80
2 files changed, 42 insertions, 40 deletions
diff --git a/sources/scala/tools/nsc/symtab/Types.scala b/sources/scala/tools/nsc/symtab/Types.scala
index c7a5c47c8f..a13b809660 100755
--- a/sources/scala/tools/nsc/symtab/Types.scala
+++ b/sources/scala/tools/nsc/symtab/Types.scala
@@ -1395,7 +1395,7 @@ import Flags._;
case Pair(ConstantType(value1), ConstantType(value2)) =>
value1 == value2
case Pair(TypeRef(pre1, sym1, args1), TypeRef(pre2, sym2, args2)) =>
- sym1 == sym2 && pre1 =:= pre2 && isSameTypes(args1, args2)
+ sym1 == sym2 && (phase.erasedTypes || pre1 =:= pre2) && isSameTypes(args1, args2)
case Pair(RefinedType(parents1, ref1), RefinedType(parents2, ref2)) =>
def isSubScope(s1: Scope, s2: Scope): boolean = s2.toList.forall {
sym2 =>
diff --git a/sources/scala/tools/nsc/transform/Erasure.scala b/sources/scala/tools/nsc/transform/Erasure.scala
index d0b362fab4..cfc9cecb4e 100755
--- a/sources/scala/tools/nsc/transform/Erasure.scala
+++ b/sources/scala/tools/nsc/transform/Erasure.scala
@@ -406,6 +406,46 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
val member = opc.overriding;
val other = opc.overridden;
if (!(member hasFlag DEFERRED)) {
+ val otpe = erasure(other.tpe);
+ val bridgeNeeded = atPhase(phase.next) {
+ !(other.tpe =:= member.tpe) &&
+ { var e = bridgesScope.lookupEntry(member.name);
+ while (e != null && !((e.sym.tpe =:= otpe) && (bridgeTarget(e.sym) == member)))
+ e = bridgesScope.lookupNextEntry(e);
+ e == null
+ }
+ }
+ if (bridgeNeeded) {
+ val bridge = other.cloneSymbolImpl(owner)
+ setPos(owner.pos)
+ setFlag (member.flags | BRIDGE)
+ resetFlag ACCESSOR
+ setInfo otpe;
+ bridgeTarget(bridge) = member;
+ owner.info.decls.enter(bridge);
+ bridgesScope enter bridge;
+ bridges =
+ atPhase(phase.next) {
+ atPos(bridge.pos) {
+ val bridgeDef =
+ DefDef(bridge, vparamss =>
+ member.tpe match {
+ case MethodType(List(), ConstantType(c)) => Literal(c)
+ case _ =>
+ ((Select(This(owner), member): Tree) /: vparamss)
+ ((fun, vparams) => Apply(fun, vparams map Ident))
+ });
+ if (settings.debug.value)
+ log("generating bridge from " + other + ":" + otpe + other.locationString + " to " + member + ":" + erasure(member.tpe) + member.locationString + " =\n " + bridgeDef);
+ bridgeDef
+ }
+ } :: bridges;
+ }
+ }
+ opc.next
+ }
+ bridges
+ }
/*
for (val bc <- site.baseClasses.tail; val other <- bc.info.decls.toList) {
if (other.isMethod && !other.isConstructor) {
@@ -415,48 +455,10 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
(site.memberType(member) matches site.memberType(other)) &&
!(site.parents exists (p =>
(p.symbol isSubClass member.owner) && (p.symbol isSubClass other.owner)))) {
-*/
- val otpe = erasure(other.tpe);
- if (!(otpe =:= erasure(member.tpe))) {
- var e = bridgesScope.lookupEntry(member.name);
- while (e != null && !((e.sym.tpe =:= otpe) && (bridgeTarget(e.sym) == member)))
- e = bridgesScope.lookupNextEntry(e);
- if (e == null) {
- val bridge = other.cloneSymbolImpl(owner)
- setPos(owner.pos)
- setFlag (member.flags | BRIDGE)
- resetFlag ACCESSOR
- setInfo otpe;
- bridgeTarget(bridge) = member;
- owner.info.decls.enter(bridge);
- bridgesScope enter bridge;
- bridges =
- atPhase(phase.next) {
- atPos(bridge.pos) {
- val bridgeDef =
- DefDef(bridge, vparamss =>
- member.tpe match {
- case MethodType(List(), ConstantType(c)) => Literal(c)
- case _ =>
- ((Select(This(owner), member): Tree) /: vparamss)
- ((fun, vparams) => Apply(fun, vparams map Ident))
- });
- if (settings.debug.value)
- log("generating bridge from " + other + ":" + otpe + other.locationString + " to " + member + ":" + erasure(member.tpe) + member.locationString + " =\n " + bridgeDef);
- bridgeDef
- }
- } :: bridges;
- }
- }
-/*
+...
}
}
*/
- }
- opc.next
- }
- bridges
- }
def addBridges(stats: List[Tree], base: Symbol): List[Tree] =
if (base.isTrait) stats