summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-11-17 17:39:16 +0000
committerpaltherr <paltherr@epfl.ch>2003-11-17 17:39:16 +0000
commitb072c8ee42744f253f157e94f4f3e0a6d0ac46cb (patch)
treedcf02c4734d025fd122ffa7aeb3688ca60e2478f
parent1f99f743ae9467b0a7f9faf6f55f3437c6b855d8 (diff)
downloadscala-b072c8ee42744f253f157e94f4f3e0a6d0ac46cb.tar.gz
scala-b072c8ee42744f253f157e94f4f3e0a6d0ac46cb.tar.bz2
scala-b072c8ee42744f253f157e94f4f3e0a6d0ac46cb.zip
- Fixed case Select (replaced symbol.owner.type...
- Fixed case Select (replaced symbol.owner.type, by qualifier.type) - Added special case for conversions from scala.Array to non-array type - Added special case for conversions from non-array to scala.Array type
-rw-r--r--sources/scalac/transformer/Erasure.java16
1 files changed, 14 insertions, 2 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index ee09f2c502..831e4df9e9 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -199,9 +199,10 @@ public class Erasure extends GenTransformer implements Modifiers {
return genApply(tree.pos, fun, vargs);
case Select(Tree qualifier, _):
+ Type prefix = qualifier.getType();
Symbol symbol = tree.symbol();
qualifier = transform(qualifier);
- qualifier = coerce(qualifier, symbol.owner().type().erasure());
+ qualifier = coerce(qualifier, prefix.erasure());
// Might end up with "box(unbox(...))". That's needed by backend.
if (isUnboxedType(qualifier.getType())) qualifier = box(qualifier);
return gen.Select(tree.pos, qualifier, symbol);
@@ -295,12 +296,23 @@ public class Erasure extends GenTransformer implements Modifiers {
/** Coerces the given tree to the given type. */
private Tree coerce(Tree tree, Type pt) {
- if (isSubType(tree.getType(), pt)) return tree;
+ if (isSubType(tree.getType(), pt)) {
+ if (tree.getType().symbol() == definitions.ARRAY_CLASS) {
+ if (pt.symbol() != definitions.ARRAY_CLASS) {
+ Symbol symbol = primitives.AS__ARRAY;
+ return coerce(gen.mkApply__(gen.Select(tree, symbol)), pt);
+ }
+ }
+ return tree;
+ }
if (isUnboxedType(tree.getType())) {
if (!isUnboxedType(pt)) return coerce(box(tree), pt);
} else if (isUnboxedType(pt)) {
if (tree.type.symbol() == definitions.ARRAY_CLASS
|| isUnboxedSimpleType(pt)) return unbox(tree, pt);
+ } else if (pt.symbol() == definitions.ARRAY_CLASS) {
+ Tree boxtree = gen.mkRef(tree.pos, primitives.BOX__ARRAY);
+ return gen.mkApply_V(boxtree, new Tree[]{tree});
}
return gen.mkAsInstanceOf(tree, pt);
}