From: bryce Date: Thu, 13 Sep 2001 23:20:19 +0000 (+0000) Subject: * java/util/Hashtable.java (Enumerator): Ensure that if X-Git-Tag: upstream/4.9.2~92094 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f13c61f87a185d403dcbe2dffcceccf3edbb5abc;p=platform%2Fupstream%2Flinaro-gcc.git * java/util/Hashtable.java (Enumerator): Ensure that if hasMoreElements() returns true, nextElement() will always return something even if the table has been modified. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45584 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5530021..2278b73 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -3,6 +3,10 @@ * java/io/File.java (normalizePath): Use equals() not '==' for string comparison. + * java/util/Hashtable.java (Enumerator): Ensure that if + hasMoreElements() returns true, nextElement() will always return + something even if the table has been modified. + 2001-09-12 Tom Tromey * Makefile.in: Rebuilt. diff --git a/libjava/java/util/Hashtable.java b/libjava/java/util/Hashtable.java index 4475785..48939b2 100644 --- a/libjava/java/util/Hashtable.java +++ b/libjava/java/util/Hashtable.java @@ -833,44 +833,57 @@ public class Hashtable extends Dictionary static final int VALUES = 1; int type; - // The total number of elements returned by nextElement(). Used to - // determine if there are more elements remaining. - int count; // current index in the physical hash table. int idx; - // the last Entry returned. + // the last Entry returned by nextEntry(). Entry last; + // Entry which will be returned by the next nextElement() call. + Entry next; Enumerator(int type) { this.type = type; - this.count = 0; this.idx = buckets.length; } + + private Entry nextEntry() + { + Entry e = null; + + if (last != null) + e = last.next; + + while (e == null && idx > 0) + { + e = buckets[--idx]; + } + last = e; + return e; + } public boolean hasMoreElements() { - return count < Hashtable.this.size; + if (next != null) + return true; + next = nextEntry(); + return (next != null); } public Object nextElement() { - if (count >= size) - throw new NoSuchElementException(); - count++; Entry e = null; - if (last != null) - e = last.next; - - while (e == null) + if (next != null) { - e = buckets[--idx]; + e = next; + next = null; } - - last = e; + else + e = nextEntry(); + if (e == null) + throw new NoSuchElementException("Hashtable Enumerator"); if (type == VALUES) return e.value; return e.key; } - } + } }