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;
   }
 
 }

Reply via email to