changeset 18317:c83efc00f6cc

made LocationIdentity values support .equals() instead of identity (i.e. '==') for equality comparisons (and as hash map keys)
author Doug Simon <doug.simon@oracle.com>
date Mon, 10 Nov 2014 17:14:06 +0100
parents a1dca8b28839
children 0459da9d94c0 13273385abb5
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LocationIdentity.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NamedLocationIdentity.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/ObjectLocationIdentity.java
diffstat 4 files changed, 33 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LocationIdentity.java	Mon Nov 10 16:49:41 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/LocationIdentity.java	Mon Nov 10 17:14:06 2014 +0100
@@ -22,10 +22,16 @@
  */
 package com.oracle.graal.api.meta;
 
+import java.util.*;
+
 /**
  * Marker interface for location identities. Apart from the special values {@link #ANY_LOCATION} and
  * {@link #FINAL_LOCATION}, a different location identity of two memory accesses guarantees that the
  * two accesses do not interfere.
+ *
+ * Clients of {@link LocationIdentity} must use {@link #equals(Object)}, not {@code ==}, when
+ * comparing two {@link LocationIdentity} values for equality. Likewise, they must not use
+ * {@link IdentityHashMap}s with {@link LocationIdentity} values as keys.
  */
 public interface LocationIdentity {
 
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NamedLocationIdentity.java	Mon Nov 10 16:49:41 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NamedLocationIdentity.java	Mon Nov 10 17:14:06 2014 +0100
@@ -30,22 +30,17 @@
 public final class NamedLocationIdentity implements LocationIdentity {
 
     /**
-     * Canonicalizing map for {@link NamedLocationIdentity} instances. This is in a separate class
-     * to work around class initialization issues.
+     * Map for asserting all {@link NamedLocationIdentity} instances have a unique name.
      */
     static class DB {
         private static final HashMap<String, NamedLocationIdentity> map = new HashMap<>();
 
-        static synchronized NamedLocationIdentity register(NamedLocationIdentity identity) {
+        static boolean checkUnique(NamedLocationIdentity identity) {
             NamedLocationIdentity oldValue = map.put(identity.name, identity);
             if (oldValue != null) {
-                throw new IllegalArgumentException("identity " + identity + " already exists");
+                throw new AssertionError("identity " + identity + " already exists");
             }
-            return identity;
-        }
-
-        static synchronized NamedLocationIdentity lookup(String name) {
-            return map.get(name);
+            return true;
         }
     }
 
@@ -86,14 +81,9 @@
      * @param immutable true if the location is immutable
      */
     private static NamedLocationIdentity create(String name, boolean immutable) {
-        return DB.register(new NamedLocationIdentity(name, immutable));
-    }
-
-    /**
-     * Gets the unique {@link NamedLocationIdentity} (if any) for a given name.
-     */
-    public static NamedLocationIdentity lookup(String name) {
-        return DB.lookup(name);
+        NamedLocationIdentity id = new NamedLocationIdentity(name, immutable);
+        assert DB.checkUnique(id);
+        return id;
     }
 
     @Override
@@ -108,7 +98,9 @@
         }
         if (obj instanceof NamedLocationIdentity) {
             NamedLocationIdentity that = (NamedLocationIdentity) obj;
-            return this.name.equals(that.name);
+            boolean res = this.name.equals(that.name);
+            assert !res || this.immutable == that.immutable;
+            return res;
         }
         return false;
     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java	Mon Nov 10 16:49:41 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java	Mon Nov 10 17:14:06 2014 +0100
@@ -52,16 +52,16 @@
         private final Map<LocationIdentity, MemoryNode> lastMemorySnapshot;
 
         public MemoryMapImpl(MemoryMapImpl memoryMap) {
-            lastMemorySnapshot = newIdentityMap(memoryMap.lastMemorySnapshot);
+            lastMemorySnapshot = new HashMap<>(memoryMap.lastMemorySnapshot);
         }
 
         public MemoryMapImpl(StartNode start) {
-            lastMemorySnapshot = newIdentityMap();
+            lastMemorySnapshot = new HashMap<>();
             lastMemorySnapshot.put(ANY_LOCATION, start);
         }
 
         public MemoryMapImpl() {
-            lastMemorySnapshot = newIdentityMap();
+            lastMemorySnapshot = new HashMap<>();
         }
 
         @Override
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/ObjectLocationIdentity.java	Mon Nov 10 16:49:41 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/ObjectLocationIdentity.java	Mon Nov 10 17:14:06 2014 +0100
@@ -31,21 +31,25 @@
  */
 public final class ObjectLocationIdentity implements LocationIdentity {
 
-    private static HashMap<JavaConstant, LocationIdentity> map = new HashMap<>();
-
     private JavaConstant object;
 
     public static LocationIdentity create(JavaConstant object) {
         assert object.getKind() == Kind.Object && object.isNonNull();
-        synchronized (map) {
-            if (map.containsKey(object)) {
-                return map.get(object);
-            } else {
-                ObjectLocationIdentity locationIdentity = new ObjectLocationIdentity(object);
-                map.put(object, locationIdentity);
-                return locationIdentity;
-            }
+        return new ObjectLocationIdentity(object);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof ObjectLocationIdentity) {
+            ObjectLocationIdentity that = (ObjectLocationIdentity) obj;
+            return Objects.equals(that.object, this.object);
         }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return object.hashCode();
     }
 
     private ObjectLocationIdentity(JavaConstant object) {