diff jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantPool.java @ 24100:839dcc4f2cf6 jvmci-0.24

handle signature polymorphic methods correctly (JDK-8161550)
author Doug Simon <doug.simon@oracle.com>
date Wed, 08 Feb 2017 23:49:32 +0100
parents 9a740aa0d87b
children
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantPool.java	Wed Feb 08 23:25:01 2017 +0100
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantPool.java	Wed Feb 08 23:49:32 2017 +0100
@@ -715,16 +715,20 @@
 
     }
 
-    static class Lazy {
-        static final String[] signaturePolymorphicHolders = compilerToVM().getSignaturePolymorphicHolders();
-    }
+    // Lazily initialized.
+    private static String[] signaturePolymorphicHolders;
 
     /**
      * Determines if {@code type} contains signature polymorphic methods.
      */
-    private static boolean isSignaturePolymorphicHolder(final HotSpotResolvedObjectTypeImpl type) {
+    @SuppressFBWarnings(value = "LI_LAZY_INIT_STATIC", justification = "signaturePolymorphicHolders is a cache, not a singleton that must be constructed exactly once" +
+                    "and compiler re-ordering is not an issue due to the VM call")
+    static boolean isSignaturePolymorphicHolder(final ResolvedJavaType type) {
         String name = type.getName();
-        for (String holder : Lazy.signaturePolymorphicHolders) {
+        if (signaturePolymorphicHolders == null) {
+            signaturePolymorphicHolders = compilerToVM().getSignaturePolymorphicHolders();
+        }
+        for (String holder : signaturePolymorphicHolders) {
             if (name.equals(holder)) {
                 return true;
             }