Index: main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java (working copy) @@ -29,4 +29,23 @@ return new ClassFileEntry[] { className, nameAndType }; } + + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + className.hashCode(); + result = PRIME * result + nameAndType.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + } Index: main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java (working copy) @@ -54,16 +54,26 @@ return "FieldRef: " + className + "#" + nameAndType; } - public int hashCode() { + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; final int PRIME = 31; int result = 1; result = PRIME * result + ((className == null) ? 0 : className.hashCode()); result = PRIME * result + ((nameAndType == null) ? 0 : nameAndType.hashCode()); - return result; + cachedHashCode = result; } - + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + public boolean equals(Object obj) { if (this == obj) return true; Index: main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java (working copy) @@ -40,6 +40,7 @@ if (utf8 == null) { throw new NullPointerException("Null arguments are not allowed"); } + } public CPUTF8(String string) { @@ -57,10 +58,20 @@ return utf8.equals(other.utf8); } - public int hashCode() { + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; final int PRIME = 31; - return PRIME + utf8.hashCode(); + cachedHashCode = PRIME + utf8.hashCode(); } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } public String toString() { return "UTF8: " + utf8; Index: main/java/org/apache/harmony/unpack200/bytecode/CPClass.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPClass.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPClass.java (working copy) @@ -60,9 +60,19 @@ protected ClassFileEntry[] getNestedClassFileEntries() { return new ClassFileEntry[] { utf8, }; } - + + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + cachedHashCode = utf8.hashCode(); + } + public int hashCode() { - return utf8.hashCode(); + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; } protected void resolve(ClassConstantPool pool) { Index: main/java/org/apache/harmony/unpack200/bytecode/CPString.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPString.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPString.java (working copy) @@ -53,4 +53,21 @@ protected ClassFileEntry[] getNestedClassFileEntries() { return new ClassFileEntry[] { name }; } + + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + name.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } } \ No newline at end of file Index: main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java (working copy) @@ -104,15 +104,19 @@ return getByteCodeForm().getOperandType(); } + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + cachedHashCode = objectHashCode(); + } + public int hashCode() { - final int prime = 41; - int result = 1; - result = prime * result + getName().hashCode() + getByteCodeForm().hashCode(); - // Don't forget to take the operands = rewrite into account - result += (prime * rewrite.hashCode()); - return result; + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; } - + /* * (non-Javadoc) * Index: main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java (working copy) @@ -30,5 +30,23 @@ public String toString() { return "Method: " + name + "(" + descriptor + ")"; } + + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + name.hashCode(); + result = PRIME * result + descriptor.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } } Index: main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java (working copy) @@ -32,4 +32,23 @@ public int invokeInterfaceCount() { return nameAndType.invokeInterfaceCount(); } + + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + className.hashCode(); + result = PRIME * result + nameAndType.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + } Index: main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java (working copy) @@ -50,6 +50,10 @@ return resolved; } + protected int objectHashCode() { + return super.hashCode(); + } + public abstract String toString(); public final void write(DataOutputStream dos) throws IOException { Index: main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java =================================================================== --- main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java (revision 676705) +++ main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java (working copy) @@ -76,13 +76,23 @@ return "NameAndType: " + name + "(" + descriptor + ")"; } - public int hashCode() { + private boolean hashcodeComputed = false; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; final int PRIME = 31; int result = 1; result = PRIME * result + descriptor.hashCode(); result = PRIME * result + name.hashCode(); - return result; + cachedHashCode = result; } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } public boolean equals(Object obj) { if (this == obj)