Mercurial > hg > jdk9-shenandoah > nashorn
changeset 1387:864aaf4e6441
8133785: SharedScopeCall should be enabled for non-optimistic call sites in optimistic compilation
Reviewed-by: hannesw, lagergren
line wrap: on
line diff
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Aug 24 09:11:46 2015 +0200 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Aug 24 09:12:35 2015 +0200 @@ -249,7 +249,7 @@ private final Set<String> emittedMethods = new HashSet<>(); // Function Id -> ContinuationInfo. Used by compilation of rest-of function only. - private final Map<Integer, ContinuationInfo> fnIdToContinuationInfo = new HashMap<>(); + private ContinuationInfo continuationInfo; private final Deque<Label> scopeEntryLabels = new ArrayDeque<>(); @@ -349,11 +349,20 @@ final int flags = getScopeCallSiteFlags(symbol); if (isFastScope(symbol)) { // Only generate shared scope getter for fast-scope symbols so we know we can dial in correct scope. - if (symbol.getUseCount() > SharedScopeCall.FAST_SCOPE_GET_THRESHOLD && !isOptimisticOrRestOf()) { - method.loadCompilerConstant(SCOPE); - // As shared scope vars are only used in non-optimistic compilation, we switch from using TypeBounds to + if (symbol.getUseCount() > SharedScopeCall.FAST_SCOPE_GET_THRESHOLD && !identNode.isOptimistic()) { + // As shared scope vars are only used with non-optimistic identifiers, we switch from using TypeBounds to // just a single definitive type, resultBounds.widest. - loadSharedScopeVar(resultBounds.widest, symbol, flags); + new OptimisticOperation(identNode, TypeBounds.OBJECT) { + @Override + void loadStack() { + method.loadCompilerConstant(SCOPE); + } + + @Override + void consumeStack() { + loadSharedScopeVar(resultBounds.widest, symbol, flags); + } + }.emit(); } else { new LoadFastScopeVar(identNode, resultBounds, flags).emit(); } @@ -384,10 +393,6 @@ return continuationEntryPoints != null; } - private boolean isOptimisticOrRestOf() { - return useOptimisticTypes() || isRestOf(); - } - private boolean isCurrentContinuationEntryPoint(final int programPoint) { return isRestOf() && getCurrentContinuationEntryPoint() == programPoint; } @@ -464,12 +469,8 @@ } private MethodEmitter loadSharedScopeVar(final Type valueType, final Symbol symbol, final int flags) { - assert !isOptimisticOrRestOf(); - if (isFastScope(symbol)) { - method.load(getScopeProtoDepth(lc.getCurrentBlock(), symbol)); - } else { - method.load(-1); - } + assert isFastScope(symbol); + method.load(getScopeProtoDepth(lc.getCurrentBlock(), symbol)); return lc.getScopeGet(unit, symbol, valueType, flags).generateInvoke(method); } @@ -1573,7 +1574,7 @@ } else if (useCount <= SharedScopeCall.FAST_SCOPE_CALL_THRESHOLD || !isFastScope(symbol) && useCount <= SharedScopeCall.SLOW_SCOPE_CALL_THRESHOLD || CodeGenerator.this.lc.inDynamicScope() - || isOptimisticOrRestOf()) { + || callNode.isOptimistic()) { scopeCall(node, flags); } else { sharedScopeCall(node, flags); @@ -2070,8 +2071,6 @@ @Override public boolean enterFunctionNode(final FunctionNode functionNode) { - final int fnId = functionNode.getId(); - if (skipFunction(functionNode)) { // In case we are not generating code for the function, we must create or retrieve the function object and // load it on the stack here. @@ -2109,9 +2108,9 @@ method.begin(); if (isRestOf()) { - final ContinuationInfo ci = new ContinuationInfo(); - fnIdToContinuationInfo.put(fnId, ci); - method.gotoLoopStart(ci.getHandlerLabel()); + assert continuationInfo == null; + continuationInfo = new ContinuationInfo(); + method.gotoLoopStart(continuationInfo.getHandlerLabel()); } } @@ -5308,7 +5307,7 @@ } private ContinuationInfo getContinuationInfo() { - return fnIdToContinuationInfo.get(lc.getCurrentFunction().getId()); + return continuationInfo; } private void generateContinuationHandler() {
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Mon Aug 24 09:11:46 2015 +0200 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Mon Aug 24 09:12:35 2015 +0200 @@ -46,6 +46,11 @@ * and output and error writers, top level Namespace etc. */ public final class ScriptEnvironment { + // Primarily intended to be used in test environments so that eager compilation tests work without an + // error when tested with optimistic compilation. + private static final boolean ALLOW_EAGER_COMPILATION_SILENT_OVERRIDE = Options.getBooleanProperty( + "nashorn.options.allowEagerCompilationSilentOverride", false); + /** Output writer for this environment */ private final PrintWriter out; @@ -241,8 +246,20 @@ } _fx = options.getBoolean("fx"); _global_per_engine = options.getBoolean("global.per.engine"); - _lazy_compilation = options.getBoolean("lazy.compilation"); _optimistic_types = options.getBoolean("optimistic.types"); + final boolean lazy_compilation = options.getBoolean("lazy.compilation"); + if (!lazy_compilation && _optimistic_types) { + if (!ALLOW_EAGER_COMPILATION_SILENT_OVERRIDE) { + throw new IllegalStateException( + ECMAErrors.getMessage( + "config.error.eagerCompilationConflictsWithOptimisticTypes", + options.getOptionTemplateByKey("lazy.compilation").getName(), + options.getOptionTemplateByKey("optimistic.types").getName())); + } + _lazy_compilation = true; + } else { + _lazy_compilation = lazy_compilation; + } _loader_per_compile = options.getBoolean("loader.per.compile"); _no_java = options.getBoolean("no.java"); _no_syntax_extensions = options.getBoolean("no.syntax.extensions");
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/OptionTemplate.java Mon Aug 24 09:11:46 2015 +0200 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/OptionTemplate.java Mon Aug 24 09:12:35 2015 +0200 @@ -304,8 +304,8 @@ } } - boolean matches(final String key0) { - return key0.equals(this.shortName) || key0.equals(this.name); + boolean nameMatches(final String aName) { + return aName.equals(this.shortName) || aName.equals(this.name); } private static final int LINE_BREAK = 64;
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/Options.java Mon Aug 24 09:11:46 2015 +0200 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/Options.java Mon Aug 24 09:12:35 2015 +0200 @@ -520,9 +520,25 @@ } } - private static OptionTemplate getOptionTemplate(final String key) { + /** + * Retrieves an option template identified by key. + * @param shortKey the short (that is without the e.g. "nashorn.option." part) key + * @return the option template identified by the key + * @throws IllegalArgumentException if the key doesn't specify an existing template + */ + public OptionTemplate getOptionTemplateByKey(final String shortKey) { + final String fullKey = key(shortKey); + for(final OptionTemplate t: validOptions) { + if(t.getKey().equals(fullKey)) { + return t; + } + } + throw new IllegalArgumentException(shortKey); + } + + private static OptionTemplate getOptionTemplateByName(final String name) { for (final OptionTemplate t : Options.validOptions) { - if (t.matches(key)) { + if (t.nameMatches(name)) { return t; } } @@ -682,7 +698,7 @@ } final String token = st.nextToken(); - this.template = Options.getOptionTemplate(token); + this.template = getOptionTemplateByName(token); if (this.template == null) { throw new IllegalArgumentException(argument); }
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties Mon Aug 24 09:11:46 2015 +0200 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties Mon Aug 24 09:12:35 2015 +0200 @@ -172,7 +172,9 @@ syntax.error.unprotected.switch.declaration=Unsupported {0} declaration in unprotected switch statement io.error.cant.write=cannot write "{0}" + config.error.no.dest=no destination directory supplied +config.error.eagerCompilationConflictsWithOptimisticTypes={0}=false (eager compilation) is not compatible with {1}=true. uri.error.bad.uri=Bad URI "{0}" near offset {1} list.adapter.null.global=Attempted to create the adapter from outside a JavaScript execution context.
--- a/test/script/basic/JDK-8053905.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8053905.js Mon Aug 24 09:12:35 2015 +0200 @@ -28,6 +28,7 @@ * @runif external.octane * @fork * @option -Dnashorn.compiler.splitter.threshold=1000 + * @option -Dnashorn.options.allowEagerCompilationSilentOverride * @option -scripting * @option --lazy-compilation=false */
--- a/test/script/basic/JDK-8058561.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8058561.js Mon Aug 24 09:12:35 2015 +0200 @@ -26,7 +26,9 @@ * * @test * @run + * @fork * @option --lazy-compilation=false + * @option -Dnashorn.options.allowEagerCompilationSilentOverride */ // Just attempting to compile this caused the NPE
--- a/test/script/basic/JDK-8078612_eager_1a.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8078612_eager_1a.js Mon Aug 24 09:12:35 2015 +0200 @@ -29,6 +29,7 @@ * @option -pcc * @option --lazy-compilation=false * @option -Dnashorn.persistent.code.cache=build/nashorn_code_cache + * @option -Dnashorn.options.allowEagerCompilationSilentOverride * @fork */
--- a/test/script/basic/JDK-8078612_eager_1b.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8078612_eager_1b.js Mon Aug 24 09:12:35 2015 +0200 @@ -29,6 +29,7 @@ * @option -pcc * @option --lazy-compilation=false * @option -Dnashorn.persistent.code.cache=build/nashorn_code_cache + * @option -Dnashorn.options.allowEagerCompilationSilentOverride * @fork */
--- a/test/script/basic/JDK-8078612_eager_2a.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8078612_eager_2a.js Mon Aug 24 09:12:35 2015 +0200 @@ -29,6 +29,7 @@ * @option -pcc * @option --lazy-compilation=false * @option -Dnashorn.persistent.code.cache=build/nashorn_code_cache + * @option -Dnashorn.options.allowEagerCompilationSilentOverride * @fork */
--- a/test/script/basic/JDK-8078612_eager_2b.js Mon Aug 24 09:11:46 2015 +0200 +++ b/test/script/basic/JDK-8078612_eager_2b.js Mon Aug 24 09:12:35 2015 +0200 @@ -29,6 +29,7 @@ * @option -pcc * @option --lazy-compilation=false * @option -Dnashorn.persistent.code.cache=build/nashorn_code_cache + * @option -Dnashorn.options.allowEagerCompilationSilentOverride * @fork */