summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2007-02-11 14:19:25 +0000
committermihaylov <mihaylov@epfl.ch>2007-02-11 14:19:25 +0000
commit37dd5e78a7bf2ac0485659365e52c5a51e616eb5 (patch)
treea024054afebd6c05cd9914efabeb8e9bd8128dc2
parentf2ccc14292a7a997d3fc452f20e5cd265e2f3537 (diff)
downloadscala-37dd5e78a7bf2ac0485659365e52c5a51e616eb5.tar.gz
scala-37dd5e78a7bf2ac0485659365e52c5a51e616eb5.tar.bz2
scala-37dd5e78a7bf2ac0485659365e52c5a51e616eb5.zip
Generate direct reference to the TYPE field of ...
Generate direct reference to the TYPE field of the Java box classes for classOf[PrimitiveType]
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala16
-rw-r--r--src/library/scala/runtime/BoxedAnyArray.scala64
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala1
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