< 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,217 ****
--- 208,231 ----
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,282 ****
--- 287,310 ----
_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,410 ****
--- 433,448 ----
*/
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 >