Hi,

This fixes --enable-collections by adding the new java.util classes and
by using Iterators explicitly (not through the enhanced for-loop which
only works with java.lang.Iterable). But I am not sure it really makes
sense to keep this supported. Could someone that uses it test that it
still works as expected?

2007-04-06  Mark Wielaard  <[EMAIL PROTECTED]>

        * lib/mkcollections.pl.in: Add externalclasses.
        * java/util/Collections.java: Unroll enhanced for loops.
        * java/util/HashMap.java: Likewise.
        * java/util/Hashtable.java: Likewise.
        * java/util/TreeMap.java: Likewise.

Committed,

Mark
Index: lib/mkcollections.pl.in
===================================================================
RCS file: /cvsroot/classpath/classpath/lib/mkcollections.pl.in,v
retrieving revision 1.5
diff -u -r1.5 mkcollections.pl.in
--- lib/mkcollections.pl.in	22 Jul 2006 20:30:47 -0000	1.5
+++ lib/mkcollections.pl.in	6 Apr 2007 15:35:55 -0000
@@ -55,6 +55,12 @@
 		       TreeMap
 		       TreeSet
 		       Vector);
+my @externalclasses=qw(AbstractQueue
+		       ArrayDeque
+		       Deque
+		       NavigableMap
+		       NavigableSet
+		       Queue);
 
 my $destPkg = $destpath;
 $destPkg  =~ s!/!.!g;
@@ -109,6 +115,9 @@
 	for $clazz (@javautilclasses) {
 	    $_ =~ s/java.util.$clazz/$clazz/g;
 	}
+	for $clazz (@externalclasses) {
+	    $_ =~ s/java.util.$clazz/$clazz/g;
+	}
 
 	$_ =~ s/abstract (interface)/$1/g;
 
@@ -139,3 +148,11 @@
     print "$outfile\n";
     convert ($file, $infile, $outfile);
 }
