diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2006-05-08 12:21:13 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2006-05-08 12:21:13 +0000 |
commit | 026286b7aa727e5de632f7de6fe690bb804bf45d (patch) | |
tree | eb51da4ab22a967e30f249e40a1d76246bee48f1 /src/compiler | |
parent | 5a5f6faf05f215e720ebd424f2d8426a9e14b574 (diff) | |
download | scala-026286b7aa727e5de632f7de6fe690bb804bf45d.tar.gz scala-026286b7aa727e5de632f7de6fe690bb804bf45d.tar.bz2 scala-026286b7aa727e5de632f7de6fe690bb804bf45d.zip |
Implemented class constants in the backend.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 22 |
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) |