I'm checking this in. This fixes PR 23890. Neither Calendar.equals nor GregorianCalendar.equals were doing the correct checks (the 1.5 javadoc is more complete here...).
Tom 2005-10-01 Tom Tromey <[EMAIL PROTECTED]> PR classpath/23890: * java/util/Calendar.java (equals): Include other calendar attributes. (hashCode): Updated. * java/util/GregorianCalendar.java (hashCode): New method. (equals): Use super.equals(). Index: java/util/Calendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Calendar.java,v retrieving revision 1.46 diff -u -r1.46 Calendar.java --- java/util/Calendar.java 5 Jul 2005 10:28:03 -0000 1.46 +++ java/util/Calendar.java 1 Oct 2005 19:37:31 -0000 @@ -914,8 +914,19 @@ */ public boolean equals(Object o) { - return (o instanceof Calendar) - && getTimeInMillis() == ((Calendar) o).getTimeInMillis(); + if (! (o instanceof Calendar)) + return false; + Calendar cal = (Calendar) o; + if (getTimeInMillis() == ((Calendar) o).getTimeInMillis() + && cal.getFirstDayOfWeek() == getFirstDayOfWeek() + && cal.isLenient() == isLenient() + && cal.getMinimalDaysInFirstWeek() == getMinimalDaysInFirstWeek()) + { + TimeZone self = getTimeZone(); + TimeZone oth = cal.getTimeZone(); + return self == null ? oth == null : self.equals(oth); + } + return false; } /** @@ -926,7 +937,13 @@ public int hashCode() { long time = getTimeInMillis(); - return (int) ((time & 0xffffffffL) ^ (time >> 32)); + int val = (int) ((time & 0xffffffffL) ^ (time >> 32)); + val += (getFirstDayOfWeek() + (isLenient() ? 1230 : 1237) + + getMinimalDaysInFirstWeek()); + TimeZone self = getTimeZone(); + if (self != null) + val ^= self.hashCode(); + return val; } /** Index: java/util/GregorianCalendar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/GregorianCalendar.java,v retrieving revision 1.42 diff -u -r1.42 GregorianCalendar.java --- java/util/GregorianCalendar.java 2 Jul 2005 20:32:42 -0000 1.42 +++ java/util/GregorianCalendar.java 1 Oct 2005 19:37:31 -0000 @@ -868,6 +868,17 @@ areFieldsSet = isSet[ERA] = isSet[YEAR] = isSet[MONTH] = isSet[WEEK_OF_YEAR] = isSet[WEEK_OF_MONTH] = isSet[DAY_OF_MONTH] = isSet[DAY_OF_YEAR] = isSet[DAY_OF_WEEK] = isSet[DAY_OF_WEEK_IN_MONTH] = isSet[AM_PM] = isSet[HOUR] = isSet[HOUR_OF_DAY] = isSet[MINUTE] = isSet[SECOND] = isSet[MILLISECOND] = isSet[ZONE_OFFSET] = isSet[DST_OFFSET] = true; } + + /** + * Return a hash code for this object, following the general contract + * specified by [EMAIL PROTECTED] Object#hashCode()}. + * @return the hash code + */ + public int hashCode() + { + int val = (int) ((gregorianCutover >>> 32) ^ (gregorianCutover & 0xffffffff)); + return super.hashCode() ^ val; + } /** * Compares the given calendar with this. An object, o, is @@ -890,7 +901,8 @@ return false; GregorianCalendar cal = (GregorianCalendar) o; - return (cal.getTimeInMillis() == getTimeInMillis()); + return (cal.gregorianCutover == gregorianCutover + && super.equals(o)); } /** _______________________________________________ Classpath-patches mailing list Classpath-patches@gnu.org http://lists.gnu.org/mailman/listinfo/classpath-patches