Mercurial > hg > graal-jvmci-8
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) {