summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-09-21 12:11:29 +0000
committerMartin Odersky <odersky@gmail.com>2006-09-21 12:11:29 +0000
commit3101d1577ea0309057bbe3abb1976099baa00dda (patch)
treef5a5cf1a0d1a41d0052519ea10b1b79408c50cae
parent3b48a0dbda5b032e611301e0f17acdbce2c59880 (diff)
downloadscala-3101d1577ea0309057bbe3abb1976099baa00dda.tar.gz
scala-3101d1577ea0309057bbe3abb1976099baa00dda.tar.bz2
scala-3101d1577ea0309057bbe3abb1976099baa00dda.zip
fix^2 bug748
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala82
1 files changed, 49 insertions, 33 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 0e15ca8d45..9e96025e5f 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -233,41 +233,57 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
* Object -> Seq, Iterable (might be an array, which needs to be boxed)
*/
private def cast(tree: Tree, pt: Type): Tree =
- if (pt.symbol == ArrayClass && tree.tpe.symbol == ObjectClass)
- typed {
- atPos(tree.pos) {
- evalOnce(tree, x =>
- gen.mkAttributedCast(
- If(
- Apply(
- TypeApply(
- Select(x(), Object_isInstanceOf),
- List(TypeTree(BoxedArrayClass.tpe))),
- List()),
- unbox(gen.mkAttributedCast(x(), BoxedArrayClass.tpe), pt),
- x()),
- pt))
+ if (tree.tpe.symbol == ObjectClass) {
+ if (pt.symbol == ArrayClass)
+ typed {
+ atPos(tree.pos) {
+ evalOnce(tree, x =>
+ gen.mkAttributedCast(
+ If(
+ Apply(
+ TypeApply(
+ Select(x(), Object_isInstanceOf),
+ List(TypeTree(BoxedArrayClass.tpe))),
+ List()),
+ unbox(gen.mkAttributedCast(x(), BoxedArrayClass.tpe), pt),
+ x()),
+ pt))
+ }
}
- }
- else if ((pt.symbol.isNonBottomSubClass(BoxedArrayClass) ||
- pt.symbol != ObjectClass && SeqClass.isNonBottomSubClass(pt.symbol)) &&
- tree.tpe.symbol == ObjectClass)
- typed {
- atPos(tree.pos) {
- evalOnce(tree, x =>
- gen.mkAttributedCast(
- If(
- Apply(
- TypeApply(
- Select(x(), Object_isInstanceOf),
- List(TypeTree(BoxedArrayClass.tpe))),
- List()),
- x(),
- boxArray(x())),
- pt))
+ else if (pt.symbol isNonBottomSubClass BoxedArrayClass)
+ typed {
+ atPos(tree.pos) {
+ evalOnce(tree, x =>
+ gen.mkAttributedCast(
+ If(
+ Apply(
+ TypeApply(
+ Select(x(), Object_isInstanceOf),
+ List(TypeTree(BoxedArrayClass.tpe))),
+ List()),
+ x(),
+ boxArray(x())),
+ pt))
+ }
}
- }
- else gen.mkAttributedCast(tree, pt);
+ else if ((SeqClass isNonBottomSubClass pt.symbol) && pt.symbol != ObjectClass)
+ typed {
+ atPos(tree.pos) {
+ evalOnce(tree, x =>
+ gen.mkAttributedCast(
+ If(
+ Apply(
+ TypeApply(
+ Select(x(), Object_isInstanceOf),
+ List(TypeTree(pt))),
+ List()),
+ x(),
+ boxArray(x())),
+ pt))
+ }
+ }
+ else gen.mkAttributedCast(tree, pt)
+ } else gen.mkAttributedCast(tree, pt)
/** Is symbol a member of unboxed arrays (which will be expanded directly later)? */
private def isUnboxedArrayMember(sym: Symbol) =