src/jdk/nashorn/internal/codegen/ConstantData.java

Print this page
rev 755 : 8035948: Redesign property listeners for shared classes
Reviewed-by: sundar, lagergren

*** 23,32 **** --- 23,35 ---- * questions. */ package jdk.nashorn.internal.codegen; + import jdk.nashorn.internal.runtime.Property; + import jdk.nashorn.internal.runtime.PropertyMap; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;
*** 108,117 **** --- 111,157 ---- return hashCode; } } /** + * {@link PropertyMap} wrapper class that provides implementations for the {@code hashCode} and {@code equals} + * methods that are based on the map layout. {@code PropertyMap} itself inherits the identity based implementations + * from {@code java.lang.Object}. + */ + private static class PropertyMapWrapper { + private final PropertyMap propertyMap; + private final int hashCode; + + public PropertyMapWrapper(final PropertyMap map) { + int hash = 0; + for (final Property property : map.getProperties()) { + hash = hash << 7 ^ hash >> 7; + hash ^= property.hashCode(); + } + this.hashCode = hash; + this.propertyMap = map; + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(final Object other) { + if (!(other instanceof PropertyMapWrapper)) { + return false; + } + + final Property[] ownProperties = propertyMap.getProperties(); + final Property[] otherProperties = ((PropertyMapWrapper) other).propertyMap.getProperties(); + + return Arrays.equals(ownProperties, otherProperties); + } + } + + /** * Constructor */ ConstantData() { this.constants = new ArrayList<>(); this.stringMap = new HashMap<>();
*** 143,153 **** * * @param object the string to add * @return the index in the constant pool that the object was given */ public int add(final Object object) { ! final Object entry = object.getClass().isArray() ? new ArrayWrapper(object) : object; final Integer value = objectMap.get(entry); if (value != null) { return value.intValue(); } --- 183,200 ---- * * @param object the string to add * @return the index in the constant pool that the object was given */ public int add(final Object object) { ! final Object entry; ! if (object.getClass().isArray()) { ! entry = new ArrayWrapper(object); ! } else if (object instanceof PropertyMap) { ! entry = new PropertyMapWrapper((PropertyMap) object); ! } else { ! entry = object; ! } final Integer value = objectMap.get(entry); if (value != null) { return value.intValue(); }