src/jdk/nashorn/internal/codegen/Namespace.java

Print this page
rev 1345 : 8047365: Very long function names break codegen
Reviewed-by: attila, lagergren

*** 23,32 **** --- 23,34 ---- * 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,94 **** 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. * * @return Generated uniqueName name. */ public String uniqueName(final String base) { for (Namespace namespace = this; namespace != null; namespace = namespace.getParent()) { final HashMap<String, Integer> namespaceDirectory = namespace.directory; ! final Integer counter = namespaceDirectory.get(base); if (counter != null) { final int count = counter + 1; ! namespaceDirectory.put(base, count); ! return base + '-' + count; } } ! directory.put(base, 0); ! return base; } @Override public String toString() { return directory.toString(); --- 66,97 ---- public Namespace getParent() { return parent; } /** ! * 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(truncatedBase); if (counter != null) { final int count = counter + 1; ! namespaceDirectory.put(truncatedBase, count); ! return truncatedBase + '-' + count; } } ! directory.put(truncatedBase, 0); ! return truncatedBase; } @Override public String toString() { return directory.toString();