diff options
author | paltherr <paltherr@epfl.ch> | 2003-12-03 16:11:14 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-12-03 16:11:14 +0000 |
commit | 2a0a8d29e133c72ada267ee4d9e80c13ffcfde73 (patch) | |
tree | 61156b6d313192a6c2bbcecabdc0a73a3303fc6e | |
parent | bdb4c6d897d5f5a21c530e8ee553b2d1826693db (diff) | |
download | scala-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.java | 34 |
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); + } + } + //######################################################################## } |