diff options
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/runtime/types/JavaClassType.java | 24 | ||||
-rw-r--r-- | sources/scalac/symtab/Definitions.java | 9 | ||||
-rw-r--r-- | sources/scalac/transformer/TypesAsValuesPhase.java | 10 | ||||
-rw-r--r-- | sources/scalac/util/Names.java | 1 |
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"); |