summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-12-03 16:11:14 +0000
committerpaltherr <paltherr@epfl.ch>2003-12-03 16:11:14 +0000
commit2a0a8d29e133c72ada267ee4d9e80c13ffcfde73 (patch)
tree61156b6d313192a6c2bbcecabdc0a73a3303fc6e
parentbdb4c6d897d5f5a21c530e8ee553b2d1826693db (diff)
downloadscala-2a0a8d29e133c72ada267ee4d9e80c13ffcfde73.tar.gz
scala-2a0a8d29e133c72ada267ee4d9e80c13ffcfde73.tar.bz2
scala-2a0a8d29e133c72ada267ee4d9e80c13ffcfde73.zip
- Added special cases for unbox methods
- Simplified code for box methods
-rw-r--r--sources/scalac/transformer/ErasurePhase.java34
1 files changed, 24 insertions, 10 deletions
diff --git a/sources/scalac/transformer/ErasurePhase.java b/sources/scalac/transformer/ErasurePhase.java
index 579040f5e6..8bd778f0e2 100644
--- a/sources/scalac/transformer/ErasurePhase.java
+++ b/sources/scalac/transformer/ErasurePhase.java
@@ -76,16 +76,10 @@ public class ErasurePhase extends Phase {
}
}
if (sym.isTerm() && sym.isParameter()) {
- if (primitives.getPrimitive(sym.owner()) == Primitive.BOX) {
- switch (tp) {
- case TypeRef(Type prefix, Symbol clasz, Type[] args):
- if (args.length > 0 && args[0].symbol().isAbstractType())
- return definitions.ANYREF_CLASS.nextType();
- break;
- default:
- throw Debug.abort("illegal case", tp);
- }
- }
+ if (primitives.getPrimitive(sym.owner()) == Primitive.BOX)
+ return eraseUnboxMethodType(tp);
+ if (primitives.getPrimitive(sym.owner()) == Primitive.UNBOX)
+ return eraseBoxMethodType(tp);
}
if (sym.isType()) return tp;
if (sym.isThisSym()) return sym.owner().nextType();
@@ -94,6 +88,7 @@ public class ErasurePhase extends Phase {
case Primitive.IS : return Type.PolyType(tp.typeParams(), Type.MethodType(tp.valueParams(), tp.resultType().erasure()));
case Primitive.AS : return tp;
case Primitive.BOX: return eraseBoxMethodType(tp);
+ case Primitive.UNBOX: return eraseUnboxMethodType(tp);
case Primitive.AS__ARRAY:
return Type.MethodType(Symbol.EMPTY_ARRAY, definitions.ANY_CLASS.nextType());
default : return tp.erasure();
@@ -125,5 +120,24 @@ public class ErasurePhase extends Phase {
}
}
+ private Type eraseUnboxMethodType(Type type) {
+ switch (type) {
+ case PolyType(_, Type result):
+ return eraseUnboxMethodType(result);
+ case MethodType(Symbol[] params, Type result):
+ return Type.MethodType(params, eraseUnboxMethodType(result));
+ case TypeRef(_, Symbol clasz, Type[] args):
+ if (clasz == definitions.ARRAY_CLASS) {
+ Symbol element = args[0].symbol();
+ if (element.isAbstractType())
+ if (element.info().symbol() == definitions.ANY_CLASS)
+ return definitions.ANYREF_CLASS.nextType();
+ }
+ return type.erasure();
+ default:
+ throw Debug.abort("illegal case", type);
+ }
+ }
+
//########################################################################
}