+
+for $file (@externalclasses) {
+    my $infile = "$classpath/external/jsr166/java/util/$file.java";
+    my $outfile = "$destpath/$file.java";
+    print "$outfile\n";
+    convert ($file, $infile, $outfile);
+}
+
Index: java/util/Collections.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/Collections.java,v
retrieving revision 1.49
diff -u -r1.49 Collections.java
--- java/util/Collections.java	28 Dec 2006 23:30:53 -0000	1.49
+++ java/util/Collections.java	6 Apr 2007 15:35:56 -0000
@@ -1462,8 +1462,10 @@
   public static int frequency (Collection<?> c, Object o)
   {
     int result = 0;
-    for (Object v : c)
+    final Iterator<?> it = c.iterator();
+    while (it.hasNext())
       {
+	Object v = it.next();
 	if (AbstractCollection.equals(o, v))
 	  ++result;
       }
@@ -1524,8 +1526,9 @@
   public static boolean disjoint(Collection<?> c1, Collection<?> c2)
   {
     Collection<Object> oc1 = (Collection<Object>) c1;
-    for (Object o : oc1)
-      if (c2.contains(o))
+    final Iterator<Object> it = oc1.iterator();
+    while (it.hasNext())
+      if (c2.contains(it.next()))
 	return false;
     return true;
   }
@@ -5827,8 +5830,10 @@
     public boolean addAll(Collection<? extends E> coll)
     {
       Collection<E> typedColl = (Collection<E>) c;
-      for (E element : typedColl)
+      final Iterator<E> it = typedColl.iterator();
+      while (it.hasNext())
 	{
+	  final E element = it.next();
 	  if (!type.isInstance(element))
 	    throw new ClassCastException("A member of the collection is not of the correct type.");
 	}
@@ -6169,9 +6174,10 @@
     public boolean addAll(int index, Collection<? extends E> coll)
     {
       Collection<E> typedColl = (Collection<E>) coll;
-      for (E element : typedColl)
+      final Iterator<E> it = typedColl.iterator();
+      while (it.hasNext())
 	{
-	  if (!type.isInstance(element))
+	  if (!type.isInstance(it.next()))
 	    throw new ClassCastException("A member of the collection is not of the correct type.");
 	}
       return list.addAll(index, coll);
@@ -6872,8 +6878,10 @@
     public void putAll(Map<? extends K, ? extends V> map)
     {
       Map<K,V> typedMap = (Map<K,V>) map;
-      for (Map.Entry<K,V> entry : typedMap.entrySet())
+      final Iterator<Map.Entry<K,V>> it = typedMap.entrySet().iterator();
+      while (it.hasNext())
 	{
+	  final Map.Entry<K,V> entry = it.next();
 	  if (!keyType.isInstance(entry.getKey()))
 	    throw new ClassCastException("A key is of the wrong type.");
 	  if (!valueType.isInstance(entry.getValue()))
@@ -7494,8 +7502,9 @@
     public boolean addAll(Collection<? extends T> c)
     {
       boolean result = false;
-      for (T e : c)
-	result |= deque.offerFirst(e);
+      final Iterator<? extends T> it = c.iterator();
+      while (it.hasNext())
+	result |= deque.offerFirst(it.next());
       return result;
     }
     
@@ -7572,8 +7581,9 @@
     public boolean addAll(Collection<? extends E> c)
     {
       boolean result = false;
-      for (E e : c)
-	result |= (map.put(e, true) == null);
+      final Iterator<? extends E> it = c.iterator();
+      while (it.hasNext())
+	result |= (map.put(it.next(), true) == null);
       return result;
     }
     
Index: java/util/HashMap.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/HashMap.java,v
retrieving revision 1.33
diff -u -r1.33 HashMap.java
--- java/util/HashMap.java	10 Dec 2006 20:25:46 -0000	1.33
+++ java/util/HashMap.java	6 Apr 2007 15:35:56 -0000
@@ -380,11 +380,11 @@
    */
   public void putAll(Map<? extends K, ? extends V> m)
   {
-    Map<K,V> addMap;
-
-    addMap = (Map<K,V>) m;
-    for (Map.Entry<K,V> e : addMap.entrySet())
+    final Map<K,V> addMap = (Map<K,V>) m;
+    final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator();
+    while (it.hasNext())
       {
+	final Map.Entry<K,V> e = it.next();
         // Optimize in case the Entry is one of our own.
         if (e instanceof AbstractMap.SimpleEntry)
           {
@@ -710,12 +710,12 @@
    */
   void putAllInternal(Map<? extends K, ? extends V> m)
   {
-    Map<K,V> addMap;
-
-    addMap = (Map<K,V>) m;
+    final Map<K,V> addMap = (Map<K,V>) m;
+    final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator();
     size = 0;
-    for (Map.Entry<K,V> e : addMap.entrySet())
+    while (it.hasNext())
       {
+	final Map.Entry<K,V> e = it.next();
         size++;
 	K key = e.getKey();
 	int idx = hash(key);
Index: java/util/Hashtable.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/Hashtable.java,v
retrieving revision 1.40
diff -u -r1.40 Hashtable.java
--- java/util/Hashtable.java	10 Dec 2006 20:25:46 -0000	1.40
+++ java/util/Hashtable.java	6 Apr 2007 15:35:56 -0000
@@ -505,12 +505,11 @@
    */
   public synchronized void putAll(Map<? extends K, ? extends V> m)
   {
-    Map<K,V> addMap;
-    
-    addMap = (Map<K,V>) m;
-
-    for (Map.Entry<K,V> e : addMap.entrySet())
+    final Map<K,V> addMap = (Map<K,V>) m;
+    final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator();
+    while (it.hasNext())
       {
+	final Map.Entry<K,V> e = it.next();
         // Optimize in case the Entry is one of our own.
         if (e instanceof AbstractMap.SimpleEntry)
           {
@@ -857,13 +856,12 @@
    */
   void putAllInternal(Map<? extends K, ? extends V> m)
   {
-    Map<K,V> addMap;
-
-    addMap = (Map<K,V>) m;
+    final Map<K,V> addMap = (Map<K,V>) m;
+    final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator();
     size = 0;
-
-    for (Map.Entry<K,V> e : addMap.entrySet())
+    while (it.hasNext());
       {
+	final Map.Entry<K,V> e = it.next();
         size++;
 	K key = e.getKey();
 	int idx = hash(key);
Index: java/util/TreeMap.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/TreeMap.java,v
retrieving revision 1.33
diff -u -r1.33 TreeMap.java
--- java/util/TreeMap.java	28 Dec 2006 03:04:42 -0000	1.33
+++ java/util/TreeMap.java	6 Apr 2007 15:35:56 -0000
@@ -2721,8 +2721,10 @@
     public String toString()
     {
       StringBuilder r = new StringBuilder("{");
-      for (Entry<DK,DV> e : entrySet())
+      final Iterator<Entry<DK,DV>> it = entrySet().iterator();
+      while (it.hasNext())
       {
+	final Entry<DK,DV> e = it.next();
         r.append(e.getKey());
         r.append('=');
         r.append(e.getValue());
@@ -3157,8 +3159,10 @@
     public String toString()
     {
       StringBuilder r = new StringBuilder("[");
-      for (D o : this)
+      final Iterator<D> it = iterator();
+      while (it.hasNext())
       {
+	final D o = it.next();
 	if (o == this)
 	  r.append("<this>");
 	else

Reply via email to