diff options
-rw-r--r-- | lib/fjbg.jar.desired.sha1 | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 22 |
2 files changed, 22 insertions, 2 deletions
diff --git a/lib/fjbg.jar.desired.sha1 b/lib/fjbg.jar.desired.sha1 index ed3c414956..67c66b1621 100644 --- a/lib/fjbg.jar.desired.sha1 +++ b/lib/fjbg.jar.desired.sha1 @@ -1 +1 @@ -0b8a2e9257039ac9a7ba02720e3497655aa2015b ?fjbg.jar +984b59d88966285bb88924aa9ae950a194362e41 ?fjbg.jar 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) |