src/jdk/nashorn/internal/codegen/Namespace.java
Print this page
rev 1345 : 8047365: Very long function names break codegen
Reviewed-by: attila, lagergren
@@ -23,10 +23,12 @@
* questions.
*/
package jdk.nashorn.internal.codegen;
+import static jdk.nashorn.internal.codegen.MethodEmitter.LARGE_STRING_THRESHOLD;
+
import java.util.HashMap;
/**
* A name space hierarchy, where each level holds a name directory with
* names that may be unique for each level.
@@ -64,31 +66,32 @@
public Namespace getParent() {
return parent;
}
/**
- * Create a uniqueName name in the namespace in the form base$n where n varies
- * .
- * @param base Base of name. Base will be returned if uniqueName.
+ * Create a uniqueName name in the namespace in the form base$n where n varies.
+ * Also truncates very long names that would otherwise break ASM.
*
+ * @param base Base of name. Base will be returned if uniqueName.
* @return Generated uniqueName name.
*/
public String uniqueName(final String base) {
+ final String truncatedBase = base.length() > LARGE_STRING_THRESHOLD ? base.substring(0, LARGE_STRING_THRESHOLD) : base;
for (Namespace namespace = this; namespace != null; namespace = namespace.getParent()) {
final HashMap<String, Integer> namespaceDirectory = namespace.directory;
- final Integer counter = namespaceDirectory.get(base);
+ final Integer counter = namespaceDirectory.get(truncatedBase);
if (counter != null) {
final int count = counter + 1;
- namespaceDirectory.put(base, count);
- return base + '-' + count;
+ namespaceDirectory.put(truncatedBase, count);
+ return truncatedBase + '-' + count;
}
}
- directory.put(base, 0);
+ directory.put(truncatedBase, 0);
- return base;
+ return truncatedBase;
}
@Override
public String toString() {
return directory.toString();