diff options
author | paltherr <paltherr@epfl.ch> | 2004-02-27 23:59:05 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2004-02-27 23:59:05 +0000 |
commit | 12bd290e160247877e03780de47fcd09e3b8f2bb (patch) | |
tree | e7e943b62d7c765470b602d3ef2665795d7a351d /sources/scalac/backend | |
parent | 01599fa37b24e623d1bc6836a8f65548bd5fdcea (diff) | |
download | scala-12bd290e160247877e03780de47fcd09e3b8f2bb.tar.gz scala-12bd290e160247877e03780de47fcd09e3b8f2bb.tar.bz2 scala-12bd290e160247877e03780de47fcd09e3b8f2bb.zip |
- Added method Primitives.getJavaSignature
- Changed GenJVM.javaName to use Primitives.getJavaSignature Added
- caching to GenJVM.javaName
Diffstat (limited to 'sources/scalac/backend')
-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; } /** |