summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-06-22 21:10:33 +0000
committerPaul Phillips <paulp@improving.org>2011-06-22 21:10:33 +0000
commit9853b5b8292650d8e192b500e636dc441550eef7 (patch)
treeec3a85b9b7af29c9fbd3bba17389791f083394cc /src/library
parente49ec10e93eeec1af775096de07dd46a7d0a1fad (diff)
downloadscala-9853b5b8292650d8e192b500e636dc441550eef7.tar.gz
scala-9853b5b8292650d8e192b500e636dc441550eef7.tar.bz2
scala-9853b5b8292650d8e192b500e636dc441550eef7.zip
A total rewrite of "runtimeClass", discarding t...
A total rewrite of "runtimeClass", discarding the user-space approach in favor of simply fixing getClass. def f1 = 5.getClass // Class[Int] def f2 = (5: AnyVal).getClass // Class[_ <: AnyVal] def f3 = (5: java.lang.Integer).getClass // Class[_ <: java.lang.Integer] class A class B extends A def f1 = (new B: Any).getClass().newInstance() // Any def f2 = (new B: AnyRef).getClass().newInstance() // AnyRef def f3 = (new B: A).getClass().newInstance() // A def f4 = (new B: B).getClass().newInstance() // B But that's not all! def f0[T >: B] = (new B: T).getClass().newInstance() def f5 = f0[Any] // Any def f6 = f0[AnyRef] // AnyRef def f7 = f0[A] // A def f8 = f0[B] // B Closes #490, #896, #4696. Review by moors. (Note: I think this is pretty good, but picky review requested.)
Diffstat (limited to 'src/library')
-rwxr-xr-xsrc/library/scala/Boolean.scala2
-rw-r--r--src/library/scala/Byte.scala1
-rw-r--r--src/library/scala/Char.scala1
-rw-r--r--src/library/scala/Double.scala1
-rw-r--r--src/library/scala/Float.scala1
-rw-r--r--src/library/scala/Int.scala1
-rw-r--r--src/library/scala/Long.scala1
-rw-r--r--src/library/scala/Short.scala1
-rwxr-xr-xsrc/library/scala/Unit.scala5
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala16
10 files changed, 28 insertions, 2 deletions
diff --git a/src/library/scala/Boolean.scala b/src/library/scala/Boolean.scala
index 7719065ae7..f77bdd2ea0 100755
--- a/src/library/scala/Boolean.scala
+++ b/src/library/scala/Boolean.scala
@@ -29,6 +29,8 @@ final class Boolean extends AnyVal {
def |(x: Boolean): Boolean = sys.error("stub")
def &(x: Boolean): Boolean = sys.error("stub")
def ^(x: Boolean): Boolean = sys.error("stub")
+
+ def getClass(): Class[Boolean] = sys.error("stub")
}
object Boolean extends AnyValCompanion {
diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala
index 540e05c19f..8c598e044a 100644
--- a/src/library/scala/Byte.scala
+++ b/src/library/scala/Byte.scala
@@ -144,6 +144,7 @@ final class Byte extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Byte] = sys.error("stub")
}
object Byte extends AnyValCompanion {
diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala
index a5d1cb019b..a8f15125bf 100644
--- a/src/library/scala/Char.scala
+++ b/src/library/scala/Char.scala
@@ -144,6 +144,7 @@ final class Char extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Char] = sys.error("stub")
}
object Char extends AnyValCompanion {
diff --git a/src/library/scala/Double.scala b/src/library/scala/Double.scala
index 5f2e01063f..108c6207bb 100644
--- a/src/library/scala/Double.scala
+++ b/src/library/scala/Double.scala
@@ -118,6 +118,7 @@ final class Double extends AnyVal {
def %(x: Float): Double = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Double] = sys.error("stub")
}
object Double extends AnyValCompanion {
diff --git a/src/library/scala/Float.scala b/src/library/scala/Float.scala
index f403e5ccab..9ef7181806 100644
--- a/src/library/scala/Float.scala
+++ b/src/library/scala/Float.scala
@@ -118,6 +118,7 @@ final class Float extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Float] = sys.error("stub")
}
object Float extends AnyValCompanion {
diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala
index c53be1241d..4546934149 100644
--- a/src/library/scala/Int.scala
+++ b/src/library/scala/Int.scala
@@ -144,6 +144,7 @@ final class Int extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Int] = sys.error("stub")
}
object Int extends AnyValCompanion {
diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala
index 3124130663..12b8a25b8a 100644
--- a/src/library/scala/Long.scala
+++ b/src/library/scala/Long.scala
@@ -144,6 +144,7 @@ final class Long extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Long] = sys.error("stub")
}
object Long extends AnyValCompanion {
diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala
index 8bf6f09154..81953505b7 100644
--- a/src/library/scala/Short.scala
+++ b/src/library/scala/Short.scala
@@ -144,6 +144,7 @@ final class Short extends AnyVal {
def %(x: Float): Float = sys.error("stub")
def %(x: Double): Double = sys.error("stub")
+ def getClass(): Class[Short] = sys.error("stub")
}
object Short extends AnyValCompanion {
diff --git a/src/library/scala/Unit.scala b/src/library/scala/Unit.scala
index 58b024273b..c5d12afeba 100755
--- a/src/library/scala/Unit.scala
+++ b/src/library/scala/Unit.scala
@@ -15,8 +15,9 @@ package scala
* not represented as objects by the underlying host system. There is
* only one value of type Unit: `()`.
*/
-final class Unit extends AnyVal { }
-
+final class Unit extends AnyVal {
+ def getClass(): Class[Unit] = sys.error("stub")
+}
object Unit extends AnyValCompanion {
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index 7a8224298b..031f15f10a 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -32,6 +32,22 @@ object ScalaRunTime {
def isValueClass(clazz: Class[_]) = clazz.isPrimitive()
+ /** Return the class object representing an unboxed value type,
+ * e.g. classOf[int], not classOf[java.lang.Integer]. The compiler
+ * rewrites expressions like 5.getClass to come here.
+ */
+ def anyValClass[T <: AnyVal](value: T): Class[T] = (value match {
+ case x: Byte => java.lang.Byte.TYPE
+ case x: Short => java.lang.Short.TYPE
+ case x: Char => java.lang.Character.TYPE
+ case x: Int => java.lang.Integer.TYPE
+ case x: Long => java.lang.Long.TYPE
+ case x: Float => java.lang.Float.TYPE
+ case x: Double => java.lang.Double.TYPE
+ case x: Boolean => java.lang.Boolean.TYPE
+ case x: Unit => java.lang.Void.TYPE
+ }).asInstanceOf[Class[T]]
+
/** Retrieve generic array element */
def array_apply(xs: AnyRef, idx: Int): Any = xs match {
case x: Array[AnyRef] => x(idx).asInstanceOf[Any]