diff options
author | Martin Odersky <odersky@gmail.com> | 2009-10-08 11:29:30 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-10-08 11:29:30 +0000 |
commit | 176401d4531a6b868ff7bb344a479336eb5ec4ab (patch) | |
tree | 20b8a90049b30c19341d8a0692e27e5272006e24 | |
parent | 383b4ca492d20f01c18e72f27ccf38352a9ee889 (diff) | |
download | scala-176401d4531a6b868ff7bb344a479336eb5ec4ab.tar.gz scala-176401d4531a6b868ff7bb344a479336eb5ec4ab.tar.bz2 scala-176401d4531a6b868ff7bb344a479336eb5ec4ab.zip |
Fixed #2425
-rw-r--r-- | src/compiler/scala/tools/nsc/FatalError.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 14 | ||||
-rw-r--r-- | src/library/scala/runtime/ScalaRunTime.scala | 4 |
3 files changed, 12 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/FatalError.scala b/src/compiler/scala/tools/nsc/FatalError.scala index 836bd79175..bded46ffdd 100644 --- a/src/compiler/scala/tools/nsc/FatalError.scala +++ b/src/compiler/scala/tools/nsc/FatalError.scala @@ -7,7 +7,9 @@ package scala.tools.nsc case class FatalError(msg: String) extends Exception(msg) + class MissingRequirementError(val req: String) extends FatalError(req + " not found.") + object MissingRequirementError { def unapply(x: Throwable) = x match { case x: MissingRequirementError => Some(x.req) diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 769174aead..a5f764952f 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -901,21 +901,23 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. treeCopy.DefDef(tree, mods, name, List(), vparamss, tpt, rhs) case TypeDef(_, _, _, _) => EmptyTree - case TypeApply(fun, args @ List(arg)) // !!! todo: simplify by having GenericArray also extract trees + case Apply(instanceOf @ TypeApply(fun @ Select(qual, name), args @ List(arg)), List()) // !!! todo: simplify by having GenericArray also extract trees if ((fun.symbol == Any_isInstanceOf || fun.symbol == Object_isInstanceOf) && unboundedGenericArrayLevel(arg.tpe) > 0) => val level = unboundedGenericArrayLevel(arg.tpe) def isArrayTest(arg: Tree) = gen.mkRuntimeCall("isArray", List(arg, Literal(Constant(level)))) typedPos(tree.pos) { - if (level == 1) isArrayTest(fun) + if (level == 1) isArrayTest(qual) else - gen.evalOnce(fun, currentOwner, unit) { fun1 => + gen.evalOnce(qual, currentOwner, unit) { qual1 => gen.mkAnd( - treeCopy.TypeApply(tree, fun1(), args), - isArrayTest(fun1())) + Apply(TypeApply(Select(qual1(), fun.symbol), + List(TypeTree(erasure(arg.tpe)))), + List()), + isArrayTest(qual1())) } - } + } case TypeApply(fun, args) if (fun.symbol.owner != AnyClass && fun.symbol != Object_asInstanceOf && fun.symbol != Object_isInstanceOf) => diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index 89096e0e6f..af28d09db7 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -22,8 +22,8 @@ object ScalaRunTime { def isArray(x: AnyRef): Boolean = // !!! remove once newarrays x != null && (x.getClass.isArray || x.isInstanceOf[BoxedArray[_]]) - def isArray(x: AnyRef, atLevel: Int): Boolean = - x != null && isArrayClass(x.getClass, atLevel) + def isArray(x: Any, atLevel: Int): Boolean = + x != null && isArrayClass(x.asInstanceOf[AnyRef].getClass, atLevel) private def isArrayClass(clazz: Class[_], atLevel: Int): Boolean = clazz.isArray && (atLevel == 1 || isArrayClass(clazz.getComponentType, atLevel - 1)) |