# HG changeset patch # User mullan # Date 1510669190 18000 # Node ID 94f362b5f4dd47b81edfc69ffc63a3fc674a7e60 # Parent e6e6ed17abbe7bd2e70f59bd7ecce619bb5e65dd# Parent 5c2f21c319c45c4aa283a0e56eec1b4826a76965 Merge diff -r e6e6ed17abbe -r 94f362b5f4dd make/CreateJmods.gmk --- a/make/CreateJmods.gmk Tue Nov 14 09:15:12 2017 -0500 +++ b/make/CreateJmods.gmk Tue Nov 14 09:19:50 2017 -0500 @@ -80,8 +80,8 @@ endif LEGAL_NOTICES := \ - $(SUPPORT_OUTPUTDIR)/modules_legal/java.base \ - $(call FindModuleLegalDirs, $(MODULE)) \ + $(call uniq, $(SUPPORT_OUTPUTDIR)/modules_legal/java.base \ + $(call FindModuleLegalDirs, $(MODULE))) \ # LEGAL_NOTICES_PATH := $(call PathList, $(LEGAL_NOTICES)) diff -r e6e6ed17abbe -r 94f362b5f4dd make/Help.gmk --- a/make/Help.gmk Tue Nov 14 09:15:12 2017 -0500 +++ b/make/Help.gmk Tue Nov 14 09:19:50 2017 -0500 @@ -36,15 +36,18 @@ $(info =====================) $(info ) $(info Common make targets) - $(info $(_) make [default] # Compile all modules in langtools, hotspot, jdk, jaxws,) - $(info $(_) # jaxp and corba, and create a runnable "exploded" image) - $(info $(_) make all # Compile everything, all repos, docs and images) - $(info $(_) make images # Create complete jdk and jre images (alias for product-images)) - $(info $(_) make -image # Build just the image (jdk, jre, test, docs etc)) + $(info $(_) make [default] # Compile all modules and create a runnable "exploded") + $(info $(_) # image (alias for jdk or exploded-image)) + $(info $(_) make all # Create all images: product, test, docs) + $(info $(_) # (alias for all-images)) + $(info $(_) make images # Create complete jdk and jre images) + $(info $(_) # (alias for product-images)) + $(info $(_) make -image # Build just the image for any of: ) + $(info $(_) # jdk, jre, test, docs, symbols, profiles) $(info $(_) make # Build the specified phase and everything it depends on) $(info $(_) # (gensrc, java, copy, libs, launchers, gendata, rmic)) - $(info $(_) make *-only # Applies to most targets and disables compling the) - $(info $(_) # dependencies for the target. This is faster but may) + $(info $(_) make *-only # Applies to most targets and disables building the) + $(info $(_) # dependencies for that target. This is faster but may) $(info $(_) # result in incorrect build results!) $(info $(_) make docs # Create all docs) $(info $(_) make docs-jdk-api # Create just JDK javadocs) @@ -74,7 +77,7 @@ $(info $(_) make hotspot # Build all of hotspot) $(info $(_) make hotspot- # Build just the specified jvm variant) $(info $(_) make hotspot-gensrc # Only build the gensrc part of hotspot) - $(info $(_) make hotspot-- # Build the specified phase for the specified module) + $(info $(_) make hotspot-- # Build the specified phase for the variant) $(info ) $(info Targets for specific modules) $(info $(_) make # Build and everything it depends on) diff -r e6e6ed17abbe -r 94f362b5f4dd make/common/Modules.gmk --- a/make/common/Modules.gmk Tue Nov 14 09:15:12 2017 -0500 +++ b/make/common/Modules.gmk Tue Nov 14 09:19:50 2017 -0500 @@ -409,8 +409,10 @@ # $1 - Module to find legal dirs for FindModuleLegalDirs = \ $(strip $(wildcard \ - $(addsuffix /$(strip $1), $(IMPORT_MODULES_LEGAL)) \ - $(foreach sub, $(LEGAL_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS))))) + $(addsuffix /$(strip $1), $(SUPPORT_OUTPUTDIR)/modules_legal \ + $(IMPORT_MODULES_LEGAL)) \ + $(foreach sub, $(LEGAL_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS))) \ + )) ################################################################################ diff -r e6e6ed17abbe -r 94f362b5f4dd make/nashorn/build.xml --- a/make/nashorn/build.xml Tue Nov 14 09:15:12 2017 -0500 +++ b/make/nashorn/build.xml Tue Nov 14 09:19:50 2017 -0500 @@ -830,8 +830,8 @@ - - + + diff -r e6e6ed17abbe -r 94f362b5f4dd src/java.base/share/classes/java/security/Certificate.java --- a/src/java.base/share/classes/java/security/Certificate.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/java.base/share/classes/java/security/Certificate.java Tue Nov 14 09:19:50 2017 -0500 @@ -57,13 +57,12 @@ * * @author Benjamin Renaud * @since 1.1 - * @deprecated A new certificate handling package is created in the Java platform. - * This Certificate interface is entirely deprecated and - * is here to allow for a smooth transition to the new - * package. + * @deprecated This class is deprecated and subject to removal in a future + * version of Java SE. It has been replaced by + * {@code java.security.cert.Certificate} and related classes. * @see java.security.cert.Certificate */ -@Deprecated(since="1.2") +@Deprecated(since="1.2", forRemoval=true) public interface Certificate { /** diff -r e6e6ed17abbe -r 94f362b5f4dd src/java.base/share/classes/java/security/Identity.java --- a/src/java.base/share/classes/java/security/Identity.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/java.base/share/classes/java/security/Identity.java Tue Nov 14 09:19:50 2017 -0500 @@ -52,12 +52,13 @@ * * @author Benjamin Renaud * @since 1.1 - * @deprecated This class is no longer used. Its functionality has been - * replaced by {@code java.security.KeyStore}, the - * {@code java.security.cert} package, and - * {@code java.security.Principal}. + * @deprecated This class is deprecated and subject to removal in a future + * version of Java SE. It has been replaced by + * {@code java.security.KeyStore}, the {@code java.security.cert} package, + * and {@code java.security.Principal}. */ -@Deprecated(since="1.2") +@Deprecated(since="1.2", forRemoval=true) +@SuppressWarnings("removal") public abstract class Identity implements Principal, Serializable { /** use serialVersionUID from JDK 1.1.x for interoperability */ diff -r e6e6ed17abbe -r 94f362b5f4dd src/java.base/share/classes/java/security/IdentityScope.java --- a/src/java.base/share/classes/java/security/IdentityScope.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/java.base/share/classes/java/security/IdentityScope.java Tue Nov 14 09:19:50 2017 -0500 @@ -57,12 +57,13 @@ * @author Benjamin Renaud * @since 1.1 * - * @deprecated This class is no longer used. Its functionality has been - * replaced by {@code java.security.KeyStore}, the - * {@code java.security.cert} package, and - * {@code java.security.Principal}. + * @deprecated This class is deprecated and subject to removal in a future + * version of Java SE. It has been replaced by + * {@code java.security.KeyStore}, the {@code java.security.cert} package, + * and {@code java.security.Principal}. */ -@Deprecated(since="1.2") +@Deprecated(since="1.2", forRemoval=true) +@SuppressWarnings("removal") public abstract class IdentityScope extends Identity { diff -r e6e6ed17abbe -r 94f362b5f4dd src/java.base/share/classes/java/security/Signer.java --- a/src/java.base/share/classes/java/security/Signer.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/java.base/share/classes/java/security/Signer.java Tue Nov 14 09:19:50 2017 -0500 @@ -40,12 +40,13 @@ * @author Benjamin Renaud * @since 1.1 * - * @deprecated This class is no longer used. Its functionality has been - * replaced by {@code java.security.KeyStore}, the - * {@code java.security.cert} package, and - * {@code java.security.Principal}. + * @deprecated This class is deprecated and subject to removal in a future + * version of Java SE. It has been replaced by + * {@code java.security.KeyStore}, the {@code java.security.cert} package, + * and {@code java.security.Principal}. */ -@Deprecated(since="1.2") +@Deprecated(since="1.2", forRemoval=true) +@SuppressWarnings("removal") public abstract class Signer extends Identity { private static final long serialVersionUID = -1763464102261361480L; diff -r e6e6ed17abbe -r 94f362b5f4dd src/java.base/share/classes/sun/security/tools/keytool/Resources.java --- a/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Tue Nov 14 09:19:50 2017 -0500 @@ -456,21 +456,21 @@ {"the.tsa.certificate", "The TSA certificate"}, {"the.input", "The input"}, {"reply", "Reply"}, - {"one.in.many", "%s #%d of %d"}, + {"one.in.many", "%1$s #%2$d of %3$d"}, {"alias.in.cacerts", "Issuer <%s> in cacerts"}, {"alias.in.keystore", "Issuer <%s>"}, {"with.weak", "%s (weak)"}, - {"key.bit", "%d-bit %s key"}, - {"key.bit.weak", "%d-bit %s key (weak)"}, + {"key.bit", "%1$d-bit %2$s key"}, + {"key.bit.weak", "%1$d-bit %2$s key (weak)"}, {"unknown.size.1", "unknown size %s key"}, {".PATTERN.printX509Cert.with.weak", "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t SHA1: {5}\n\t SHA256: {6}\nSignature algorithm name: {7}\nSubject Public Key Algorithm: {8}\nVersion: {9}"}, {"PKCS.10.with.weak", "PKCS #10 Certificate Request (Version 1.0)\n" + - "Subject: %s\nFormat: %s\nPublic Key: %s\nSignature algorithm: %s\n"}, - {"verified.by.s.in.s.weak", "Verified by %s in %s with a %s"}, - {"whose.sigalg.risk", "%s uses the %s signature algorithm which is considered a security risk."}, - {"whose.key.risk", "%s uses a %s which is considered a security risk."}, + "Subject: %1$s\nFormat: %2$s\nPublic Key: %3$s\nSignature algorithm: %4$s\n"}, + {"verified.by.s.in.s.weak", "Verified by %1$s in %2$s with a %3$s"}, + {"whose.sigalg.risk", "%1$s uses the %2$s signature algorithm which is considered a security risk."}, + {"whose.key.risk", "%1$s uses a %2$s which is considered a security risk."}, {"jks.storetype.warning", "The %1$s keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using \"keytool -importkeystore -srckeystore %2$s -destkeystore %2$s -deststoretype pkcs12\"."}, {"migrate.keystore.warning", "Migrated \"%1$s\" to %4$s. The %2$s keystore is backed up as \"%3$s\"."}, {"backup.keystore.warning", "The original keystore \"%1$s\" is backed up as \"%3$s\"..."}, diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java --- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Tue Nov 14 09:19:50 2017 -0500 @@ -270,7 +270,7 @@ {"The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk.", "The %1$s algorithm specified for the %2$s option is considered a security risk."}, {"The.1.signing.key.has.a.keysize.of.2.which.is.considered.a.security.risk.", - "The %s signing key has a keysize of %d which is considered a security risk."}, + "The %1$s signing key has a keysize of %2$d which is considered a security risk."}, {"This.jar.contains.entries.whose.certificate.chain.is.invalid.reason.1", "This jar contains entries whose certificate chain is invalid. Reason: %s"}, {"This.jar.contains.entries.whose.tsa.certificate.chain.is.invalid.reason.1", diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JarArchive.java Tue Nov 14 09:19:50 2017 -0500 @@ -74,14 +74,16 @@ private final Path file; private final String moduleName; + private final Runtime.Version version; // currently processed JarFile private JarFile jarFile; - protected JarArchive(String mn, Path file) { + protected JarArchive(String mn, Path file, Runtime.Version version) { Objects.requireNonNull(mn); Objects.requireNonNull(file); this.moduleName = mn; this.file = file; + this.version = Objects.requireNonNull(version); } @Override @@ -126,7 +128,7 @@ if (jarFile != null) { jarFile.close(); } - jarFile = new JarFile(file.toFile(), true, ZipFile.OPEN_READ, JarFile.runtimeVersion()); + jarFile = new JarFile(file.toFile(), true, ZipFile.OPEN_READ, version); } protected JarFile getJarFile() { diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java Tue Nov 14 09:19:50 2017 -0500 @@ -421,6 +421,9 @@ * the observable modules to those in the transitive closure of * the modules specified in {@code limitMods} plus other modules * specified in the {@code roots} set. + * + * @throws IllegalArgumentException if java.base module is present + * but its descriptor has no version */ public static ModuleFinder newModuleFinder(List paths, Set limitMods, @@ -429,8 +432,25 @@ if (Objects.requireNonNull(paths).isEmpty()) { throw new IllegalArgumentException("Empty module path"); } + Path[] entries = paths.toArray(new Path[0]); - ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries); + Runtime.Version version = Runtime.version(); + ModuleFinder finder = ModulePath.of(version, true, entries); + + if (finder.find("java.base").isPresent()) { + // use the version of java.base module, if present, as + // the release version for multi-release JAR files + ModuleDescriptor.Version v = finder.find("java.base").get() + .descriptor().version().orElseThrow(() -> + new IllegalArgumentException("No version in java.base descriptor") + ); + + // java.base version is different than the current runtime version + version = Runtime.Version.parse(v.toString()); + if (Runtime.version().major() != version.major()) { + finder = ModulePath.of(version, true, entries); + } + } // if limitmods is specified then limit the universe if (limitMods != null && !limitMods.isEmpty()) { @@ -744,6 +764,7 @@ final ByteOrder order; final Path packagedModulesPath; final boolean ignoreSigning; + final Runtime.Version version; final Set archives; ImageHelper(Configuration cf, @@ -754,6 +775,17 @@ this.order = order; this.packagedModulesPath = packagedModulesPath; this.ignoreSigning = ignoreSigning; + + // use the version of java.base module, if present, as + // the release version for multi-release JAR files + this.version = cf.findModule("java.base") + .map(ResolvedModule::reference) + .map(ModuleReference::descriptor) + .flatMap(ModuleDescriptor::version) + .map(ModuleDescriptor.Version::toString) + .map(Runtime.Version::parse) + .orElse(Runtime.version()); + this.archives = modsPaths.entrySet().stream() .map(e -> newArchive(e.getKey(), e.getValue())) .collect(Collectors.toSet()); @@ -763,7 +795,7 @@ if (path.toString().endsWith(".jmod")) { return new JmodArchive(module, path); } else if (path.toString().endsWith(".jar")) { - ModularJarArchive modularJarArchive = new ModularJarArchive(module, path); + ModularJarArchive modularJarArchive = new ModularJarArchive(module, path, version); Stream signatures = modularJarArchive.entries().filter((entry) -> { String name = entry.name().toUpperCase(Locale.ENGLISH); diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModularJarArchive.java --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModularJarArchive.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModularJarArchive.java Tue Nov 14 09:19:50 2017 -0500 @@ -39,8 +39,8 @@ private static final String JAR_EXT = ".jar"; private static final String MODULE_INFO = "module-info.class"; - public ModularJarArchive(String mn, Path jmod) { - super(mn, jmod); + public ModularJarArchive(String mn, Path jmod, Runtime.Version version) { + super(mn, jmod, version); String filename = Objects.requireNonNull(jmod.getFileName()).toString(); if (!filename.endsWith(JAR_EXT)) { throw new UnsupportedOperationException("Unsupported format: " + filename); diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/IntType.java Tue Nov 14 09:19:50 2017 -0500 @@ -138,7 +138,7 @@ } else if (to.isLong()) { method.visitInsn(I2L); } else if (to.isBoolean()) { - //nop + invokestatic(method, JSType.TO_BOOLEAN_I); } else if (to.isString()) { invokestatic(method, TO_STRING); } else if (to.isObject()) { diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java Tue Nov 14 09:19:50 2017 -0500 @@ -89,6 +89,9 @@ /** JavaScript compliant conversion function from number to boolean */ public static final Call TO_BOOLEAN_D = staticCall(JSTYPE_LOOKUP, JSType.class, "toBoolean", boolean.class, double.class); + /** JavaScript compliant conversion function from int to boolean */ + public static final Call TO_BOOLEAN_I = staticCall(JSTYPE_LOOKUP, JSType.class, "toBoolean", boolean.class, int.class); + /** JavaScript compliant conversion function from Object to integer */ public static final Call TO_INTEGER = staticCall(JSTYPE_LOOKUP, JSType.class, "toInteger", int.class, Object.class); @@ -548,6 +551,17 @@ } /** + * JavaScript compliant conversion of int to boolean + * + * @param num an int + * + * @return a boolean + */ + public static boolean toBoolean(final int num) { + return num != 0; + } + + /** * JavaScript compliant conversion of Object to boolean * See ECMA 9.2 ToBoolean * diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Tue Nov 14 09:19:50 2017 -0500 @@ -2050,7 +2050,7 @@ final PropertyMap newMap = oldMap.replaceProperty(property, property.removeFlags(Property.NEEDS_DECLARATION)); setMap(newMap); - set(key, value, 0); + set(key, value, NashornCallSiteDescriptor.CALLSITE_DECLARE); } /** @@ -3071,7 +3071,7 @@ } if (f != null) { - if (!f.getProperty().isWritable() || !f.getProperty().hasNativeSetter()) { + if ((!f.getProperty().isWritable() && !NashornCallSiteDescriptor.isDeclaration(callSiteFlags)) || !f.getProperty().hasNativeSetter()) { if (isScopeFlag(callSiteFlags) && f.getProperty().isLexicalBinding()) { throw typeError("assign.constant", key.toString()); // Overwriting ES6 const should throw also in non-strict mode. } diff -r e6e6ed17abbe -r 94f362b5f4dd src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java Tue Nov 14 09:15:12 2017 -0500 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java Tue Nov 14 09:19:50 2017 -0500 @@ -505,6 +505,15 @@ } /** + * Returns true if {@code flags} has the {@link #CALLSITE_DECLARE} bit set. + * @param flags the flags + * @return true if the flag is set, false otherwise. + */ + public static boolean isDeclaration(final int flags) { + return (flags & CALLSITE_DECLARE) != 0; + } + + /** * Get a program point from a descriptor (must be optimistic) * @param desc descriptor * @return program point diff -r e6e6ed17abbe -r 94f362b5f4dd test/jdk/ProblemList.txt --- a/test/jdk/ProblemList.txt Tue Nov 14 09:15:12 2017 -0500 +++ b/test/jdk/ProblemList.txt Tue Nov 14 09:19:50 2017 -0500 @@ -174,6 +174,8 @@ java/net/DatagramSocket/SendDatagramToBadAddress.java 7143960 macosx-all +java/net/httpclient/websocket/ConnectionHandover.java 8188895 windows-all + ############################################################################ # jdk_nio diff -r e6e6ed17abbe -r 94f362b5f4dd test/jdk/tools/jlink/multireleasejar/CheckRuntimeVersion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/tools/jlink/multireleasejar/CheckRuntimeVersion.java Tue Nov 14 09:19:50 2017 -0500 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017, 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. + */ + +import java.lang.module.ModuleDescriptor; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class CheckRuntimeVersion { + public static void main(String... args) { + int version = Integer.parseInt(args[0]); + if (Runtime.version().major() != version) { + throw new RuntimeException(version + " != current runtime version " + + Runtime.version()); + } + + Set expected = Arrays.stream(args, 1, args.length) + .collect(Collectors.toSet()); + Set modules = ModuleFinder.ofSystem().findAll().stream() + .map(ModuleReference::descriptor) + .map(ModuleDescriptor::name) + .collect(Collectors.toSet()); + + if (!modules.equals(expected)) { + throw new RuntimeException("Expected: " + expected + + " observable modules: " + modules); + } + } +} diff -r e6e6ed17abbe -r 94f362b5f4dd test/jdk/tools/jlink/multireleasejar/JLinkMRJavaBaseVersionTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/tools/jlink/multireleasejar/JLinkMRJavaBaseVersionTest.java Tue Nov 14 09:19:50 2017 -0500 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2017, 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. + */ + +/* + * @test + * @bug 8177471 + * @summary jlink should use the version from java.base.jmod to find modules + * @modules java.base/jdk.internal.module + * @library /test/lib + * @build jdk.test.lib.process.* CheckRuntimeVersion + * @run testng/othervm JLinkMRJavaBaseVersionTest + */ + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.jar.JarFile; +import java.util.spi.ToolProvider; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import jdk.internal.module.ModulePath; +import jdk.test.lib.process.ProcessTools; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class JLinkMRJavaBaseVersionTest { + private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar") + .orElseThrow(() -> new RuntimeException("jar tool not found")); + private static final ToolProvider JAVAC_TOOL = ToolProvider.findFirst("javac") + .orElseThrow(() -> new RuntimeException("javac tool not found")); + private static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink") + .orElseThrow(() -> new RuntimeException("jlink tool not found")); + + private static final Path javaHome = Paths.get(System.getProperty("java.home")); + + // resource text for version 9 + private byte[] resource9 = ("9 resource file").getBytes(); + // resource text for current version + private byte[] resource = (Runtime.version().major() + " resource file").getBytes(); + + static Path getJmods() { + Path jmods = Paths.get(System.getProperty("java9.home", javaHome.toString())).resolve("jmods"); + if (Files.notExists(jmods)) { + throw new RuntimeException(jmods + " not found"); + } + return jmods; + } + + @BeforeClass + public void initialize() throws IOException { + Path srcdir = Paths.get(System.getProperty("test.src")); + + // create class files from source + Path base = srcdir.resolve("base"); + Path mr9 = Paths.get("mr9"); + javac(base, mr9, base.toString()); + + // current version + Path rt = srcdir.resolve("rt"); + Path rtmods = Paths.get("rtmods"); + javac(rt, rtmods, rt.toString()); + + // build multi-release jar file with different module-info.class + String[] args = { + "-cf", "m1.jar", + "-C", rtmods.resolve("m1").toString(), ".", + "--release ", "9", + "-C", mr9.resolve("m1").toString(), "." + + }; + JAR_TOOL.run(System.out, System.err, args); + } + + private void javac(Path source, Path destination, String srcpath) throws IOException { + String[] args = Stream.concat( + Stream.of("-d", destination.toString(), "--release", "9", + "--module-source-path", srcpath), + Files.walk(source) + .map(Path::toString) + .filter(s -> s.endsWith(".java")) + ).toArray(String[]::new); + int rc = JAVAC_TOOL.run(System.out, System.err, args); + Assert.assertEquals(rc, 0); + } + + @Test + public void basicTest() throws Throwable { + if (Files.notExists(javaHome.resolve("lib").resolve("modules"))) { + // exploded image + return; + } + + Runtime.Version version = targetRuntimeVersion(); + System.out.println("Testing jlink with " + getJmods() + " of target version " + version); + + // use jlink to build image from multi-release jar + jlink("m1.jar", "myimage"); + + // validate runtime image + Path java = Paths.get("myimage", "bin", "java"); + ProcessTools.executeProcess(java.toString(), "-m", "m1/p.Main"); + + // validate the image linked with the proper MR version + + if (version.equalsIgnoreOptional(Runtime.version())) { + ProcessTools.executeProcess(java.toString(), "-cp", System.getProperty("test.classes"), + "CheckRuntimeVersion", String.valueOf(version.major()), + "java.base", "java.logging", "m1") + .shouldHaveExitValue(0); + } else { + ProcessTools.executeProcess(java.toString(), "-cp", System.getProperty("test.classes"), + "CheckRuntimeVersion", String.valueOf(version.major()), + "java.base", "m1") + .shouldHaveExitValue(0); + } + } + + private Runtime.Version targetRuntimeVersion() { + ModuleReference mref = ModulePath.of(Runtime.version(), true, getJmods()) + .find("java.base") + .orElseThrow(() -> new RuntimeException("java.base not found from " + getJmods())); + + return Runtime.Version.parse(mref.descriptor().version().get().toString()); + } + + private void jlink(String jar, String image) { + List args = List.of("--output", image, + "--add-modules", "m1", + "--module-path", + getJmods().toString() + File.pathSeparator + jar); + System.out.println("jlink " + args.stream().collect(Collectors.joining(" "))); + int exitCode = JLINK_TOOL.run(System.out, System.err, args.toArray(new String[0])); + Assert.assertEquals(exitCode, 0); + } +} diff -r e6e6ed17abbe -r 94f362b5f4dd test/nashorn/script/basic/JDK-8190391.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/nashorn/script/basic/JDK-8190391.js Tue Nov 14 09:19:50 2017 -0500 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2017, 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-8190391 : nashorn: "!!" of nonzero even integer var becomes false when returned + * + * @test + * @run + */ + + +function func(x){ + return !!x; +} +print(func(0)); +print(func(2)); +print(func(3)); diff -r e6e6ed17abbe -r 94f362b5f4dd test/nashorn/script/basic/JDK-8190391.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/nashorn/script/basic/JDK-8190391.js.EXPECTED Tue Nov 14 09:19:50 2017 -0500 @@ -0,0 +1,3 @@ +false +true +true diff -r e6e6ed17abbe -r 94f362b5f4dd test/nashorn/script/nosecurity/es6/JDK-8185119.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/nashorn/script/nosecurity/es6/JDK-8185119.js Tue Nov 14 09:19:50 2017 -0500 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017, 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-8185119: Uninitialized const when using multiple threads + * + * @test + * @option --language=es6 + * @run + */ + +function f() { + let a; + const b = {}; + b.crash; // b is sometimes undefined + + function c() { + a; b; + } +} + +let count = new java.util.concurrent.atomic.AtomicInteger(); + +let T = Java.extend(Java.type('java.lang.Thread'), { + run: function() { + for (let j = 0; j < 100; j++) { + f(); + } + count.getAndIncrement(); + } +}); + +const threads = [new T(), new T(), new T(), new T()]; +threads.forEach(t => t.start()); +threads.forEach(t => t.join()); + +Assert.assertEquals(count.intValue(), 4); + diff -r e6e6ed17abbe -r 94f362b5f4dd test/nashorn/src/jdk/nashorn/internal/test/framework/TestReorderInterceptor.java --- a/test/nashorn/src/jdk/nashorn/internal/test/framework/TestReorderInterceptor.java Tue Nov 14 09:15:12 2017 -0500 +++ b/test/nashorn/src/jdk/nashorn/internal/test/framework/TestReorderInterceptor.java Tue Nov 14 09:19:50 2017 -0500 @@ -47,6 +47,10 @@ final Object o2 = mi2.getInstance(); if (o1 instanceof ITest && o2 instanceof ITest) { return ((ITest)o1).getTestName().compareTo(((ITest)o2).getTestName()); + } else if (o1 instanceof ITest) { + return 1; + } else if (o2 instanceof ITest) { + return -1; } // something else, don't care about the order return 0;