summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/backend/Primitives.java34
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java25
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;
}
/**