diff options
Diffstat (limited to 'tests/bugs/StackError.java')
-rw-r--r-- | tests/bugs/StackError.java | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/bugs/StackError.java b/tests/bugs/StackError.java new file mode 100644 index 000000000..2b3a04a09 --- /dev/null +++ b/tests/bugs/StackError.java @@ -0,0 +1,46 @@ +import java.lang.reflect.Method; + +public class StackError { + public static void main(String args[]) { + new StackError().testEqualsNull(); + } + + void assertTrue(String msg, boolean b) {} + + public void testEqualsNull() { + StackError one = new StackError(); + StackError two = new StackError(); + assertTrue("equal", one.equals(two)); // does not work + //boolean yes = one.equals(two); // works + } + + public boolean equals(Object other) { + return true; + } +} + +aspect EqualsContract { + pointcut equalsCall(Object thisOne, Object otherOne): + target(Object+) && + + target(thisOne) && + call(public boolean equals(Object+)) && + args(otherOne) && + !within(EqualsContract); + + boolean around(Object thisOne, Object otherOne): + equalsCall(thisOne, otherOne) { + boolean result = proceed(thisOne, otherOne); + Class cls = thisOne.getClass(); + String name = cls.getName(); + boolean hasHashCode = false; + try { + Method m = cls.getDeclaredMethod("hashCode", null); + String lookFor = "public int " + name + ".hashCode()"; + hasHashCode = lookFor.equals(m.toString()); + } + catch (NoSuchMethodException nsme) { + } + return result; + } +} |