Merge
This commit is contained in:
commit
66423c6b33
@ -607,7 +607,7 @@ public final class Compiler implements Loggable {
|
||||
newFunctionNode.uniqueName(reservedName);
|
||||
}
|
||||
|
||||
final boolean info = log.levelFinerThanOrEqual(Level.INFO);
|
||||
final boolean info = log.isLoggable(Level.INFO);
|
||||
|
||||
final DebugLogger timeLogger = env.isTimingEnabled() ? env._timing.getLogger() : null;
|
||||
|
||||
@ -644,8 +644,8 @@ public final class Compiler implements Loggable {
|
||||
if (info) {
|
||||
final StringBuilder sb = new StringBuilder("<< Finished compile job for ");
|
||||
sb.append(newFunctionNode.getSource()).
|
||||
append(':').
|
||||
append(quote(newFunctionNode.getName()));
|
||||
append(':').
|
||||
append(quote(newFunctionNode.getName()));
|
||||
|
||||
if (time > 0L && timeLogger != null) {
|
||||
assert env.isTimingEnabled();
|
||||
@ -713,7 +713,7 @@ public final class Compiler implements Loggable {
|
||||
if (cacheKey != null && env._persistent_cache) {
|
||||
// If this is an on-demand compilation create a function initializer for the function being compiled.
|
||||
// Otherwise use function initializer map generated by codegen.
|
||||
Map<Integer, FunctionInitializer> initializers = new HashMap<>();
|
||||
final Map<Integer, FunctionInitializer> initializers = new HashMap<>();
|
||||
if (isOnDemandCompilation()) {
|
||||
initializers.put(functionNode.getId(), new FunctionInitializer(functionNode, getInvalidatedProgramPoints()));
|
||||
} else {
|
||||
@ -829,9 +829,9 @@ public final class Compiler implements Loggable {
|
||||
final long totalSize = osc.calculateObjectSize(functionNode);
|
||||
|
||||
sb.append(phaseName).
|
||||
append(" Total size = ").
|
||||
append(totalSize / 1024 / 1024).
|
||||
append("MB");
|
||||
append(" Total size = ").
|
||||
append(totalSize / 1024 / 1024).
|
||||
append("MB");
|
||||
log.info(sb);
|
||||
|
||||
Collections.sort(list, new Comparator<ClassHistogramElement>() {
|
||||
|
@ -131,8 +131,8 @@ public final class MethodHandleFactory {
|
||||
static Object traceReturn(final DebugLogger logger, final Object value) {
|
||||
final String str = " return" +
|
||||
(VOID_TAG.equals(value) ?
|
||||
";" :
|
||||
" " + stripName(value) + "; // [type=" + (value == null ? "null]" : stripName(value.getClass()) + ']'));
|
||||
";" :
|
||||
" " + stripName(value) + "; // [type=" + (value == null ? "null]" : stripName(value.getClass()) + ']'));
|
||||
if (logger == null) {
|
||||
err(str);
|
||||
} else if (logger.isEnabled()) {
|
||||
@ -164,13 +164,13 @@ public final class MethodHandleFactory {
|
||||
}
|
||||
|
||||
sb.append('\'').
|
||||
append(stripName(argString(args[i]))).
|
||||
append('\'').
|
||||
append(' ').
|
||||
append('[').
|
||||
append("type=").
|
||||
append(args[i] == null ? "null" : stripName(args[i].getClass())).
|
||||
append(']');
|
||||
append(stripName(argString(args[i]))).
|
||||
append('\'').
|
||||
append(' ').
|
||||
append('[').
|
||||
append("type=").
|
||||
append(args[i] == null ? "null" : stripName(args[i].getClass())).
|
||||
append(']');
|
||||
|
||||
if (i + 1 < args.length) {
|
||||
sb.append(", ");
|
||||
@ -216,8 +216,8 @@ public final class MethodHandleFactory {
|
||||
|
||||
if (arg instanceof ScriptObject) {
|
||||
return arg.toString() +
|
||||
" (map=" + Debug.id(((ScriptObject)arg).getMap()) +
|
||||
')';
|
||||
" (map=" + Debug.id(((ScriptObject)arg).getMap()) +
|
||||
')';
|
||||
}
|
||||
|
||||
return arg.toString();
|
||||
@ -262,7 +262,7 @@ public final class MethodHandleFactory {
|
||||
return addDebugPrintout(null, Level.OFF, mh, paramStart, printReturnValue, tag);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Add a debug printout to a method handle, tracing parameters and return values
|
||||
*
|
||||
* @param logger a specific logger to which to write the output
|
||||
@ -278,7 +278,7 @@ public final class MethodHandleFactory {
|
||||
|
||||
//if there is no logger, or if it's set to log only coarser events
|
||||
//than the trace level, skip and return
|
||||
if (logger != null && logger.levelCoarserThan(level)) {
|
||||
if (logger == null || !logger.isLoggable(level)) {
|
||||
return mh;
|
||||
}
|
||||
|
||||
@ -289,9 +289,9 @@ public final class MethodHandleFactory {
|
||||
trace = MethodHandles.foldArguments(
|
||||
mh,
|
||||
trace.asCollector(
|
||||
Object[].class,
|
||||
type.parameterCount()).
|
||||
asType(type.changeReturnType(void.class)));
|
||||
Object[].class,
|
||||
type.parameterCount()).
|
||||
asType(type.changeReturnType(void.class)));
|
||||
|
||||
final Class<?> retType = type.returnType();
|
||||
if (printReturnValue) {
|
||||
@ -299,7 +299,7 @@ public final class MethodHandleFactory {
|
||||
final MethodHandle traceReturn = MethodHandles.insertArguments(TRACE_RETURN, 0, logger);
|
||||
trace = MethodHandles.filterReturnValue(trace,
|
||||
traceReturn.asType(
|
||||
traceReturn.type().changeParameterType(0, retType).changeReturnType(retType)));
|
||||
traceReturn.type().changeParameterType(0, retType).changeReturnType(retType)));
|
||||
} else {
|
||||
trace = MethodHandles.filterReturnValue(trace, MethodHandles.insertArguments(TRACE_RETURN_VOID, 0, logger));
|
||||
}
|
||||
@ -355,9 +355,9 @@ public final class MethodHandleFactory {
|
||||
sb.append("] ");
|
||||
} else {
|
||||
sb.append(d)
|
||||
.append('{')
|
||||
.append(Integer.toHexString(System.identityHashCode(d)))
|
||||
.append('}');
|
||||
.append('{')
|
||||
.append(Integer.toHexString(System.identityHashCode(d)))
|
||||
.append('}');
|
||||
}
|
||||
|
||||
if (i + 1 < data.length) {
|
||||
|
@ -106,7 +106,9 @@ import sun.reflect.CallerSensitive;
|
||||
* <li>
|
||||
* If the adapter being generated can have class-level overrides, constructors taking same arguments as the superclass
|
||||
* constructors are created. These constructors simply delegate to the superclass constructor. They are simply used to
|
||||
* create instances of the adapter class, with no instance-level overrides, as they don't have them.
|
||||
* create instances of the adapter class, with no instance-level overrides, as they don't have them. If the original
|
||||
* class' constructor was variable arity, the adapter constructor will also be variable arity. Protected constructors
|
||||
* are exposed as public.
|
||||
* </li>
|
||||
* </ul>
|
||||
* </p><p>
|
||||
@ -190,7 +192,6 @@ final class JavaAdapterBytecodeGenerator {
|
||||
private static final int MAX_GENERATED_TYPE_NAME_LENGTH = 255;
|
||||
|
||||
private static final String CLASS_INIT = "<clinit>";
|
||||
static final String CONVERTER_INIT = "<converter-init>";
|
||||
|
||||
// Method name prefix for invoking super-methods
|
||||
static final String SUPER_PREFIX = "super$";
|
||||
@ -494,7 +495,8 @@ final class JavaAdapterBytecodeGenerator {
|
||||
final Type[] argTypes = originalCtorType.getArgumentTypes();
|
||||
|
||||
// All constructors must be public, even if in the superclass they were protected.
|
||||
final InstructionAdapter mv = new InstructionAdapter(cw.visitMethod(ACC_PUBLIC, INIT,
|
||||
final InstructionAdapter mv = new InstructionAdapter(cw.visitMethod(ACC_PUBLIC |
|
||||
(ctor.isVarArgs() ? ACC_VARARGS : 0), INIT,
|
||||
Type.getMethodDescriptor(originalCtorType.getReturnType(), argTypes), null, null));
|
||||
|
||||
mv.visitCode();
|
||||
@ -543,7 +545,8 @@ final class JavaAdapterBytecodeGenerator {
|
||||
System.arraycopy(originalArgTypes, 0, newArgTypes, 0, argLen);
|
||||
|
||||
// All constructors must be public, even if in the superclass they were protected.
|
||||
// Existing super constructor <init>(this, args...) triggers generating <init>(this, scriptObj, args...).
|
||||
// Existing super constructor <init>(this, args...) triggers generating <init>(this, args..., scriptObj).
|
||||
// Any variable arity constructors become fixed-arity with explicit array arguments.
|
||||
final InstructionAdapter mv = new InstructionAdapter(cw.visitMethod(ACC_PUBLIC, INIT,
|
||||
Type.getMethodDescriptor(originalCtorType.getReturnType(), newArgTypes), null, null));
|
||||
|
||||
@ -593,7 +596,7 @@ final class JavaAdapterBytecodeGenerator {
|
||||
if (! fromFunction) {
|
||||
newArgTypes[argLen] = OBJECT_TYPE;
|
||||
final InstructionAdapter mv2 = new InstructionAdapter(cw.visitMethod(ACC_PUBLIC, INIT,
|
||||
Type.getMethodDescriptor(originalCtorType.getReturnType(), newArgTypes), null, null));
|
||||
Type.getMethodDescriptor(originalCtorType.getReturnType(), newArgTypes), null, null));
|
||||
generateOverridingConstructorWithObjectParam(mv2, ctor, originalCtorType.getDescriptor());
|
||||
}
|
||||
}
|
||||
|
@ -99,10 +99,10 @@ public final class DebugLogger {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append('[')
|
||||
.append(record.getLoggerName())
|
||||
.append("] ")
|
||||
.append(record.getMessage())
|
||||
.append('\n');
|
||||
.append(record.getLoggerName())
|
||||
.append("] ")
|
||||
.append(record.getMessage())
|
||||
.append('\n');
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
@ -194,7 +194,7 @@ public final class DebugLogger {
|
||||
*/
|
||||
public void indent(final int pos) {
|
||||
if (isEnabled) {
|
||||
indent += pos * INDENT_SPACE;
|
||||
indent += pos * INDENT_SPACE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,57 +227,14 @@ public final class DebugLogger {
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the logger is above the level of detail given
|
||||
* Check if the event of given level will be logged.
|
||||
* @see java.util.logging.Level
|
||||
*
|
||||
* The higher the level, the more severe the warning
|
||||
*
|
||||
* @param level logging level
|
||||
* @return true if level is above the given one
|
||||
* @return true if event of given level will be logged.
|
||||
*/
|
||||
public boolean levelCoarserThan(final Level level) {
|
||||
return getLevel().intValue() > level.intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the logger is above or equal to the level
|
||||
* of detail given
|
||||
* @see java.util.logging.Level
|
||||
*
|
||||
* The higher the level, the more severe the warning
|
||||
*
|
||||
* @param level logging level
|
||||
* @return true if level is above the given one
|
||||
*/
|
||||
public boolean levelCoarserThanOrEqual(final Level level) {
|
||||
return getLevel().intValue() >= level.intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the logger is below the level of detail given
|
||||
* @see java.util.logging.Level
|
||||
*
|
||||
* The higher the level, the more severe the warning
|
||||
*
|
||||
* @param level logging level
|
||||
* @return true if level is above the given one
|
||||
*/
|
||||
public boolean levelFinerThan(final Level level) {
|
||||
return getLevel().intValue() < level.intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the logger is below or equal to the level
|
||||
* of detail given
|
||||
* @see java.util.logging.Level
|
||||
*
|
||||
* The higher the level, the more severe the warning
|
||||
*
|
||||
* @param level logging level
|
||||
* @return true if level is above the given one
|
||||
*/
|
||||
public boolean levelFinerThanOrEqual(final Level level) {
|
||||
return getLevel().intValue() <= level.intValue();
|
||||
public boolean isLoggable(final Level level) {
|
||||
return logger.isLoggable(level);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -566,7 +523,7 @@ public final class DebugLogger {
|
||||
* @param str string to log
|
||||
*/
|
||||
public void log(final Level level, final String str) {
|
||||
if (isEnabled && !isQuiet) {
|
||||
if (isEnabled && !isQuiet && logger.isLoggable(level)) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0 ; i < indent ; i++) {
|
||||
sb.append(' ');
|
||||
@ -584,7 +541,7 @@ public final class DebugLogger {
|
||||
* @param objs objects for which to invoke toString and concatenate to log
|
||||
*/
|
||||
public void log(final Level level, final Object... objs) {
|
||||
if (isEnabled && !isQuiet) {
|
||||
if (isEnabled && !isQuiet && logger.isLoggable(level)) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (final Object obj : objs) {
|
||||
sb.append(obj);
|
||||
|
@ -27,3 +27,6 @@ tier1 =
|
||||
|
||||
# All nashorn tests are tier 2.
|
||||
tier2 = src
|
||||
|
||||
# No nashorn tests are tier 3.
|
||||
tier3 =
|
||||
|
39
nashorn/test/script/basic/JDK-8129410.js
Normal file
39
nashorn/test/script/basic/JDK-8129410.js
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* JDK-8129410: Java adapters with class-level overrides should preserve variable arity constructors
|
||||
*
|
||||
* @test
|
||||
* @run
|
||||
*/
|
||||
|
||||
var VarArgConstructor = Java.type("jdk.nashorn.test.models.VarArgConstructor");
|
||||
var VarArgConstructorExtended = Java.extend(VarArgConstructor, {});
|
||||
|
||||
// If the fix didn't work we wouldn't even get past the constructor invocation
|
||||
// as it'd complain there's no matching arity constructor.
|
||||
var newExtended = new VarArgConstructorExtended(1, true, "a", "b");
|
||||
|
||||
// Assert the expected constructor was invoked.
|
||||
Assert.assertEquals("vararg", newExtended.indicator);
|
Loading…
Reference in New Issue
Block a user