summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2006-05-08 12:21:13 +0000
committerIulian Dragos <jaguarul@gmail.com>2006-05-08 12:21:13 +0000
commit026286b7aa727e5de632f7de6fe690bb804bf45d (patch)
treeeb51da4ab22a967e30f249e40a1d76246bee48f1 /src
parent5a5f6faf05f215e720ebd424f2d8426a9e14b574 (diff)
downloadscala-026286b7aa727e5de632f7de6fe690bb804bf45d.tar.gz
scala-026286b7aa727e5de632f7de6fe690bb804bf45d.tar.bz2
scala-026286b7aa727e5de632f7de6fe690bb804bf45d.zip
Implemented class constants in the backend.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 2fdbadf2fd..c49854e277 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -78,7 +78,7 @@ abstract class GenJVM extends SubComponent {
var jmethod: JMethod = _;
var jcode: JExtendedCode = _;
- val fjbgContext = new FJBGContext();
+ val fjbgContext = if (settings.target.value == "jvm-1.5") new FJBGContext(49, 0) else new FJBGContext();
def emitClass(jclass: JClass, sym: Symbol): Unit = {
def addScalaAttr(sym: Symbol): Unit = currentRun.symData.get(sym) match {
@@ -451,6 +451,12 @@ abstract class GenJVM extends SubComponent {
case DoubleTag => jcode.emitPUSH(const.doubleValue);
case StringTag => jcode.emitPUSH(const.stringValue);
case NullTag => jcode.emitACONST_NULL();
+ case ClassTag =>
+ val kind = toTypeKind(const.typeValue);
+ if (kind.isValueType)
+ jcode.emitPUSH(classLiteral(kind));
+ else
+ jcode.emitPUSH(javaType(kind).asInstanceOf[JReferenceType]);
case _ => abort("Unknown constant value: " + const);
}
@@ -888,6 +894,20 @@ abstract class GenJVM extends SubComponent {
negate += LE -> GT;
negate += GE -> LT;
+ /** Map from type kinds to the Java reference types. It is used for
+ * loading class constants. @see Predef.classOf. */
+ val classLiteral: Map[TypeKind, JObjectType] = new HashMap();
+
+ classLiteral += UNIT -> new JObjectType("java.lang.Void");
+ classLiteral += BOOL -> new JObjectType("java.lang.Boolean");
+ classLiteral += BYTE -> new JObjectType("java.lang.Byte");
+ classLiteral += SHORT -> new JObjectType("java.lang.Short");
+ classLiteral += CHAR -> new JObjectType("java.lang.Character");
+ classLiteral += INT -> new JObjectType("java.lang.Integer");
+ classLiteral += LONG -> new JObjectType("java.lang.Long");
+ classLiteral += FLOAT -> new JObjectType("java.lang.Float");
+ classLiteral += DOUBLE -> new JObjectType("java.lang.Double");
+
def makeLabels(bs: List[BasicBlock]) = {
//labels.clear;
if (settings.debug.value)