diff options
-rw-r--r-- | sources/scalac/backend/Primitives.java | 34 | ||||
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 25 |
2 files changed, 28 insertions, 31 deletions
diff --git a/sources/scalac/backend/Primitives.java b/sources/scalac/backend/Primitives.java index 26e158e0c7..4615d27ec2 100644 --- a/sources/scalac/backend/Primitives.java +++ b/sources/scalac/backend/Primitives.java @@ -1230,21 +1230,7 @@ public class Primitives { /* Return name to use in "Class.forName(<name>)" for the given symbol. */ public String getNameForClassForName(Symbol symbol) { - if (symbol == definitions.ANY_CLASS || - symbol == definitions.ANYREF_CLASS) - symbol = definitions.JAVA_OBJECT_CLASS; - StringBuffer buffer = new StringBuffer(symbol.name.toString()); - for (symbol = symbol.owner(); - symbol != definitions.ROOT_CLASS && !symbol.isPackage(); - symbol = symbol.owner()) { - buffer.insert(0, '$'); - buffer.insert(0, symbol.name); - } - if (symbol != definitions.ROOT_CLASS) { - buffer.insert(0, '.'); - buffer.insert(0, symbol.fullName()); - } - return buffer.toString(); + return getJavaSignature(symbol); } /* Return name to use in "Class.forName(<name>)" for the given kind. */ @@ -1262,5 +1248,23 @@ public class Primitives { } } + /** Return the Java signature of given symbol. */ + public String getJavaSignature(Symbol symbol) { + if (symbol == definitions.ANY_CLASS || + symbol == definitions.ANYREF_CLASS) + return getJavaSignature(definitions.JAVA_OBJECT_CLASS); + String name = symbol.name.toString(); + return getJavaPrefix(symbol.owner(), name.length()) + .append(name).toString(); + } + + /** Return the Java prefix of given symbol. */ + private StringBuffer getJavaPrefix(Symbol symbol, int length) { + if (symbol.isRoot()) return new StringBuffer(length); + String name = symbol.name.toString(); + return getJavaPrefix(symbol.owner(), name.length() + 1 + length) + .append(name).append(symbol.isPackage() ? '.' : '$'); + } + //######################################################################## } diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java index 7a723504a3..fac68d6ef4 100644 --- a/sources/scalac/backend/jvm/GenJVM.java +++ b/sources/scalac/backend/jvm/GenJVM.java @@ -1412,29 +1412,22 @@ class GenJVM { /// Names ////////////////////////////////////////////////////////////////////// + protected HashMap nameMap/*<Symbol,String>*/ = new HashMap(); + /** * Return a Java-compatible version of the name of the given * symbol. The returned name is mangled and includes the names of * the owners. */ protected String javaName(Symbol sym) { + Object value = nameMap.get(sym); + if (value != null) return (String)value; assert sym.isClass() || sym.isModule() : Debug.show(sym); - if (sym == defs.ANY_CLASS || sym == defs.ANYREF_CLASS) - return JAVA_LANG_OBJECT; - else { - StringBuffer buf = new StringBuffer(sym.name.toString()); - if ((sym.isModule() || sym.isModuleClass()) && !sym.isJava()) - buf.append('$'); - for (sym = sym.owner(); !sym.isPackage(); sym = sym.owner()) { - buf.insert(0, '$'); - buf.insert(0, sym.name); - } - if (!sym.isRoot()) { - buf.insert(0, '.'); - buf.insert(0, sym.fullName()); - } - return buf.toString(); - } + String signature = prims.getJavaSignature(sym); + if ((sym.isModule() || sym.isModuleClass()) && !sym.isJava()) + signature = signature + '$'; + nameMap.put(sym, signature); + return signature; } /** |