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();