Merge
authorjwilhelm
Fri, 08 Dec 2017 23:43:25 +0100
changeset 48384 ecff0c7bfb4d
parent 48383 d6388b652504 (current diff)
parent 48221 0ba2a82e4755 (diff)
child 48385 589a6f1d86e9
Merge
test/langtools/jdk/javadoc/doclet/testBadPackageFileInJar/badPackageFileInJar.jar
test/langtools/jdk/javadoc/doclet/testGroupOption/C.java
test/langtools/tools/javac/T5090006/AssertionFailureTest.java
test/langtools/tools/javac/T5090006/broken.jar
--- a/.hgtags	Fri Dec 08 15:14:08 2017 -0800
+++ b/.hgtags	Fri Dec 08 23:43:25 2017 +0100
@@ -459,3 +459,4 @@
 a2008587c13fa05fa2dbfcb09fe987576fbedfd1 jdk-10+32
 bbd692ad4fa300ecca7939ffbe3b1d5e52a28cc6 jdk-10+33
 89deac44e51517841491ba86ff44aa82a5ca96b3 jdk-10+34
+d8c634b016c628622c9abbdc6bf50509e5dedbec jdk-10+35
--- a/make/conf/jib-profiles.js	Fri Dec 08 15:14:08 2017 -0800
+++ b/make/conf/jib-profiles.js	Fri Dec 08 23:43:25 2017 +0100
@@ -662,6 +662,16 @@
         }
     });
 
+    // For open profiles, the non-debug jdk bundles, need an "open" prefix on the
+    // remote bundle names, forming the word "openjdk". See JDK-8188789.
+    common.main_profile_names.forEach(function (name) {
+        var openName = name + common.open_suffix;
+        profiles[openName].artifacts["jdk"].remote = replaceAll(
+            "\/jdk-", "/openjdk-",
+            replaceAll("\/\\1", "/open\\1",
+                       profiles[openName].artifacts["jdk"].remote));
+    });
+
     // Profiles used to run tests. Used in JPRT and Mach 5.
     var testOnlyProfiles = {
         "run-test-jprt": {
--- a/src/java.base/share/classes/java/lang/ClassLoader.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/java/lang/ClassLoader.java	Fri Dec 08 23:43:25 2017 +0100
@@ -38,6 +38,7 @@
 import java.security.PrivilegedAction;
 import java.security.ProtectionDomain;
 import java.security.cert.Certificate;
+import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Deque;
@@ -45,7 +46,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
@@ -2496,7 +2496,7 @@
         }
 
         // native libraries being loaded
-        static Deque<NativeLibrary> nativeLibraryContext = new LinkedList<>();
+        static Deque<NativeLibrary> nativeLibraryContext = new ArrayDeque<>(8);
 
         /*
          * The run() method will be invoked when this class loader becomes
--- a/src/java.base/share/classes/java/lang/Runtime.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/java/lang/Runtime.java	Fri Dec 08 23:43:25 2017 +0100
@@ -877,62 +877,6 @@
     }
 
     /**
-     * Creates a localized version of an input stream. This method takes
-     * an {@code InputStream} and returns an {@code InputStream}
-     * equivalent to the argument in all respects except that it is
-     * localized: as characters in the local character set are read from
-     * the stream, they are automatically converted from the local
-     * character set to Unicode.
-     * <p>
-     * If the argument is already a localized stream, it may be returned
-     * as the result.
-     *
-     * @param      in InputStream to localize
-     * @return     a localized input stream
-     * @see        java.io.InputStream
-     * @see        java.io.BufferedReader#BufferedReader(java.io.Reader)
-     * @see        java.io.InputStreamReader#InputStreamReader(java.io.InputStream)
-     * @deprecated As of JDK&nbsp;1.1, the preferred way to translate a byte
-     * stream in the local encoding into a character stream in Unicode is via
-     * the {@code InputStreamReader} and {@code BufferedReader}
-     * classes.
-     * This method is subject to removal in a future version of Java SE.
-     */
-    @Deprecated(since="1.1", forRemoval=true)
-    public InputStream getLocalizedInputStream(InputStream in) {
-        return in;
-    }
-
-    /**
-     * Creates a localized version of an output stream. This method
-     * takes an {@code OutputStream} and returns an
-     * {@code OutputStream} equivalent to the argument in all respects
-     * except that it is localized: as Unicode characters are written to
-     * the stream, they are automatically converted to the local
-     * character set.
-     * <p>
-     * If the argument is already a localized stream, it may be returned
-     * as the result.
-     *
-     * @deprecated As of JDK&nbsp;1.1, the preferred way to translate a
-     * Unicode character stream into a byte stream in the local encoding is via
-     * the {@code OutputStreamWriter}, {@code BufferedWriter}, and
-     * {@code PrintWriter} classes.
-     * This method is subject to removal in a future version of Java SE.
-     *
-     * @param      out OutputStream to localize
-     * @return     a localized output stream
-     * @see        java.io.OutputStream
-     * @see        java.io.BufferedWriter#BufferedWriter(java.io.Writer)
-     * @see        java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
-     * @see        java.io.PrintWriter#PrintWriter(java.io.OutputStream)
-     */
-    @Deprecated(since="1.1", forRemoval=true)
-    public OutputStream getLocalizedOutputStream(OutputStream out) {
-        return out;
-    }
-
-    /**
      * Returns the version of the Java Runtime Environment as a {@link Version}.
      *
      * @return  the {@link Version} of the Java Runtime Environment
--- a/src/java.base/share/classes/java/security/ProtectionDomain.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/java/security/ProtectionDomain.java	Fri Dec 08 23:43:25 2017 +0100
@@ -25,15 +25,13 @@
 
 package java.security;
 
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.SoftReference;
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.WeakHashMap;
 import jdk.internal.misc.JavaSecurityAccess;
 import jdk.internal.misc.JavaSecurityProtectionDomainAccess;
 import static jdk.internal.misc.JavaSecurityProtectionDomainAccess.ProtectionDomainCache;
@@ -115,23 +113,10 @@
     }
 
     static {
-        // setup SharedSecrets to allow access to doIntersectionPrivilege
-        // methods and ProtectionDomain cache
+        // Set up JavaSecurityAccess in SharedSecrets
         SharedSecrets.setJavaSecurityAccess(new JavaSecurityAccessImpl());
-        SharedSecrets.setJavaSecurityProtectionDomainAccess(
-            new JavaSecurityProtectionDomainAccess() {
-                @Override
-                public ProtectionDomainCache getProtectionDomainCache() {
-                    return new PDCache();
-                }
-            });
     }
 
-    /**
-     * Used for storing ProtectionDomains as keys in a Map.
-     */
-    static final class Key {}
-
     /* CodeSource */
     private CodeSource codesource ;
 
@@ -571,117 +556,27 @@
     }
 
     /**
-     * A cache of ProtectionDomains and their Permissions.
-     *
-     * This class stores ProtectionDomains as weak keys in a ConcurrentHashMap
-     * with additional support for checking and removing weak keys that are no
-     * longer in use. There can be cases where the permission collection may
-     * have a chain of strong references back to the ProtectionDomain, which
-     * ordinarily would prevent the entry from being removed from the map. To
-     * address that, we wrap the permission collection in a SoftReference so
-     * that it can be reclaimed by the garbage collector due to memory demand.
+     * Used for storing ProtectionDomains as keys in a Map.
      */
-    private static class PDCache implements ProtectionDomainCache {
-        private final ConcurrentHashMap<WeakProtectionDomainKey,
-                                        SoftReference<PermissionCollection>>
-                                        pdMap = new ConcurrentHashMap<>();
-        private final ReferenceQueue<Key> queue = new ReferenceQueue<>();
-
-        @Override
-        public void put(ProtectionDomain pd, PermissionCollection pc) {
-            processQueue(queue, pdMap);
-            WeakProtectionDomainKey weakPd =
-                new WeakProtectionDomainKey(pd, queue);
-            pdMap.put(weakPd, new SoftReference<>(pc));
-        }
-
-        @Override
-        public PermissionCollection get(ProtectionDomain pd) {
-            processQueue(queue, pdMap);
-            WeakProtectionDomainKey weakPd = new WeakProtectionDomainKey(pd);
-            SoftReference<PermissionCollection> sr = pdMap.get(weakPd);
-            return (sr == null) ? null : sr.get();
-        }
-
-        /**
-         * Removes weak keys from the map that have been enqueued
-         * on the reference queue and are no longer in use.
-         */
-        private static void processQueue(ReferenceQueue<Key> queue,
-                                         ConcurrentHashMap<? extends
-                                         WeakReference<Key>, ?> pdMap) {
-            Reference<? extends Key> ref;
-            while ((ref = queue.poll()) != null) {
-                pdMap.remove(ref);
-            }
-        }
-    }
-
-    /**
-     * A weak key for a ProtectionDomain.
-     */
-    private static class WeakProtectionDomainKey extends WeakReference<Key> {
-        /**
-         * Saved value of the referent's identity hash code, to maintain
-         * a consistent hash code after the referent has been cleared
-         */
-        private final int hash;
+    final class Key {}
 
-        /**
-         * A key representing a null ProtectionDomain.
-         */
-        private static final Key NULL_KEY = new Key();
-
-        /**
-         * Create a new WeakProtectionDomain with the specified domain and
-         * registered with a queue.
-         */
-        WeakProtectionDomainKey(ProtectionDomain pd, ReferenceQueue<Key> rq) {
-            this((pd == null ? NULL_KEY : pd.key), rq);
-        }
-
-        WeakProtectionDomainKey(ProtectionDomain pd) {
-            this(pd == null ? NULL_KEY : pd.key);
-        }
-
-        private WeakProtectionDomainKey(Key key, ReferenceQueue<Key> rq) {
-            super(key, rq);
-            hash = key.hashCode();
-        }
-
-        private WeakProtectionDomainKey(Key key) {
-            super(key);
-            hash = key.hashCode();
-        }
-
-        /**
-         * Returns the identity hash code of the original referent.
-         */
-        @Override
-        public int hashCode() {
-            return hash;
-        }
-
-        /**
-         * Returns true if the given object is an identical
-         * WeakProtectionDomainKey instance, or, if this object's referent
-         * has not been cleared and the given object is another
-         * WeakProtectionDomainKey instance with an identical non-null
-         * referent as this one.
-         */
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == this) {
-                return true;
-            }
-
-            if (obj instanceof WeakProtectionDomainKey) {
-                Object referent = get();
-                return (referent != null) &&
-                       (referent == ((WeakProtectionDomainKey)obj).get());
-            } else {
-                return false;
-            }
-        }
+    static {
+        SharedSecrets.setJavaSecurityProtectionDomainAccess(
+            new JavaSecurityProtectionDomainAccess() {
+                public ProtectionDomainCache getProtectionDomainCache() {
+                    return new ProtectionDomainCache() {
+                        private final Map<Key, PermissionCollection> map =
+                            Collections.synchronizedMap
+                                (new WeakHashMap<Key, PermissionCollection>());
+                        public void put(ProtectionDomain pd,
+                            PermissionCollection pc) {
+                            map.put((pd == null ? null : pd.key), pc);
+                        }
+                        public PermissionCollection get(ProtectionDomain pd) {
+                            return pd == null ? map.get(null) : map.get(pd.key);
+                        }
+                    };
+                }
+            });
     }
 }
