diff options
author | Martin Odersky <odersky@gmail.com> | 2006-09-21 12:11:29 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-09-21 12:11:29 +0000 |
commit | 3101d1577ea0309057bbe3abb1976099baa00dda (patch) | |
tree | f5a5cf1a0d1a41d0052519ea10b1b79408c50cae /src | |
parent | 3b48a0dbda5b032e611301e0f17acdbce2c59880 (diff) | |
download | scala-3101d1577ea0309057bbe3abb1976099baa00dda.tar.gz scala-3101d1577ea0309057bbe3abb1976099baa00dda.tar.bz2 scala-3101d1577ea0309057bbe3abb1976099baa00dda.zip |
fix^2 bug748
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 82 |
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) = |