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