summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scala/runtime/types/JavaClassType.java24
-rw-r--r--sources/scalac/symtab/Definitions.java9
-rw-r--r--sources/scalac/transformer/TypesAsValuesPhase.java10
-rw-r--r--sources/scalac/util/Names.java1
4 files changed, 39 insertions, 5 deletions
diff --git a/sources/scala/runtime/types/JavaClassType.java b/sources/scala/runtime/types/JavaClassType.java
index 767459fc3a..7779162cb9 100644
--- a/sources/scala/runtime/types/JavaClassType.java
+++ b/sources/scala/runtime/types/JavaClassType.java
@@ -10,11 +10,33 @@
package scala.runtime.types;
+import java.util.HashMap;
+
public class JavaClassType extends ClassType {
private static final ClassLoader loader =
ClassLoader.getSystemClassLoader();
- public JavaClassType(String fullName) throws ClassNotFoundException {
+ private static ThreadLocal cacheLocal = new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ }
+ };
+
+ public static JavaClassType javaClassType(String fullName) {
+ HashMap/*<String, JavaClassType>*/ cache = (HashMap)cacheLocal.get();
+ JavaClassType jct = (JavaClassType)cache.get(fullName);
+ if (jct == null) {
+ try {
+ jct = new JavaClassType(fullName);
+ cache.put(fullName, jct);
+ } catch (ClassNotFoundException e) {
+ throw new Error(e);
+ }
+ }
+ return jct;
+ }
+
+ private JavaClassType(String fullName) throws ClassNotFoundException {
super(Class.forName(fullName, false, loader), true);
}
}
diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java
index 8f306ab4ac..00e37cc2a4 100644
--- a/sources/scalac/symtab/Definitions.java
+++ b/sources/scalac/symtab/Definitions.java
@@ -704,6 +704,15 @@ public class Definitions {
return SCALACLASSTYPE_EMPTYARRAY;
}
+ private Symbol JAVACLASSTYPE_JAVACLASSTYPE;
+ public Symbol JAVACLASSTYPE_JAVACLASSTYPE() {
+ if (JAVACLASSTYPE_JAVACLASSTYPE == null)
+ JAVACLASSTYPE_JAVACLASSTYPE =
+ loadTerm(JAVACLASSTYPE_CLASS.linkedModule().moduleClass(),
+ Names.javaClassType);
+ return JAVACLASSTYPE_JAVACLASSTYPE;
+ }
+
//########################################################################
// Public Fields - Global values
diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java
index 92e397ae0d..71be22e44b 100644
--- a/sources/scalac/transformer/TypesAsValuesPhase.java
+++ b/sources/scalac/transformer/TypesAsValuesPhase.java
@@ -780,7 +780,10 @@ public class TypesAsValuesPhase extends Phase {
private boolean isTrivial(Type tp) {
switch (tp) {
case TypeRef(_, Symbol sym, Type[] args):
- return sym.isStatic() && args.length == 0;
+ if (sym == defs.ARRAY_CLASS)
+ return isTrivial(args[0]);
+ else
+ return sym.isStatic() && args.length == 0;
case SingleType(_, _):
case ThisType(_):
case CompoundType(_, _):
@@ -881,11 +884,10 @@ public class TypesAsValuesPhase extends Phase {
private Tree javaType(int pos, Symbol sym) {
Tree constr =
- gen.mkPrimaryConstructorGlobalRef(pos,
- defs.JAVACLASSTYPE_CLASS);
+ gen.mkGlobalRef(pos, defs.JAVACLASSTYPE_JAVACLASSTYPE());
Tree nameLit = gen.mkSymbolNameLit(pos, sym);
Tree[] args = new Tree[] { nameLit };
- return gen.New(pos, gen.mkApply_V(constr, args));
+ return gen.mkApply_V(constr, args);
}
private Tree thisType(int pos, Symbol sym) {
diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java
index 0fda2848fe..f1d15c414d 100644
--- a/sources/scalac/util/Names.java
+++ b/sources/scalac/util/Names.java
@@ -191,6 +191,7 @@ public class Names {
public static final Name isEmpty = Name.fromString("isEmpty");
public static final Name instantiate = Name.fromString("instantiate");
public static final Name java = Name.fromString("java");
+ public static final Name javaClassType = Name.fromString("javaClassType");
public static final Name lang = Name.fromString("lang");
public static final Name length = Name.fromString("length");
public static final Name _match = Name.fromString("match");