diff options
author | paltherr <paltherr@epfl.ch> | 2003-11-17 17:39:16 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-11-17 17:39:16 +0000 |
commit | b072c8ee42744f253f157e94f4f3e0a6d0ac46cb (patch) | |
tree | dcf02c4734d025fd122ffa7aeb3688ca60e2478f | |
parent | 1f99f743ae9467b0a7f9faf6f55f3437c6b855d8 (diff) | |
download | scala-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.java | 16 |
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); } |