This fixes a couple bugs in EnumMap.
One is that EnumMap.get() will return the empty slot object. Oops.
This is PR java/32862.
The other is that EnumMap.clone() calls new. This is only correct
when a class (or clone itself) is final. I looked but did not see
other instances of this bug in java.util.
Tom
Index: ChangeLog
from Tom Tromey <[EMAIL PROTECTED]>
PR java/32862:
* java/util/EnumMap.java (get): Special case emptySlot.
(clone): Rewrote.
Index: java/util/EnumMap.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/EnumMap.java,v
retrieving revision 1.4
diff -u -r1.4 EnumMap.java
--- java/util/EnumMap.java 21 Dec 2006 13:02:50 -0000 1.4
+++ java/util/EnumMap.java 24 Jul 2007 15:24:10 -0000
@@ -1,5 +1,5 @@
/* EnumMap.java - Map where keys are enum constants
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -140,7 +140,8 @@
Enum<K> e = (Enum<K>) key;
if (e.getDeclaringClass() != enumClass)
return null;
- return store[e.ordinal()];
+ V o = store[e.ordinal()];
+ return o == emptySlot ? null : o;
}
public V put(K key, V value)
@@ -387,8 +388,18 @@
public EnumMap<K, V> clone()
{
- /* This constructor provides this functionality */
- return new EnumMap(this);
+ EnumMap<K, V> result;
+ try
+ {
+ result = (EnumMap<K, V>) super.clone();
+ }
+ catch (CloneNotSupportedException ignore)
+ {
+ // Can't happen.
+ result = null;
+ }
+ result.store = store.clone();
+ return result;
}
}