< prev index next >

src/jdk/nashorn/internal/runtime/ScriptEnvironment.java

Print this page
rev 1904 : 8138882: Performance regression due to anonymous classloading
Reviewed-by: attila, sundar
rev 1905 : 8162955: Activate anonymous class loading for small sources
Reviewed-by: sundar

@@ -208,10 +208,24 @@
     public final Map<String, LoggerInfo> _loggers;
 
     /** Timing */
     public final Timing _timing;
 
+    /** Whether to use anonymous classes. See {@link #useAnonymousClasses(int)}. */
+    private final AnonymousClasses _anonymousClasses;
+    private enum AnonymousClasses {
+        AUTO,
+        OFF,
+        ON
+    }
+
+    /** Size threshold up to which we use anonymous classes in {@link AnonymousClasses#AUTO} setting */
+    private final int _anonymous_classes_threshold;
+
+    /** Default value for anonymous class threshold */
+    private final static int DEFAULT_ANON_CLASS_THRESHOLD = 512;
+
     /**
      * Constructor
      *
      * @param options a Options object
      * @param out output print writer

@@ -273,10 +287,24 @@
         _scripting            = options.getBoolean("scripting");
         _strict               = options.getBoolean("strict");
         _version              = options.getBoolean("version");
         _verify_code          = options.getBoolean("verify.code");
 
+        final String anonClasses = options.getString("anonymous.classes");
+        if (anonClasses == null || anonClasses.equals("auto")) {
+            _anonymousClasses = AnonymousClasses.AUTO;
+        } else if (anonClasses.equals("true")) {
+            _anonymousClasses = AnonymousClasses.ON;
+        } else if (anonClasses.equals("false")) {
+            _anonymousClasses = AnonymousClasses.OFF;
+        } else {
+            throw new RuntimeException("Unsupported value for anonymous classes: " + anonClasses);
+        }
+
+        this._anonymous_classes_threshold = Options.getIntProperty(
+                "nashorn.anonymous.classes.threshold", DEFAULT_ANON_CLASS_THRESHOLD);
+
         final String language = options.getString("language");
         if (language == null || language.equals("es5")) {
             _es6 = false;
         } else if (language.equals("es6")) {
             _es6 = true;

@@ -405,6 +433,16 @@
      */
     public boolean isTimingEnabled() {
         return _timing != null ? _timing.isEnabled() : false;
     }
 
+    /**
+     * Returns true if compilation should use anonymous classes.
+     * @param sourceLength length of source being compiled.
+     * @return true if anonymous classes should be used
+     */
+    public boolean useAnonymousClasses(final int sourceLength) {
+        return _anonymousClasses == AnonymousClasses.ON
+                || (_anonymousClasses == AnonymousClasses.AUTO && sourceLength <= _anonymous_classes_threshold);
+    }
+
 }
< prev index next >