--- a/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java	Fri Dec 08 23:43:25 2017 +0100
@@ -63,6 +63,9 @@
 
 public final class ModuleInfo {
 
+    private final int JAVA_MIN_SUPPORTED_VERSION = 53;
+    private final int JAVA_MAX_SUPPORTED_VERSION = 54;
+
     private static final JavaLangModuleAccess JLMA
         = SharedSecrets.getJavaLangModuleAccess();
 
@@ -188,8 +191,10 @@
 
         int minor_version = in.readUnsignedShort();
         int major_version = in.readUnsignedShort();
-        if (major_version < 53) {
-            throw invalidModuleDescriptor("Must be >= 53.0");
+        if (major_version < JAVA_MIN_SUPPORTED_VERSION ||
+                major_version > JAVA_MAX_SUPPORTED_VERSION) {
+            throw invalidModuleDescriptor("Unsupported major.minor version "
+                                          + major_version + "." + minor_version);
         }
 
         ConstantPool cpool = new ConstantPool(in);
@@ -245,7 +250,7 @@
             switch (attribute_name) {
 
                 case MODULE :
-                    builder = readModuleAttribute(in, cpool);
+                    builder = readModuleAttribute(in, cpool, major_version);
                     break;
 
                 case MODULE_PACKAGES :
@@ -334,7 +339,7 @@
      * Reads the Module attribute, returning the ModuleDescriptor.Builder to
      * build the corresponding ModuleDescriptor.
      */
-    private Builder readModuleAttribute(DataInput in, ConstantPool cpool)
+    private Builder readModuleAttribute(DataInput in, ConstantPool cpool, int major)
         throws IOException
     {
         // module_name
@@ -390,8 +395,21 @@
                 JLMA.requires(builder, mods, dn, vs);
             }
 
-            if (dn.equals("java.base"))
+            if (dn.equals("java.base")) {
+                if (major >= 54
+                    && (mods.contains(Requires.Modifier.TRANSITIVE)
+                        || mods.contains(Requires.Modifier.STATIC))) {
+                    String flagName;
+                    if (mods.contains(Requires.Modifier.TRANSITIVE)) {
+                        flagName = "ACC_TRANSITIVE";
+                    } else {
+                        flagName = "ACC_STATIC_PHASE";
+                    }
+                    throw invalidModuleDescriptor("The requires entry for java.base"
+                                                  + " has " + flagName + " set");
+                }
                 requiresJavaBase = true;
+            }
         }
         if (mn.equals("java.base")) {
             if (requires_count > 0) {
--- a/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java	Fri Dec 08 23:43:25 2017 +0100
@@ -80,7 +80,7 @@
      */
     private static byte[] toModuleInfo(ModuleDescriptor md, ModuleTarget target) {
         ClassWriter cw = new ClassWriter(0);
-        cw.visit(Opcodes.V9, ACC_MODULE, "module-info", null, null, null);
+        cw.visit(Opcodes.V10, ACC_MODULE, "module-info", null, null, null);
 
         int moduleFlags = md.modifiers().stream()
                 .map(MODULE_MODS_TO_FLAGS::get)
--- a/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -93,8 +93,9 @@
      * MSCAPI KeyStores
      */
     public static boolean isWindowsKeyStore(String storetype) {
-        return storetype.equalsIgnoreCase("Windows-MY")
-                || storetype.equalsIgnoreCase("Windows-ROOT");
+        return storetype != null
+                && (storetype.equalsIgnoreCase("Windows-MY")
+                    || storetype.equalsIgnoreCase("Windows-ROOT"));
     }
 
     /**
--- a/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Fri Dec 08 23:43:25 2017 +0100
@@ -134,8 +134,6 @@
     private Set<Pair <String, String>> providers = null;
     private Set<Pair <String, String>> providerClasses = null;
     private String storetype = null;
-    private boolean hasStoretypeOption = false;
-    private boolean hasSrcStoretypeOption = false;
     private String srcProviderName = null;
     private String providerName = null;
     private String pathlist = null;
@@ -549,14 +547,12 @@
                 passwords.add(storePass);
             } else if (collator.compare(flags, "-storetype") == 0 ||
                     collator.compare(flags, "-deststoretype") == 0) {
-                storetype = args[++i];
-                hasStoretypeOption = true;
+                storetype = KeyStoreUtil.niceStoreTypeName(args[++i]);
             } else if (collator.compare(flags, "-srcstorepass") == 0) {
                 srcstorePass = getPass(modifier, args[++i]);
                 passwords.add(srcstorePass);
             } else if (collator.compare(flags, "-srcstoretype") == 0) {
-                srcstoretype = args[++i];
-                hasSrcStoretypeOption = true;
+                srcstoretype = KeyStoreUtil.niceStoreTypeName(args[++i]);
             } else if (collator.compare(flags, "-srckeypass") == 0) {
                 srckeyPass = getPass(modifier, args[++i]);
                 passwords.add(srckeyPass);
@@ -708,16 +704,6 @@
             ksfname = KeyStoreUtil.getCacerts();
         }
 
-        if (storetype == null) {
-            storetype = KeyStore.getDefaultType();
-        }
-        storetype = KeyStoreUtil.niceStoreTypeName(storetype);
-
-        if (srcstoretype == null) {
-            srcstoretype = KeyStore.getDefaultType();
-        }
-        srcstoretype = KeyStoreUtil.niceStoreTypeName(srcstoretype);
-
         if (P11KEYSTORE.equalsIgnoreCase(storetype) ||
                 KeyStoreUtil.isWindowsKeyStore(storetype)) {
             token = true;
@@ -742,11 +728,6 @@
                         (".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}"), storetype));
         }
 
-        if (P12KEYSTORE.equalsIgnoreCase(storetype) && command == KEYPASSWD) {
-            throw new UnsupportedOperationException(rb.getString
-                        (".keypasswd.commands.not.supported.if.storetype.is.PKCS12"));
-        }
-
         if (token && (keyPass != null || newPass != null || destKeyPass != null)) {
             throw new IllegalArgumentException(MessageFormat.format(rb.getString
                 (".keypass.and.new.can.not.be.specified.if.storetype.is.{0}"), storetype));
@@ -923,9 +904,13 @@
         // Create new keystore
         // Probe for keystore type when filename is available
         if (ksfile != null && ksStream != null && providerName == null &&
-                hasStoretypeOption == false && !inplaceImport) {
+                storetype == null && !inplaceImport) {
             keyStore = KeyStore.getInstance(ksfile, storePass);
+            storetype = keyStore.getType();
         } else {
+            if (storetype == null) {
+                storetype = KeyStore.getDefaultType();
+            }
             if (providerName == null) {
                 keyStore = KeyStore.getInstance(storetype);
             } else {
@@ -964,6 +949,11 @@
             }
         }
 
+        if (P12KEYSTORE.equalsIgnoreCase(storetype) && command == KEYPASSWD) {
+            throw new UnsupportedOperationException(rb.getString
+                    (".keypasswd.commands.not.supported.if.storetype.is.PKCS12"));
+        }
+
         // All commands that create or modify the keystore require a keystore
         // password.
 
@@ -2123,9 +2113,13 @@
         try {
             // Probe for keystore type when filename is available
             if (srcksfile != null && is != null && srcProviderName == null &&
-                hasSrcStoretypeOption == false) {
+                    srcstoretype == null) {
                 store = KeyStore.getInstance(srcksfile, srcstorePass);
+                srcstoretype = store.getType();
             } else {
+                if (srcstoretype == null) {
+                    srcstoretype = KeyStore.getDefaultType();
+                }
                 if (srcProviderName == null) {
                     store = KeyStore.getInstance(srcstoretype);
                 } else {
--- a/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -476,10 +476,14 @@
     (*env)->SetLongField(env, attrs, attrs_st_birthtime_sec, (jlong)buf->st_birthtime);
 #endif
 
-#if (_POSIX_C_SOURCE >= 200809L) || defined(__solaris__)
+#ifndef MACOSX
     (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atim.tv_nsec);
     (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtim.tv_nsec);
     (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctim.tv_nsec);
+#else
+    (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atimespec.tv_nsec);
+    (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtimespec.tv_nsec);
+    (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctimespec.tv_nsec);
 #endif
 }
 
--- a/src/java.logging/share/classes/java/util/logging/LogManager.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/java.logging/share/classes/java/util/logging/LogManager.java	Fri Dec 08 23:43:25 2017 +0100
@@ -388,15 +388,23 @@
                         // create root logger before reading primordial
                         // configuration - to ensure that it will be added
                         // before the global logger, and not after.
-                        owner.rootLogger = owner.new RootLogger();
+                        final Logger root = owner.rootLogger = owner.new RootLogger();
 
                         // Read configuration.
                         owner.readPrimordialConfiguration();
 
                         // Create and retain Logger for the root of the namespace.
-                        owner.addLogger(owner.rootLogger);
-                        if (!owner.rootLogger.isLevelInitialized()) {
-                            owner.rootLogger.setLevel(defaultLevel);
+                        owner.addLogger(root);
+
+                        // For backward compatibility: add any handlers configured using
+                        // ".handlers"
+                        owner.createLoggerHandlers("", ".handlers")
+                                .stream()
+                                .forEach(root::addHandler);
+
+                        // Initialize level if not yet initialized
+                        if (!root.isLevelInitialized()) {
+                            root.setLevel(defaultLevel);
                         }
 
                         // Adding the global Logger.
@@ -1708,7 +1716,7 @@
          * @param k a property key in the configuration
          * @param previous the old configuration
          * @param next the new configuration (modified by this function)
-         * @param remappingFunction the mapping function.
+         * @param mappingFunction the mapping function.
          */
         static void merge(String k, Properties previous, Properties next,
                           BiFunction<String, String, String> mappingFunction) {
--- a/src/jdk.dynalink/share/classes/jdk/dynalink/beans/BeanLinker.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.dynalink/share/classes/jdk/dynalink/beans/BeanLinker.java	Fri Dec 08 23:43:25 2017 +0100
@@ -205,9 +205,8 @@
             return nextComponent;
         }
 
-        return guardComponentWithRangeCheck(gicact, linkerServices,
-                callSiteDescriptor, nextComponent, new Binder(linkerServices, callSiteType, typedName),
-                isFixedKey ? NULL_GETTER_1 : NULL_GETTER_2);
+        return guardComponentWithRangeCheck(gicact, callSiteType, nextComponent,
+                new Binder(linkerServices, callSiteType, typedName), isFixedKey ? NULL_GETTER_1 : NULL_GETTER_2);
     }
 
     private static class GuardedInvocationComponentAndCollectionType {
@@ -276,21 +275,19 @@
     }
 
     private static GuardedInvocationComponent guardComponentWithRangeCheck(
-            final GuardedInvocationComponentAndCollectionType gicact, final LinkerServices linkerServices,
-            final CallSiteDescriptor callSiteDescriptor, final GuardedInvocationComponent nextComponent, final Binder binder,
-            final MethodHandle noOp) {
-        final MethodType callSiteType = callSiteDescriptor.getMethodType();
+            final GuardedInvocationComponentAndCollectionType gicact, final MethodType callSiteType,
+            final GuardedInvocationComponent nextComponent, final Binder binder, final MethodHandle noOp) {
 
         final MethodHandle checkGuard;
         switch(gicact.collectionType) {
             case LIST:
-                checkGuard = convertArgToNumber(RANGE_CHECK_LIST, linkerServices, callSiteDescriptor);
+                checkGuard = binder.convertArgToNumber(RANGE_CHECK_LIST);
                 break;
             case MAP:
-                checkGuard = linkerServices.filterInternalObjects(CONTAINS_MAP);
+                checkGuard = binder.linkerServices.filterInternalObjects(CONTAINS_MAP);
                 break;
             case ARRAY:
-                checkGuard = convertArgToNumber(RANGE_CHECK_ARRAY, linkerServices, callSiteDescriptor);
+                checkGuard = binder.convertArgToNumber(RANGE_CHECK_ARRAY);
                 break;
             default:
                 throw new AssertionError();
@@ -301,7 +298,7 @@
         if (nextComponent != null) {
             finalNextComponent = nextComponent;
         } else {
-            finalNextComponent = createGuardedInvocationComponentAsType(noOp, callSiteType, linkerServices);
+            finalNextComponent = createGuardedInvocationComponentAsType(noOp, callSiteType, binder.linkerServices);
         }
 
         final GuardedInvocationComponent gic = gicact.gic;
@@ -377,18 +374,6 @@
         return intIndex;
     }
 
-    private static MethodHandle convertArgToNumber(final MethodHandle mh, final LinkerServices ls, final CallSiteDescriptor desc) {
-        final Class<?> sourceType = desc.getMethodType().parameterType(1);
-        if(TypeUtilities.isMethodInvocationConvertible(sourceType, Number.class)) {
-            return mh;
-        } else if(ls.canConvert(sourceType, Number.class)) {
-            final MethodHandle converter = ls.getTypeConverter(sourceType, Number.class);
-            return MethodHandles.filterArguments(mh, 1, converter.asType(converter.type().changeReturnType(
-                    mh.type().parameterType(1))));
-        }
-        return mh;
-    }
-
     /**
      * Contains methods to adapt an item getter/setter method handle to the requested type, optionally binding it to a
      * fixed key first.
@@ -412,6 +397,18 @@
             return bindToFixedKey(Guards.asType(handle, methodType));
         }
 
+        /*private*/ MethodHandle convertArgToNumber(final MethodHandle mh) {
+            final Class<?> sourceType = methodType.parameterType(1);
+            if(TypeUtilities.isMethodInvocationConvertible(sourceType, Number.class)) {
+                return mh;
+            } else if(linkerServices.canConvert(sourceType, Number.class)) {
+                final MethodHandle converter = linkerServices.getTypeConverter(sourceType, Number.class);
+                return MethodHandles.filterArguments(mh, 1, converter.asType(converter.type().changeReturnType(
+                        mh.type().parameterType(1))));
+            }
+            return mh;
+        }
+
         private MethodHandle bindToFixedKey(final MethodHandle handle) {
             return fixedKey == null ? handle : MethodHandles.insertArguments(handle, 1, fixedKey);
         }
@@ -506,8 +503,7 @@
             return gic.replaceInvocation(binder.bind(invocation));
         }
 
-        return guardComponentWithRangeCheck(gicact, linkerServices, callSiteDescriptor,
-                nextComponent, binder, isFixedKey ? NO_OP_SETTER_2 : NO_OP_SETTER_3);
+        return guardComponentWithRangeCheck(gicact, callSiteType, nextComponent, binder, isFixedKey ? NO_OP_SETTER_2 : NO_OP_SETTER_3);
     }
 
     private static final MethodHandle GET_COLLECTION_LENGTH = Lookup.PUBLIC.findVirtual(Collection.class, "size",
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ValueTaglet.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ValueTaglet.java	Fri Dec 08 23:43:25 2017 +0100
@@ -25,11 +25,8 @@
 
 package jdk.javadoc.internal.doclets.toolkit.taglets;
 
-
 import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
-import javax.lang.model.util.Elements;
 
 import com.sun.source.doctree.DocTree;
 import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
@@ -121,60 +118,26 @@
     }
 
     /**
-     * Given the name of the field, return the corresponding VariableElement. Return null
-     * due to invalid use of value tag if the name is null or empty string and if
-     * the value tag is not used on a field.
+     * Returns the referenced field or a null if the value tag
+     * is empty or the reference is invalid.
      *
-     * @param holder the element holding the tag
-     * @param config the current configuration of the doclet.
+     * @param holder the tag holder.
+     * @param config the  configuration of the doclet.
      * @param tag the value tag.
      *
-     * @return the corresponding VariableElement. If the name is null or empty string,
-     * return field that the value tag was used in. Return null if the name is null
-     * or empty string and if the value tag is not used on a field.
+     * @return the referenced field or null.
      */
     private VariableElement getVariableElement(Element holder, BaseConfiguration config, DocTree tag) {
-        Utils utils = config.utils;
-        CommentHelper ch = utils.getCommentHelper(holder);
+        CommentHelper ch = config.utils.getCommentHelper(holder);
         String signature = ch.getReferencedSignature(tag);
 
-        if (signature == null) { // no reference
-            //Base case: no label.
-            if (utils.isVariableElement(holder)) {
-                return (VariableElement)(holder);
-            } else {
-                // If the value tag does not specify a parameter which is a valid field and
-                // it is not used within the comments of a valid field, return null.
-                 return null;
-            }
-        }
+        Element e = signature == null
+                ? holder
+                : ch.getReferencedMember(config, tag);
 
-        String[] sigValues = signature.split("#");
-        String memberName = null;
-        TypeElement te = null;
-        if (sigValues.length == 1) {
-            //Case 2:  @value in same class.
-            if (utils.isExecutableElement(holder) || utils.isVariableElement(holder)) {
-                te = utils.getEnclosingTypeElement(holder);
-            } else if (utils.isTypeElement(holder)) {
-                te = utils.getTopMostContainingTypeElement(holder);
-            }
-            memberName = sigValues[0];
-        } else {
-            //Case 3: @value in different class.
-            Elements elements = config.docEnv.getElementUtils();
-            te = elements.getTypeElement(sigValues[0]);
-            memberName = sigValues[1];
-        }
-        if (te == null) {
-            return null;
-        }
-        for (Element field : utils.getFields(te)) {
-            if (utils.getSimpleName(field).equals(memberName)) {
-                return (VariableElement)field;
-            }
-        }
-        return null;
+        return (e != null && config.utils.isVariableElement(e))
+                ? (VariableElement) e
+                : null;
     }
 
     /**
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Group.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Group.java	Fri Dec 08 23:43:25 2017 +0100
@@ -290,7 +290,7 @@
             groupList.add(defaultGroupName);
         }
         for (PackageElement pkg : packages) {
-            String pkgName = pkg.isUnnamed() ? null : configuration.utils.getPackageName(pkg);
+            String pkgName = configuration.utils.getPackageName(pkg);
             String groupName = pkg.isUnnamed() ? null : elementNameGroupMap.get(pkgName);
             // if this package is not explicitly assigned to a group,
             // try matching it to group specified by regular expression
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java	Fri Dec 08 23:43:25 2017 +0100
@@ -2365,9 +2365,6 @@
 
     List<Element> getItems(Element e, boolean filter, ElementKind select) {
         List<Element> elements = new ArrayList<>();
-        // maintain backward compatibility by returning a null list, see AnnotationDocType.methods().
-        if (configuration.backwardCompatibility && e.getKind() == ANNOTATION_TYPE)
-            return elements;
         return new SimpleElementVisitor9<List<Element>, Void>() {
 
             @Override
--- a/src/jdk.jdi/share/native/libdt_shmem/shmemBase.c	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.jdi/share/native/libdt_shmem/shmemBase.c	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -31,6 +31,10 @@
 #include "shmemBase.h"
 #include "jdwpTransport.h"  /* for Packet, TransportCallback */
 
+#if defined(_WIN32)
+  #define PRId64 "I64d"
+#endif
+
 #define MIN(x,y) ((x)<(y)?(x):(y))
 
 /*
@@ -537,7 +541,7 @@
         return SYS_NOMEM;
     }
 
-    sprintf(connection->name, "%s.%ld", transport->name, sysProcessGetID());
+    sprintf(connection->name, "%s.%" PRId64, transport->name, sysProcessGetID());
     error = sysSharedMemOpen(connection->name, &connection->sharedMemory,
                              &connection->shared);
     if (error != SYS_OK) {
@@ -601,7 +605,7 @@
         return SYS_NOMEM;
     }
 
-    sprintf(connection->name, "%s.%ld", transport->name, otherPID);
+    sprintf(connection->name, "%s.%" PRId64, transport->name, otherPID);
     error = sysSharedMemCreate(connection->name, sizeof(SharedMemory),
                                &connection->sharedMemory, &connection->shared);
     if (error != SYS_OK) {
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleSorter.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleSorter.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 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
@@ -30,13 +30,16 @@
 import jdk.tools.jlink.plugin.ResourcePoolModuleView;
 
 import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Requires;
 import java.lang.module.ModuleDescriptor.Requires.Modifier;
 
 import java.nio.ByteBuffer;
-import java.util.Deque;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedList;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Stream;
@@ -45,9 +48,8 @@
  * Helper class to sort modules in topological order
  */
 public final class ModuleSorter {
-    private final Deque<ResourcePoolModule> nodes = new LinkedList<>();
-    private final Map<String, Set<ResourcePoolModule>> edges = new HashMap<>();
-    private final Deque<ResourcePoolModule> result = new LinkedList<>();
+    private final Map<ResourcePoolModule, Set<ResourcePoolModule>> graph = new HashMap<>();
+    private final List<ResourcePoolModule> result = new ArrayList<>();
 
     private final ResourcePoolModuleView moduleView;
 
@@ -69,11 +71,17 @@
 
     private ModuleSorter addModule(ResourcePoolModule module) {
         addNode(module);
-        readModuleDescriptor(module).requires().forEach(req -> {
+        // the module graph will be traversed in a stable order for
+        // the topological sort. So add the dependences in the module name order
+        readModuleDescriptor(module).requires()
+                                    .stream()
+                                    .sorted(Comparator.comparing(Requires::name))
+                                    .forEach(req ->
+        {
             ResourcePoolModule dep = moduleView.findModule(req.name()).orElse(null);
             if (dep != null) {
                 addNode(dep);
-                edges.get(module.name()).add(dep);
+                graph.get(module).add(dep);
             } else if (!req.modifiers().contains(Modifier.STATIC)) {
                 throw new PluginException(req.name() + " not found");
             }
@@ -82,22 +90,23 @@
     }
 
     private void addNode(ResourcePoolModule module) {
-        nodes.add(module);
-        edges.computeIfAbsent(module.name(), _n -> new HashSet<>());
+        graph.computeIfAbsent(module, _n -> new LinkedHashSet<>());
     }
 
+    /*
+     * The module graph will be traversed in a stable order
+     * (traversing the modules and their dependences in alphabetical order)
+     * so that it will produce the same result of a given module graph.
+     */
     private synchronized void build() {
-        if (!result.isEmpty() || nodes.isEmpty())
+        if (!result.isEmpty() || graph.isEmpty())
             return;
 
-        Deque<ResourcePoolModule> visited = new LinkedList<>();
-        Deque<ResourcePoolModule> done = new LinkedList<>();
-        ResourcePoolModule node;
-        while ((node = nodes.poll()) != null) {
-            if (!visited.contains(node)) {
-                visit(node, visited, done);
-            }
-        }
+        Set<ResourcePoolModule> visited = new HashSet<>();
+        Set<ResourcePoolModule> done = new HashSet<>();
+        graph.keySet().stream()
+             .sorted(Comparator.comparing(ResourcePoolModule::name))
+             .forEach(node -> visit(node, visited, done));
     }
 
     public Stream<ResourcePoolModule> sorted() {
@@ -106,19 +115,21 @@
     }
 
     private void visit(ResourcePoolModule node,
-                       Deque<ResourcePoolModule> visited,
-                       Deque<ResourcePoolModule> done) {
+                       Set<ResourcePoolModule> visited,
+                       Set<ResourcePoolModule> done) {
         if (visited.contains(node)) {
             if (!done.contains(node)) {
                 throw new IllegalArgumentException("Cyclic detected: " +
-                    node + " " + edges.get(node.name()));
+                    node + " " + graph.get(node));
             }
             return;
         }
+
+        // traverse the dependences of the given module which are
+        // also sorted in alphabetical order
         visited.add(node);
-        edges.get(node.name())
-             .forEach(x -> visit(x, visited, done));
+        graph.get(node).forEach(x -> visit(x, visited, done));
         done.add(node);
-        result.addLast(node);
+        result.add(node);
     }
 }
--- a/src/jdk.jshell/share/classes/jdk/jshell/Eval.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.jshell/share/classes/jdk/jshell/Eval.java	Fri Dec 08 23:43:25 2017 +0100
@@ -834,6 +834,8 @@
                         if (!toReplace.isEmpty()) {
                             replaced.addAll(toReplace);
                             replaced.stream().forEach(Unit::markForReplacement);
+                            //ensure correct classnames are set in the snippets:
+                            replaced.stream().forEach(u -> u.setWrap(ins, legit));
                         }
 
                         return toReplace.isEmpty() ? Result.SUCESS : Result.FAILURE;
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java	Fri Dec 08 23:43:25 2017 +0100
@@ -295,7 +295,7 @@
                 } catch (final IOException ioe) {
                     // ignore
                 }
-                if (l.startsWith("#!")) {
+                if (l != null && l.startsWith("#!")) {
                     shebangFilePos = i;
                 }
                 // We're only checking the first non-option argument. If it's not a shebang file, we're in normal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/lang/module/ClassFileVersionsTest.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,104 @@
+/*
+ * 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
+ * @modules java.base/jdk.internal.module
+ * @run testng ClassFileVersionsTest
+ * @summary Test parsing of module-info.class with different class file versions
+ */
+
+import java.lang.module.InvalidModuleDescriptorException;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Requires.Modifier;
+import java.nio.ByteBuffer;
+import java.util.Set;
+
+import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
+
+import jdk.internal.module.ModuleInfoWriter;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+public class ClassFileVersionsTest {
+
+    // major, minor, modifiers for requires java.base
+    @DataProvider(name = "supported")
+    public Object[][] supported() {
+        return new Object[][]{
+                { 53,   0,  Set.of() },                      // JDK 9
+                { 53,   0,  Set.of(STATIC) },
+                { 53,   0,  Set.of(TRANSITIVE) },
+                { 53,   0,  Set.of(STATIC, TRANSITIVE) },
+
+                { 54,   0,  Set.of() },                      // JDK 10
+        };
+    }
+
+    // major, minor, modifiers for requires java.base
+    @DataProvider(name = "unsupported")
+    public Object[][] unsupported() {
+        return new Object[][]{
+                { 50,   0,  Set.of()},                       // JDK 6
+                { 51,   0,  Set.of()},                       // JDK 7
+                { 52,   0,  Set.of()},                       // JDK 8
+
+                { 54,   0,  Set.of(STATIC) },                // JDK 10
+                { 54,   0,  Set.of(TRANSITIVE) },
+                { 54,   0,  Set.of(STATIC, TRANSITIVE) },
+
+                { 55,   0,  Set.of()},                       // JDK 11
+        };
+    }
+
+    @Test(dataProvider = "supported")
+    public void testSupported(int major, int minor, Set<Modifier> ms) {
+        ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
+                .requires(ms, "java.base")
+                .build();
+        ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
+        classFileVersion(bb, major, minor);
+        descriptor = ModuleDescriptor.read(bb);
+        assertEquals(descriptor.name(), "foo");
+    }
+
+    @Test(dataProvider = "unsupported",
+          expectedExceptions = InvalidModuleDescriptorException.class)
+    public void testUnsupported(int major, int minor, Set<Modifier> ms) {
+        ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
+                .requires(ms, "java.base")
+                .build();
+        ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
+        classFileVersion(bb, major, minor);
+
+        // throws InvalidModuleDescriptorException
+        ModuleDescriptor.read(bb);
+    }
+
+    private void classFileVersion(ByteBuffer bb, int major, int minor) {
+        bb.putShort(4, (short) minor);
+        bb.putShort(6, (short) major);
+    }
+}
--- a/test/jdk/java/nio/file/Files/SetLastModifiedTime.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/jdk/java/nio/file/Files/SetLastModifiedTime.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -21,6 +21,7 @@
  * questions.
  */
 
+import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -36,7 +37,7 @@
 
 /**
  * @test
- * @bug 4313887 8062949
+ * @bug 4313887 8062949 8191872
  * @library ..
  * @run testng SetLastModifiedTime
  * @summary Unit test for Files.setLastModifiedTime
@@ -114,5 +115,20 @@
             assertTrue(false);
         } catch (NullPointerException expected) { }
     }
+
+    @Test
+    public void testCompare() throws Exception {
+        Path path = Files.createFile(testDir.resolve("path"));
+        long timeMillis = 1512520600195L;
+        FileTime fileTime = FileTime.fromMillis(timeMillis);
+        Files.setLastModifiedTime(path, fileTime);
+        File file = path.toFile();
+        long ioTime = file.lastModified();
+        long nioTime = Files.getLastModifiedTime(path).toMillis();
+        assertTrue(ioTime == timeMillis || ioTime == 1000*(timeMillis/1000),
+            "File.lastModified() not in {time, 1000*(time/1000)}");
+        assertEquals(nioTime, ioTime,
+            "File.lastModified() != Files.getLastModifiedTime().toMillis()");
+    }
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/logging/LogManager/Configuration/rootLoggerHandlers/RootLoggerHandlers.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,180 @@
+/*
+ * 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.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @test
+ * @bug 8191033
+ * @build custom.DotHandler custom.Handler
+ * @run main/othervm RootLoggerHandlers
+ * @author danielfuchs
+ */
+public class RootLoggerHandlers {
+
+    public static final Path SRC_DIR =
+            Paths.get(System.getProperty("test.src", "src"));
+    public static final Path USER_DIR =
+            Paths.get(System.getProperty("user.dir", "."));
+    public static final Path CONFIG_FILE = Paths.get("logging.properties");
+
+    // Uncomment this to run the test on Java 8. Java 8 does not have
+    // List.of(...)
+    //    static final class List {
+    //        static <T> java.util.List<T> of(T... items) {
+    //            return Collections.unmodifiableList(Arrays.asList(items));
+    //        }
+    //    }
+
+    public static void main(String[] args) throws IOException {
+        Path initialProps = SRC_DIR.resolve(CONFIG_FILE);
+        Path loggingProps = USER_DIR.resolve(CONFIG_FILE);
+        System.setProperty("java.util.logging.config.file", loggingProps.toString());
+        Files.copy(initialProps, loggingProps);
+        System.out.println("Root level is: " + Logger.getLogger("").getLevel());
+        if (Logger.getLogger("").getLevel() != Level.INFO) {
+            throw new RuntimeException("Expected root level INFO, got: "
+                                        + Logger.getLogger("").getLevel());
+        }
+        // Verify that we have two handlers. One was configured with
+        // handlers=custom.Handler, the other with
+        // .handlers=custom.DotHandler
+        // Verify that exactly one of the two handlers is a custom.Handler
+        // Verify that exactly one of the two handlers is a custom.DotHandler
+        // Verify that the two handlers has an id of '1'
+        checkHandlers(Logger.getLogger("").getHandlers(),
+                1L,
+                custom.Handler.class,
+                custom.DotHandler.class);
+
+        // The log message "hi" should appear twice on the console.
+        // We don't check that. This is just for log analysis in case
+        // of test failure.
+        Logger.getAnonymousLogger().info("hi");
+
+        // Change the root logger level to FINE in the properties file
+        // and reload the configuration.
+        Files.write(loggingProps,
+                Files.lines(initialProps)
+                        .map((s) -> s.replace("INFO", "FINE"))
+                        .collect(Collectors.toList()));
+        LogManager.getLogManager().readConfiguration();
+
+        System.out.println("Root level is: " + Logger.getLogger("").getLevel());
+        if (Logger.getLogger("").getLevel() != Level.FINE) {
+            throw new RuntimeException("Expected root level FINE, got: "
+                    + Logger.getLogger("").getLevel());
+        }
+
+        // Verify that we have now only one handler, configured with
+        // handlers=custom.Handler, and that the other configured with
+        // .handlers=custom.DotHandler was ignored.
+        // Verify that the handler is a custom.Handler
+        // Verify that the handler has an id of '2'
+        checkHandlers(Logger.getLogger("").getHandlers(),
+                2L,
+                custom.Handler.class);
+
+        // The log message "there" should appear only once on the console.
+        // We don't check that. This is just for log analysis in case
+        // of test failure.
+        Logger.getAnonymousLogger().info("there!");
+
+        // Change the root logger level to FINER in the properties file
+        // and reload the configuration.
+        Files.write(loggingProps,
+                Files.lines(initialProps)
+                        .map((s) -> s.replace("INFO", "FINER"))
+                        .collect(Collectors.toList()));
+        LogManager.getLogManager().readConfiguration();
+
+        System.out.println("Root level is: " + Logger.getLogger("").getLevel());
+        if (Logger.getLogger("").getLevel() != Level.FINER) {
+            throw new RuntimeException("Expected root level FINER, got: "
+                    + Logger.getLogger("").getLevel());
+        }
+
+        // Verify that we have only one handler, configured with
+        // handlers=custom.Handler, and that the other configured with
+        // .handlers=custom.DotHandler was ignored.
+        // Verify that the handler is a custom.Handler
+        // Verify that the handler has an id of '3'
+        checkHandlers(Logger.getLogger("").getHandlers(),
+                3L,
+                custom.Handler.class);
+
+        // The log message "done" should appear only once on the console.
+        // We don't check that. This is just for log analysis in case
+        // of test failure.
+        Logger.getAnonymousLogger().info("done!");
+    }
+
+    static void checkHandlers(Handler[] handlers, Long expectedID, Class<?>... clz) {
+        // Verify that we have the expected number of handlers.
+        if (Stream.of(handlers).count() != clz.length) {
+            throw new RuntimeException("Expected " + clz.length + " handlers, got: "
+                    + List.of(Logger.getLogger("").getHandlers()));
+        }
+        for (Class<?> cl : clz) {
+            // Verify that the handlers are of the expected class.
+            // For each class, we should have exactly one handler
+            // of that class.
+            if (Stream.of(handlers)
+                    .map(Object::getClass)
+                    .filter(cl::equals)
+                    .count() != 1) {
+                throw new RuntimeException("Expected one " + cl +", got: "
+                        + List.of(Logger.getLogger("").getHandlers()));
+            }
+        }
+        // Verify that all handlers have the expected ID
+        if (Stream.of(Logger.getLogger("").getHandlers())
+                .map(RootLoggerHandlers::getId)
+                .filter(expectedID::equals)
+                .count() != clz.length) {
+            throw new RuntimeException("Expected ids to be " + expectedID + ", got: "
+                    + List.of(Logger.getLogger("").getHandlers()));
+        }
+    }
+
+    static long getId(Handler h) {
+        if (h instanceof custom.Handler) {
+            return ((custom.Handler)h).id;
+        }
+        if (h instanceof custom.DotHandler) {
+            return ((custom.DotHandler)h).id;
+        }
+        return -1;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/logging/LogManager/Configuration/rootLoggerHandlers/custom/DotHandler.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+package custom;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ *
+ * @author danielfuchs
+ */
+public class DotHandler extends java.util.logging.ConsoleHandler {
+
+    public static final AtomicLong IDS = new AtomicLong();
+    public final long id = IDS.incrementAndGet();
+    public DotHandler() {
+        System.out.println("DotHandler(" + id + ") created");
+        //new Exception("DotHandler").printStackTrace();
+    }
+
+    @Override
+    public void close() {
+        System.out.println("DotHandler(" + id + ") closed");
+        super.close();
+    }
+
+    @Override
+    public String toString() {
+        return this.getClass().getName() + '(' + id + ')';
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/logging/LogManager/Configuration/rootLoggerHandlers/custom/Handler.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+package custom;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ *
+ * @author danielfuchs
+ */
+public class Handler extends java.util.logging.ConsoleHandler {
+
+    static final AtomicLong IDS = new AtomicLong();
+    public final long id = IDS.incrementAndGet();
+    public Handler() {
+        System.out.println("Handler(" + id + ") created");
+    }
+
+    @Override
+    public void close() {
+        System.out.println("Handler(" + id + ") closed");
+        super.close();
+    }
+
+    @Override
+    public String toString() {
+        return this.getClass().getName() + '(' + id + ')';
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/logging/LogManager/Configuration/rootLoggerHandlers/logging.properties	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,18 @@
+############################################################
+#  	Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes.  These handlers will be installed during VM startup.
+#handlers= java.util.logging.ConsoleHandler
+handlers= custom.Handler
+.handlers= custom.DotHandler
+
+# Default global logging level.
+.level= INFO
+
+# Other configuration
+custom.Handler.level=ALL
+custom.DotHandler.level=ALL
+java.util.logging.SimpleFormatter.format=%4$s [%1$tc]: %2$s: %5$s%n
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sun/security/tools/keytool/RealType.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,67 @@
+/*
+ * 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 8192987
+ * @summary keytool should remember real storetype if it is not provided
+ * @library /test/lib
+ * @build jdk.test.lib.SecurityTools
+ *        jdk.test.lib.Utils
+ *        jdk.test.lib.JDKToolFinder
+ *        jdk.test.lib.JDKToolLauncher
+ *        jdk.test.lib.Platform
+ *        jdk.test.lib.process.*
+ * @run main/othervm RealType
+ */
+
+import jdk.test.lib.SecurityTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class RealType {
+
+    public static void main(String[] args) throws Throwable {
+
+        kt("-genkeypair -alias a -dname CN=A -keypass changeit -storetype jks")
+                .shouldHaveExitValue(0);
+
+        // -keypasswd command should be allowed on JKS
+        kt("-keypasswd -alias a -new t0ps3cr3t")
+                .shouldHaveExitValue(0);
+
+        Files.delete(Paths.get("ks"));
+
+        kt("-genkeypair -alias a -dname CN=A -keypass changeit -storetype pkcs12")
+                .shouldHaveExitValue(0);
+
+        // A pkcs12 keystore cannot be loaded as a JCEKS keystore
+        kt("-list -storetype jceks").shouldHaveExitValue(1);
+    }
+
+    static OutputAnalyzer kt(String arg) throws Exception {
+        return SecurityTools.keytool("-debug -keystore ks -storepass changeit " + arg);
+    }
+}
--- a/test/jdk/tools/jlink/ModuleNamesOrderTest.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/jdk/tools/jlink/ModuleNamesOrderTest.java	Fri Dec 08 23:43:25 2017 +0100
@@ -24,14 +24,17 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
 import java.util.Properties;
 import java.util.spi.ToolProvider;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import tests.Helper;
 import tests.JImageGenerator;
+import tests.JImageGenerator.JLinkTask;
 
 /*
  * @test
@@ -44,6 +47,9 @@
  *          jdk.jlink/jdk.tools.jmod
  *          jdk.jlink/jdk.tools.jimage
  *          jdk.compiler
+ *          jdk.scripting.nashorn
+ *          jdk.scripting.nashorn.shell
+ *
  * @build tests.*
  * @run main ModuleNamesOrderTest
  */
@@ -60,12 +66,18 @@
             return;
         }
 
-        Path outputDir = helper.createNewImageDir("image8168925");
-        JImageGenerator.getJLinkTask()
-                .modulePath(helper.defaultModulePath())
-                .output(outputDir)
-                .addMods("jdk.scripting.nashorn")
-                .call().assertSuccess();
+        testDependences(helper);
+        testModulesOrder(helper);
+    }
+
+    private static List<String> modulesProperty(Path outputDir, String modulePath, String... roots)
+        throws IOException
+    {
+        JLinkTask jlinkTask = JImageGenerator.getJLinkTask()
+                                             .modulePath(modulePath)
+                                             .output(outputDir);
+        Stream.of(roots).forEach(jlinkTask::addMods);
+        jlinkTask.call().assertSuccess();
 
         File release = new File(outputDir.toString(), "release");
         if (!release.exists()) {
@@ -81,9 +93,21 @@
         if (!modules.startsWith("\"java.base ")) {
             throw new AssertionError("MODULES should start with 'java.base'");
         }
+        if (modules.charAt(0) != '"' || modules.charAt(modules.length()-1) != '"') {
+            throw new AssertionError("MODULES value should be double quoted");
+        }
 
-        if (!modules.endsWith(" jdk.scripting.nashorn\"")) {
-            throw new AssertionError("MODULES end with 'jdk.scripting.nashorn'");
+        return Stream.of(modules.substring(1, modules.length()-1).split("\\s+"))
+                     .collect(Collectors.toList());
+    }
+
+    private static void testDependences(Helper helper) throws IOException {
+        Path outputDir = helper.createNewImageDir("test");
+        List<String> modules = modulesProperty(outputDir, helper.defaultModulePath(),
+            "jdk.scripting.nashorn");
+        String last = modules.get(modules.size()-1);
+        if (!last.equals("jdk.scripting.nashorn")) {
+            throw new AssertionError("Unexpected MODULES value: " + modules);
         }
 
         checkDependency(modules, "java.logging", "java.base");
@@ -94,7 +118,23 @@
         checkDependency(modules, "jdk.scripting.nashorn", "java.scripting");
     }
 
-    private static void checkDependency(String modules, String fromMod, String toMod) {
+    /*
+     * Verify the MODULES list must be the same for the same module graph
+     */
+    private static void testModulesOrder(Helper helper) throws IOException {
+        Path image1 = helper.createNewImageDir("test1");
+        List<String> modules1 = modulesProperty(image1, helper.defaultModulePath(),
+            "jdk.scripting.nashorn", "jdk.scripting.nashorn.shell");
+        Path image2 = helper.createNewImageDir("test2");
+        List<String> modules2 = modulesProperty(image2, helper.defaultModulePath(),
+            "jdk.scripting.nashorn.shell", "jdk.scripting.nashorn");
+        if (!modules1.equals(modules2)) {
+            throw new AssertionError("MODULES should be a stable order: " +
+                modules1 + " vs " + modules2);
+        }
+    }
+
+    private static void checkDependency(List<String> modules, String fromMod, String toMod) {
         int fromModIdx = modules.indexOf(fromMod);
         if (fromModIdx == -1) {
             throw new AssertionError(fromMod + " is missing in MODULES");
--- a/test/langtools/jdk/javadoc/doclet/testBadPackageFileInJar/TestBadPackageFileInJar.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/jdk/javadoc/doclet/testBadPackageFileInJar/TestBadPackageFileInJar.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -24,27 +24,52 @@
 /*
  * @test
  * @bug 4691095 6306394
- * @summary Test to make sure that Javadoc emits a useful warning
- * when a bad package.html file is in the JAR.
+ * @summary Make sure that Javadoc emits a useful warning
+ *          when a bad package.html exists in a JAR archive.
  * @author jamieh
- * @library ../lib
+ * @library /tools/lib ../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
- * @build JavadocTester
+ * @build JavadocTester toolbox.ToolBox toolbox.JarTask
  * @run main TestBadPackageFileInJar
  */
 
+import toolbox.JarTask;
+import toolbox.Task.Result;
+import toolbox.ToolBox;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
 public class TestBadPackageFileInJar extends JavadocTester {
 
+    final ToolBox tb = new ToolBox();
+
     public static void main(String... args) throws Exception {
         TestBadPackageFileInJar tester = new TestBadPackageFileInJar();
         tester.runTests();
     }
 
     @Test
-    void test() {
+    void test() throws IOException {
+        // create the file
+        Path pkgDir = Paths.get("pkg");
+        tb.createDirectories(pkgDir);
+        Path pkgfilePath = pkgDir.resolve("package.html");
+        tb.writeFile(pkgfilePath, "<html>\n\n</html>");
+
+        // create the jar file
+        Path jarFile = Paths.get("badPackageFileInJar.jar");
+        JarTask jar = new JarTask(tb, "badPackageFileInJar.jar");
+        jar.files(pkgDir.toString()).run();
+
+        // clean up to prevent accidental pick up
+        tb.cleanDirectory(pkgDir);
+        tb.deleteFiles(pkgDir.toString());
+
         javadoc("-d", "out",
                 "-sourcepath", testSrc,
-                "-classpath",  testSrc("badPackageFileInJar.jar"),
+                "-classpath",  jarFile.toString(),
                 "pkg");
         checkExit(Exit.OK);
 
Binary file test/langtools/jdk/javadoc/doclet/testBadPackageFileInJar/badPackageFileInJar.jar has changed
--- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java	Fri Dec 08 23:43:25 2017 +0100
@@ -23,7 +23,8 @@
 
 /*
  * @test
- * @bug      4927552 8026567 8071982 8162674 8175200 8175218 8183511 8186332 8169819 8074407
+ * @bug      4927552 8026567 8071982 8162674 8175200 8175218 8183511 8186332
+ *           8169819 8074407 8191030
  * @summary  test generated docs for deprecated items
  * @author   jamieh
  * @library  ../lib
@@ -257,24 +258,30 @@
                 + "<td class=\"colLast\"></td>\n"
                 + "</tr>\n"
                 + "<tr class=\"rowColor\">\n"
+                + "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestAnnotationType.html#field\">pkg.TestAnnotationType.field</a></th>\n"
+                + "<td class=\"colLast\">\n"
+                + "<div class=\"deprecationComment\">annotation_test4 passes.</div>\n"
+                + "</td>\n"
+                + "</tr>\n"
+                + "<tr class=\"altColor\">\n"
                 + "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestClass.html#field\">pkg.TestClass.field</a></th>\n"
                 + "<td class=\"colLast\">\n"
                 + "<div class=\"deprecationComment\">class_test2 passes. This is the second sentence of deprecated description for a field.</div>\n"
                 + "</td>\n"
                 + "</tr>\n"
-                + "<tr class=\"altColor\">\n"
+                + "<tr class=\"rowColor\">\n"
                 + "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestError.html#field\">pkg.TestError.field</a></th>\n"
                 + "<td class=\"colLast\">\n"
                 + "<div class=\"deprecationComment\">error_test2 passes.</div>\n"
                 + "</td>\n"
                 + "</tr>\n"
-                + "<tr class=\"rowColor\">\n"
+                + "<tr class=\"altColor\">\n"
                 + "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestException.html#field\">pkg.TestException.field</a></th>\n"
                 + "<td class=\"colLast\">\n"
                 + "<div class=\"deprecationComment\">exception_test2 passes.</div>\n"
                 + "</td>\n"
                 + "</tr>\n"
-                + "<tr class=\"altColor\">\n"
+                + "<tr class=\"rowColor\">\n"
                 + "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestInterface.html#field\">pkg.TestInterface.field</a></th>\n"
                 + "<td class=\"colLast\">\n"
                 + "<div class=\"deprecationComment\">interface_test2 passes.</div>\n"
--- a/test/langtools/jdk/javadoc/doclet/testGroupOption/C.java	Fri Dec 08 15:14:08 2017 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2016, 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.
- */
-
-public class C {}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testGroupOption/InUnnamedPackage.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+public class InUnnamedPackage {}
--- a/test/langtools/jdk/javadoc/doclet/testGroupOption/TestGroupOption.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/jdk/javadoc/doclet/testGroupOption/TestGroupOption.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug      4924383
- * @summary  Test to make sure the -group option does not cause a bad warning
- *           to be printed. Test for the group defined using patterns.
+ * @bug      4924383 8149402
+ * @summary  Test to make sure the -group option works correctly
+ *           with the given pattern usages.
  * @author   jamieh
  * @library  ../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
@@ -55,8 +55,7 @@
                 "-group");
     }
 
-    // @Test
-    // @ignore 8149402
+     @Test
     // Make sure the "Other packages" section is printed and the header for empty section is not.
     // Make sure that the headers of group that is defined using patterns are printed.
     void test2() {
@@ -66,7 +65,7 @@
                 "-group", "Group abc*", "abc*",
                 "-group", "Empty group", "qwerty*",
                 "-group", "Group a*", "a*",
-                "pkg1", "pkg2", "pkg3", "abc1",  "abc2", "abc3", "other", testSrc("C.java"));
+                "pkg1", "pkg2", "pkg3", "abc1",  "abc2", "abc3", "other", testSrc("InUnnamedPackage.java"));
         checkExit(Exit.OK);
 
         checkOutput("overview-summary.html", true, "Group pkg*", "Group abc*", "Other Packages");
--- a/test/langtools/jdk/javadoc/doclet/testValueTag/TestValueTag.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/jdk/javadoc/doclet/testValueTag/TestValueTag.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug      4764045 8004825 8026567
+ * @bug      4764045 8004825 8026567 8191030
  * @summary  This test ensures that the value tag works in all
- * use cases. The explainations for each test case are written below.
+ *           use cases, the tests are explained below.
  * @author   jamieh
  * @library ../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
@@ -103,7 +103,7 @@
         );
 
         checkOutput("pkg1/Class1.html", false,
-                //Base case:  using @value on a constant.
+                // Base case:  using @value on a constant.
                 "Result:  <a href=\"../pkg1/Class1.html#TEST_12_ERROR\">\"Test 12 "
                 + "generates an error message\"</a>");
 
@@ -119,23 +119,36 @@
                 "pkg1", "pkg2");
         checkExit(Exit.OK);
         checkOutput(Output.OUT, true,
-                //Test @value warning printed when used with non-constant.
+                // Test @value warning printed when used with non-constant.
                 "warning - @value tag (which references nonConstant) "
                 + "can only be used in constants.",
                 "warning - @value tag (which references NULL) "
                 + "can only be used in constants.",
                 "warning - @value tag (which references TEST_12_ERROR) "
-                + "can only be used in constants."
-// TODO: re-examine these.
-//                //Test warning printed for bad reference.
-//                "warning - UnknownClass#unknownConstant (referenced by "
-//                + "@value tag) is an unknown reference.",
-//                //Test warning printed for invalid use of @value.
-//                "warning - @value tag cannot be used here."
+                + "can only be used in constants.",
+                // Test warning printed for bad reference.
+                "warning - {@value UnknownClass#unknownConstant}"
+                + " (referenced by @value tag) is an unknown reference."
         );
         checkForException();
     }
 
+    @Test()
+    void test3() {
+        javadoc("-d", "out3",
+                "-sourcepath", testSrc,
+                "pkg2", "pkg3");
+        checkExit(Exit.OK);
+
+        checkOrder("pkg3/RT.html",
+                "The value is <a href=\"../pkg3/RT.html#CONSTANT\">\"constant\"</a>.",
+                "The value1 is <a href=\"../pkg3/RT.html#CONSTANT\">\"constant\"</a>.",
+                "The value2 is <a href=\"../pkg3/RT.html#CONSTANT\">\"constant\"</a>.",
+                "The value3 is <a href=\"../pkg2/Class3.html#TEST_12_PASSES\">"
+                + "\"Test 12 passes\"</a>.");
+    }
+
+
     void checkForException() {
         checkOutput(Output.STDERR, false, "DocletAbortException");
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testValueTag/pkg3/RT.java	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,56 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package pkg3;
+
+public @interface RT {
+
+    /** The CONSTANT */
+    static String CONSTANT = "constant";
+    /**
+     *  The value is {@value CONSTANT}.
+     *  @return a value
+     */
+     int value();
+
+    /**
+     *  The value1 is {@value #CONSTANT}.
+     *  @return a value
+     */
+    int value1();
+
+    /**
+     *  The value2 is {@value pkg3.RT#CONSTANT}.
+     *  @return a value
+     */
+     int value2();
+
+    /**
+     *  The value3 is {@value pkg2.Class3#TEST_12_PASSES}.
+     *  @return a value
+     */
+    int value3();
+
+}
--- a/test/langtools/jdk/jshell/ClassesTest.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/jdk/jshell/ClassesTest.java	Fri Dec 08 23:43:25 2017 +0100
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8145239 8129559 8080354
+ * @bug 8145239 8129559 8080354 8189248
  * @summary Tests for EvaluationState.classes
  * @build KullaTesting TestingInputStream ExpectedDiagnostic
  * @run testng ClassesTest
@@ -41,6 +41,7 @@
 import org.testng.annotations.Test;
 
 import jdk.jshell.Diag;
+import jdk.jshell.Snippet.Status;
 import static java.util.stream.Collectors.toList;
 import static jdk.jshell.Snippet.Status.VALID;
 import static jdk.jshell.Snippet.Status.RECOVERABLE_NOT_DEFINED;
@@ -327,4 +328,24 @@
         VarSnippet variableKey = varKey(assertEval("a.x;"));
         assertEquals(variableKey.typeName(), "A.I1");
     }
+
+    public void testCircular() {
+        assertEval("import java.util.function.Supplier;");
+        TypeDeclSnippet aClass =
+                classKey(assertEval("public class A<T> {\n" +
+                                    "  private class SomeClass {}\n" +
+                                    "  public Supplier<T> m() {\n" +
+                                    "    return new B<>(this);\n" +
+                                    "  }\n" +
+                                    "}",
+                                   added(RECOVERABLE_DEFINED)));
+        assertEval("public class B<T> implements Supplier<T> {\n" +
+                   "  public B(A<T> a) {}\n" +
+                   "  public T get() {return null;}\n" +
+                   "}",
+                   added(VALID),
+                   ste(aClass, Status.RECOVERABLE_DEFINED, Status.VALID, true, null));
+        assertEval("new A()");
+    }
+
 }
--- a/test/langtools/tools/javac/T5090006/AssertionFailureTest.java	Fri Dec 08 15:14:08 2017 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2013, 2016, 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 5090006
- * @summary javac fails with assertion error
- * @library /tools/lib
- * @modules jdk.compiler/com.sun.tools.javac.api
- *          jdk.compiler/com.sun.tools.javac.main
- *          jdk.jdeps/com.sun.tools.javap
- * @build toolbox.ToolBox toolbox.JavacTask
- * @run main AssertionFailureTest
- */
-
-import java.io.File;
-import java.nio.file.Paths;
-
-import toolbox.JavacTask;
-import toolbox.ToolBox;
-
-// Original test: test/tools/javac/T5090006/compiler.sh
-public class AssertionFailureTest {
-
-    private static final String testSrc =
-        "import stub_tie_gen.wsdl_hello_lit.client.*;\n" +
-        "import junit.framework.*;\n" +
-        "import testutil.ClientServerTestUtil;\n" +
-        "\n" +
-        "public class Test {\n" +
-        "\n" +
-        "    void getStub() throws Exception {\n" +
-        "        Hello_PortType_Stub x = null;\n" +
-        "        new ClientServerTestUtil().setTransport(x, null, null, null);\n" +
-        "    }\n" +
-        "\n" +
-        "    public static void main(String[] args) {\n" +
-        "        System.out.println(\"FISK\");\n" +
-        "    }\n" +
-        "}";
-
-    public static void main(String args[]) throws Exception {
-        ToolBox tb = new ToolBox();
-        String classpath = Paths.get(tb.testSrc, "broken.jar")
-                + File.pathSeparator
-                + ".";
-        new JavacTask(tb)
-                .classpath(classpath)
-                .sources(testSrc)
-                .run();
-    }
-
-}
Binary file test/langtools/tools/javac/T5090006/broken.jar has changed
--- a/test/langtools/tools/javac/lib/JavacTestingAbstractProcessor.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/langtools/tools/javac/lib/JavacTestingAbstractProcessor.java	Fri Dec 08 23:43:25 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -31,13 +31,7 @@
  * An abstract annotation processor tailored to {@code javac} regression testing.
  */
 public abstract class JavacTestingAbstractProcessor extends AbstractProcessor {
-    private static final Set<String> allAnnotations;
-
-    static {
-        Set<String> tmp = new HashSet<>();
-        tmp.add("*");
-        allAnnotations = Collections.unmodifiableSet(tmp);
-    }
+    private static final Set<String> allAnnotations = Set.of("*");
 
     protected Elements eltUtils;
     protected Elements elements;
@@ -116,7 +110,7 @@
      * corresponding platform visitor type.
      */
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static abstract class AbstractAnnotationValueVisitor<R, P> extends AbstractAnnotationValueVisitor9<R, P> {
 
         /**
@@ -127,7 +121,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static abstract class AbstractElementVisitor<R, P> extends AbstractElementVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses to call.
@@ -137,7 +131,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static abstract class AbstractTypeVisitor<R, P> extends AbstractTypeVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses to call.
@@ -147,7 +141,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class ElementKindVisitor<R, P> extends ElementKindVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses; uses {@code null} for the
@@ -168,7 +162,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class ElementScanner<R, P> extends ElementScanner9<R, P> {
         /**
          * Constructor for concrete subclasses; uses {@code null} for the
@@ -187,7 +181,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class SimpleAnnotationValueVisitor<R, P> extends SimpleAnnotationValueVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses; uses {@code null} for the
@@ -208,7 +202,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class SimpleElementVisitor<R, P> extends SimpleElementVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses; uses {@code null} for the
@@ -229,7 +223,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class SimpleTypeVisitor<R, P> extends SimpleTypeVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses; uses {@code null} for the
@@ -250,7 +244,7 @@
         }
     }
 
-    @SupportedSourceVersion(RELEASE_9)
+    @SupportedSourceVersion(RELEASE_10)
     public static class TypeKindVisitor<R, P> extends TypeKindVisitor9<R, P> {
         /**
          * Constructor for concrete subclasses to call; uses {@code null}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/nashorn/script/nosecurity/JDK-8193137.js	Fri Dec 08 23:43:25 2017 +0100
@@ -0,0 +1,59 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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-8193137 : Nashorn crashes when given an empty script file.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+var System = java.lang.System;
+var File = java.io.File;
+var javahome = System.getProperty("java.home");
+var nashornJar = new File(System.getProperty("nashorn.jar"));
+if (! nashornJar.isAbsolute()) {
+    nashornJar = new File(".", nashornJar);
+}
+
+// we want to use nashorn.jar passed and not the one that comes with JRE
+var jjsCmd = javahome + "/../bin/jjs";
+jjsCmd = jjsCmd.toString().replace(/\//g, File.separator);
+if (! new File(jjsCmd).isFile()) {
+    jjsCmd = javahome + "/bin/jjs";
+    jjsCmd = jjsCmd.toString().replace(/\//g, File.separator);
+}
+jjsCmd += " -J--patch-module=jdk.scripting.nashorn=" + nashornJar;
+
+$ENV.PWD=System.getProperty("user.dir")
+
+var emptyFile = new File($ENV.PWD+File.separator+"empty.js");
+emptyFile.createNewFile();
+emptyFile.deleteOnExit();
+
+$EXEC(jjsCmd + " empty.js");
+if($ERR != "")
+    fail("jjs fails with empty script file");
--- a/test/nashorn/src/jdk/dynalink/beans/test/BeanLinkerTest.java	Fri Dec 08 15:14:08 2017 -0800
+++ b/test/nashorn/src/jdk/dynalink/beans/test/BeanLinkerTest.java	Fri Dec 08 23:43:25 2017 +0100
@@ -243,13 +243,56 @@
         Assert.assertEquals((int) cs.getTarget().invoke(list, 1), (int) list.get(1));
         Assert.assertEquals((int) cs.getTarget().invoke(list, 2), (int) list.get(2));
         try {
-            final int x = (int) cs.getTarget().invoke(list, -1);
+            cs.getTarget().invoke(list, -1);
             throw new RuntimeException("expected IndexOutOfBoundsException");
         } catch (final IndexOutOfBoundsException ex) {
         }
 
         try {
-            final int x = (int) cs.getTarget().invoke(list, list.size());
+            cs.getTarget().invoke(list, list.size());
+            throw new RuntimeException("expected IndexOutOfBoundsException");
+        } catch (final IndexOutOfBoundsException ex) {
+        }
+    }
+
+    private Object invokeWithFixedKey(boolean publicLookup, Operation op, Object name, MethodType mt, Object... args) throws Throwable {
+        return createCallSite(publicLookup, op.named(name), mt).getTarget().invokeWithArguments(args);
+    }
+
+    @Test(dataProvider = "flags")
+    public void getElementWithFixedKeyTest(final boolean publicLookup) throws Throwable {
+        final MethodType mt = MethodType.methodType(int.class, Object.class);
+
+        final int[] arr = {23, 42};
+        Assert.assertEquals((int) invokeWithFixedKey(publicLookup, GET_ELEMENT, 0, mt, arr), 23);
+        Assert.assertEquals((int) invokeWithFixedKey(publicLookup, GET_ELEMENT, 1, mt, arr), 42);
+        try {
+            invokeWithFixedKey(publicLookup, GET_ELEMENT, -1, mt, arr);
+            throw new RuntimeException("expected ArrayIndexOutOfBoundsException");
+        } catch (final ArrayIndexOutOfBoundsException ex) {
+        }
+
+        try {
+            invokeWithFixedKey(publicLookup, GET_ELEMENT, arr.length, mt, arr);
+            throw new RuntimeException("expected ArrayIndexOutOfBoundsException");
+        } catch (final ArrayIndexOutOfBoundsException ex) {
+        }
+
+        final List<Integer> list = new ArrayList<>();
+        list.add(23);
+        list.add(430);
+        list.add(-4354);
+        for (int i = 0; i < 3; ++i) {
+            Assert.assertEquals((int) invokeWithFixedKey(publicLookup, GET_ELEMENT, i, mt, list), (int) list.get(i));
+        }
+        try {
+            invokeWithFixedKey(publicLookup, GET_ELEMENT, -1, mt, list);
+            throw new RuntimeException("expected IndexOutOfBoundsException");
+        } catch (final IndexOutOfBoundsException ex) {
+        }
+
+        try {
+            invokeWithFixedKey(publicLookup, GET_ELEMENT, list.size(), mt, list);
             throw new RuntimeException("expected IndexOutOfBoundsException");
         } catch (final IndexOutOfBoundsException ex) {
         }
@@ -286,7 +329,9 @@
         cs.getTarget().invoke(list, 0, -list.get(0));
         Assert.assertEquals((int) list.get(0), -23);
         cs.getTarget().invoke(list, 1, -430);
+        Assert.assertEquals((int) list.get(1), -430);
         cs.getTarget().invoke(list, 2, 4354);
+        Assert.assertEquals((int) list.get(2), 4354);
         try {
             cs.getTarget().invoke(list, -1, 343);
             throw new RuntimeException("expected IndexOutOfBoundsException");
@@ -301,6 +346,52 @@
     }
 
     @Test(dataProvider = "flags")
+    public void setElementWithFixedKeyTest(final boolean publicLookup) throws Throwable {
+        final MethodType mt = MethodType.methodType(void.class, Object.class, int.class);
+
+        final int[] arr = {23, 42};
+        invokeWithFixedKey(publicLookup, SET_ELEMENT, 0, mt, arr, 0);
+        Assert.assertEquals(arr[0], 0);
+        invokeWithFixedKey(publicLookup, SET_ELEMENT, 1, mt, arr, -5);
+        Assert.assertEquals(arr[1], -5);
+
+        try {
+            invokeWithFixedKey(publicLookup, SET_ELEMENT, -1, mt, arr, 12);
+            throw new RuntimeException("expected ArrayIndexOutOfBoundsException");
+        } catch (final ArrayIndexOutOfBoundsException ex) {
+        }
+
+        try {
+            invokeWithFixedKey(publicLookup, SET_ELEMENT, arr.length, mt, arr, 20);
+            throw new RuntimeException("expected ArrayIndexOutOfBoundsException");
+        } catch (final ArrayIndexOutOfBoundsException ex) {
+        }
+
+        final List<Integer> list = new ArrayList<>();
+        list.add(23);
+        list.add(430);
+        list.add(-4354);
+
+        invokeWithFixedKey(publicLookup, SET_ELEMENT, 0, mt, list, -list.get(0));
+        Assert.assertEquals((int) list.get(0), -23);
+        invokeWithFixedKey(publicLookup, SET_ELEMENT, 1, mt, list, -430);
+        Assert.assertEquals((int) list.get(1), -430);
+        invokeWithFixedKey(publicLookup, SET_ELEMENT, 2, mt, list, 4354);
+        Assert.assertEquals((int) list.get(2), 4354);
+        try {
+            invokeWithFixedKey(publicLookup, SET_ELEMENT, -1, mt, list, 343);
+            throw new RuntimeException("expected IndexOutOfBoundsException");
+        } catch (final IndexOutOfBoundsException ex) {
+        }
+
+        try {
+            invokeWithFixedKey(publicLookup, SET_ELEMENT, list.size(), mt, list, 43543);
+            throw new RuntimeException("expected IndexOutOfBoundsException");
+        } catch (final IndexOutOfBoundsException ex) {
+        }
+    }
+
+    @Test(dataProvider = "flags")
     public void newObjectTest(final boolean publicLookup) {
         final MethodType mt = MethodType.methodType(Object.class, Object.class);
         final CallSite cs = createCallSite(publicLookup, NEW, mt);