[lworld] RFR: 8237073: [lworld] Need special handling of jlO constructor invocation

Mandy Chung mchung at openjdk.java.net
Fri Jul 16 00:31:33 UTC 2021


On Thu, 15 Jul 2021 12:11:15 GMT, Srikanth Adayapalam <sadayapalam at openjdk.org> wrote:

> Translate new Object() instantiations down to invovations of java.util.Objects.newIdentity() call with an informational message at compie time

For `src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java`, I suggest to replace it with a specific class like this:


diff --git a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
index b3c149492ac..a0707150cfa 100644
--- a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
+++ b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
@@ -152,12 +152,14 @@ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesDat
         return new IllegalArgumentException(message, cause);
     }
 
-    private static final Function<Object, Object> CREATE_RESERVATION = new Function<>() {
-        @Override
-        public Object apply(Object key) {
-            return new Object();
-        }
-    };
+    static class CacheHolder {
+        static final Function<Object, Object> CREATE = new Function<>() {
+            @Override
+            public Object apply(Object key) {
+                return new CacheHolder();
+            }
+        };
+    }
 
     public final S findSpecies(K key) {
         // Note:  Species instantiation may throw VirtualMachineError because of
@@ -180,12 +182,12 @@ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesDat
         // concrete class if ever.
         // The concrete class is published via SpeciesData instance
         // returned here only after the class and species data are linked together.
-        Object speciesDataOrReservation = cache.computeIfAbsent(key, CREATE_RESERVATION);
+        Object speciesDataOrReservation = cache.computeIfAbsent(key, CacheHolder.CREATE);
         // Separating the creation of a placeholder SpeciesData instance above
         // from the loading and linking a real one below ensures we can never
         // accidentally call computeIfAbsent recursively.
         S speciesData;
-        if (speciesDataOrReservation.getClass() == Object.class) {
+        if (speciesDataOrReservation.getClass() == CacheHolder.class) {
             synchronized (speciesDataOrReservation) {
                 Object existingSpeciesData = cache.get(key);
                 if (existingSpeciesData == speciesDataOrReservation) { // won the race

-------------

PR: https://git.openjdk.java.net/valhalla/pull/481



More information about the valhalla-dev mailing list