1.1 --- a/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java Wed Aug 20 10:25:28 2014 +0200 1.2 +++ b/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java Wed Aug 20 10:26:01 2014 +0200 1.3 @@ -86,6 +86,7 @@ 1.4 import java.lang.invoke.MethodHandles; 1.5 import java.lang.invoke.MethodHandles.Lookup; 1.6 import java.lang.invoke.MethodType; 1.7 +import java.lang.ref.Reference; 1.8 import java.lang.ref.WeakReference; 1.9 import java.util.Arrays; 1.10 import java.util.Collections; 1.11 @@ -103,7 +104,7 @@ 1.12 * @author Attila Szegedi 1.13 */ 1.14 public class CallSiteDescriptorFactory { 1.15 - private static final WeakHashMap<CallSiteDescriptor, WeakReference<CallSiteDescriptor>> publicDescs = 1.16 + private static final WeakHashMap<CallSiteDescriptor, Reference<CallSiteDescriptor>> publicDescs = 1.17 new WeakHashMap<>(); 1.18 1.19 1.20 @@ -134,18 +135,27 @@ 1.21 1.22 static CallSiteDescriptor getCanonicalPublicDescriptor(final CallSiteDescriptor desc) { 1.23 synchronized(publicDescs) { 1.24 - final WeakReference<CallSiteDescriptor> ref = publicDescs.get(desc); 1.25 + final Reference<CallSiteDescriptor> ref = publicDescs.get(desc); 1.26 if(ref != null) { 1.27 final CallSiteDescriptor canonical = ref.get(); 1.28 if(canonical != null) { 1.29 return canonical; 1.30 } 1.31 } 1.32 - publicDescs.put(desc, new WeakReference<>(desc)); 1.33 + publicDescs.put(desc, createReference(desc)); 1.34 } 1.35 return desc; 1.36 } 1.37 1.38 + /** 1.39 + * Override this to use a different kind of references for the cache 1.40 + * @param desc desc 1.41 + * @return reference 1.42 + */ 1.43 + protected static Reference<CallSiteDescriptor> createReference(final CallSiteDescriptor desc) { 1.44 + return new WeakReference<>(desc); 1.45 + } 1.46 + 1.47 private static CallSiteDescriptor createPublicCallSiteDescriptor(final String[] tokenizedName, final MethodType methodType) { 1.48 final int l = tokenizedName.length; 1.49 if(l > 0 && tokenizedName[0] == "dyn") {