summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/fjbg.jar.desired.sha12
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala22
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)