From 37dd5e78a7bf2ac0485659365e52c5a51e616eb5 Mon Sep 17 00:00:00 2001 From: mihaylov Date: Sun, 11 Feb 2007 14:19:25 +0000 Subject: Generate direct reference to the TYPE field of ... Generate direct reference to the TYPE field of the Java box classes for classOf[PrimitiveType] --- .../scala/tools/nsc/transform/CleanUp.scala | 16 +++++- src/library/scala/runtime/BoxedAnyArray.scala | 64 +++++++++++----------- src/library/scala/runtime/ScalaRunTime.scala | 1 + 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala index 52070f7083..499ff83e12 100644 --- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala +++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala @@ -27,6 +27,20 @@ abstract class CleanUp extends Transform { private val newDefs = new ListBuffer[Tree] private val classConstantMeth = new HashMap[String, Symbol] + // a map from the symbols of the Scala primitive types to the symbols + // of the modules of the Java box classes + private val javaBoxClassModule = new HashMap[Symbol, Symbol] + + javaBoxClassModule(UnitClass) = getModule("java.lang.Void") + javaBoxClassModule(BooleanClass) = getModule("java.lang.Boolean") + javaBoxClassModule(ByteClass) = getModule("java.lang.Byte") + javaBoxClassModule(ShortClass) = getModule("java.lang.Short") + javaBoxClassModule(IntClass) = getModule("java.lang.Integer") + javaBoxClassModule(CharClass) = getModule("java.lang.Character") + javaBoxClassModule(LongClass) = getModule("java.lang.Long") + javaBoxClassModule(FloatClass) = getModule("java.lang.Float") + javaBoxClassModule(DoubleClass) = getModule("java.lang.Double") + private var localTyper: analyzer.Typer = null; private def freshClassConstantMethName() = unit.fresh.newName("class$Method") @@ -85,7 +99,7 @@ abstract class CleanUp extends Transform { atPos(tree.pos) { localTyper.typed { if (isValueClass(tpe.symbol)) - gen.mkRuntimeCall(tpe.symbol.name.toString() + "TYPE", List()) + Select(gen.mkAttributedRef(javaBoxClassModule(tpe.symbol)), "TYPE") else Apply( gen.mkAttributedRef(classConstantMethod(tree.pos, signature(tpe))), diff --git a/src/library/scala/runtime/BoxedAnyArray.scala b/src/library/scala/runtime/BoxedAnyArray.scala index 7bfe01d60e..5a1a6b99cc 100644 --- a/src/library/scala/runtime/BoxedAnyArray.scala +++ b/src/library/scala/runtime/BoxedAnyArray.scala @@ -30,21 +30,21 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { def apply(index: Int): Any = synchronized { if (unboxed eq null) boxed(index); - else if (elemClass eq ScalaRunTime.IntTYPE) + else if (elemClass eq classOf[Int]) Int.box(unboxed.asInstanceOf[Array[Int]](index)) - else if (elemClass eq ScalaRunTime.DoubleTYPE) + else if (elemClass eq classOf[Double]) Double.box(unboxed.asInstanceOf[Array[Double]](index)) - else if (elemClass eq ScalaRunTime.FloatTYPE) + else if (elemClass eq classOf[Float]) Float.box(unboxed.asInstanceOf[Array[Float]](index)) - else if (elemClass eq ScalaRunTime.LongTYPE) + else if (elemClass eq classOf[Long]) Long.box(unboxed.asInstanceOf[Array[Long]](index)) - else if (elemClass eq ScalaRunTime.CharTYPE) + else if (elemClass eq classOf[Char]) Char.box(unboxed.asInstanceOf[Array[Char]](index)) - else if (elemClass eq ScalaRunTime.ByteTYPE) + else if (elemClass eq classOf[Byte]) Byte.box(unboxed.asInstanceOf[Array[Byte]](index)) - else if (elemClass eq ScalaRunTime.ShortTYPE) + else if (elemClass eq classOf[Short]) Short.box(unboxed.asInstanceOf[Array[Short]](index)) - else if (elemClass eq ScalaRunTime.BooleanTYPE) + else if (elemClass eq classOf[Boolean]) Boolean.box(unboxed.asInstanceOf[Array[Boolean]](index)) else unboxed.asInstanceOf[Array[AnyRef]](index) @@ -54,41 +54,41 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { val elem = _elem.asInstanceOf[AnyRef] if (unboxed eq null) boxed(index) = elem - else if (elemClass eq ScalaRunTime.IntTYPE) + else if (elemClass eq classOf[Int]) unboxed.asInstanceOf[Array[Int]](index) = Int.unbox(elem) - else if (elemClass eq ScalaRunTime.DoubleTYPE) + else if (elemClass eq classOf[Double]) unboxed.asInstanceOf[Array[Double]](index) = Double.unbox(elem) - else if (elemClass eq ScalaRunTime.FloatTYPE) + else if (elemClass eq classOf[Float]) unboxed.asInstanceOf[Array[Float]](index) = Float.unbox(elem) - else if (elemClass eq ScalaRunTime.LongTYPE) + else if (elemClass eq classOf[Long]) unboxed.asInstanceOf[Array[Long]](index) = Long.unbox(elem) - else if (elemClass eq ScalaRunTime.CharTYPE) + else if (elemClass eq classOf[Char]) unboxed.asInstanceOf[Array[Char]](index) = Char.unbox(elem) - else if (elemClass eq ScalaRunTime.ByteTYPE) + else if (elemClass eq classOf[Byte]) unboxed.asInstanceOf[Array[Byte]](index) = Byte.unbox(elem) - else if (elemClass eq ScalaRunTime.ShortTYPE) + else if (elemClass eq classOf[Short]) unboxed.asInstanceOf[Array[Short]](index) = Short.unbox(elem) - else if (elemClass eq ScalaRunTime.BooleanTYPE) + else if (elemClass eq classOf[Boolean]) unboxed.asInstanceOf[Array[Boolean]](index) = Boolean.unbox(elem) else unboxed.asInstanceOf[Array[AnyRef]](index) = elem } def unbox(elemTag: String): AnyRef = - if (elemTag eq ScalaRunTime.IntTag) unbox(ScalaRunTime.IntTYPE) - else if (elemTag eq ScalaRunTime.DoubleTag) unbox(ScalaRunTime.DoubleTYPE) - else if (elemTag eq ScalaRunTime.FloatTag) unbox(ScalaRunTime.FloatTYPE) - else if (elemTag eq ScalaRunTime.LongTag) unbox(ScalaRunTime.LongTYPE) - else if (elemTag eq ScalaRunTime.CharTag) unbox(ScalaRunTime.CharTYPE) - else if (elemTag eq ScalaRunTime.ByteTag) unbox(ScalaRunTime.ByteTYPE) - else if (elemTag eq ScalaRunTime.ShortTag) unbox(ScalaRunTime.ShortTYPE) - else if (elemTag eq ScalaRunTime.BooleanTag) unbox(ScalaRunTime.BooleanTYPE) + if (elemTag eq ScalaRunTime.IntTag) unbox(classOf[Int]) + else if (elemTag eq ScalaRunTime.DoubleTag) unbox(classOf[Double]) + else if (elemTag eq ScalaRunTime.FloatTag) unbox(classOf[Float]) + else if (elemTag eq ScalaRunTime.LongTag) unbox(classOf[Long]) + else if (elemTag eq ScalaRunTime.CharTag) unbox(classOf[Char]) + else if (elemTag eq ScalaRunTime.ByteTag) unbox(classOf[Byte]) + else if (elemTag eq ScalaRunTime.ShortTag) unbox(classOf[Short]) + else if (elemTag eq ScalaRunTime.BooleanTag) unbox(classOf[Boolean]) else unbox(Platform.getClassForName(elemTag)) def unbox(elemClass: Class): AnyRef = synchronized { if (unboxed eq null) { this.elemClass = elemClass; - if (elemClass eq ScalaRunTime.IntTYPE) { + if (elemClass eq classOf[Int]) { val newvalue = new Array[Int](length) var i = 0 while (i < length) { @@ -96,7 +96,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue - } else if (elemClass eq ScalaRunTime.DoubleTYPE) { + } else if (elemClass eq classOf[Double]) { val newvalue = new Array[Double](length) var i = 0 while (i < length) { @@ -104,7 +104,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue; - } else if (elemClass eq ScalaRunTime.FloatTYPE) { + } else if (elemClass eq classOf[Float]) { val newvalue = new Array[Float](length) var i = 0 while (i < length) { @@ -112,7 +112,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue; - } else if (elemClass eq ScalaRunTime.LongTYPE) { + } else if (elemClass eq classOf[Long]) { val newvalue = new Array[Long](length) var i = 0 while (i < length) { @@ -120,7 +120,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue; - } else if (elemClass eq ScalaRunTime.CharTYPE) { + } else if (elemClass eq classOf[Char]) { val newvalue = new Array[Char](length) var i = 0 while (i < length) { @@ -128,7 +128,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue - } else if (elemClass eq ScalaRunTime.ByteTYPE) { + } else if (elemClass eq classOf[Byte]) { val newvalue = new Array[Byte](length) var i = 0 while (i < length) { @@ -136,7 +136,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue; - } else if (elemClass eq ScalaRunTime.ShortTYPE) { + } else if (elemClass eq classOf[Short]) { val newvalue = new Array[Short](length) var i = 0 while (i < length) { @@ -144,7 +144,7 @@ final class BoxedAnyArray(val length: Int) extends BoxedArray { i = i + 1 } unboxed = newvalue; - } else if (elemClass eq ScalaRunTime.BooleanTYPE) { + } else if (elemClass eq classOf[Boolean]) { val newvalue = new Array[Boolean](length) var i = 0 while (i < length) { diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index 248904c0e1..0fa55e26c9 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -29,6 +29,7 @@ object ScalaRunTime { val DoubleTag = ".Double" val BooleanTag = ".Boolean" + // TODO: remove after the next (as of Feb 11) starr compiler val ByteTYPE = java.lang.Byte.TYPE val ShortTYPE = java.lang.Short.TYPE val CharTYPE = java.lang.Character.TYPE -- cgit v1.2.3