diff options
author | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-13 23:20:19 +0000 |
---|---|---|
committer | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-13 23:20:19 +0000 |
commit | f13c61f87a185d403dcbe2dffcceccf3edbb5abc (patch) | |
tree | e91afa34b8fe397cfc21764b75025a4034a96d56 /libjava | |
parent | 600b78d180d192d1daccf8051f0b3e82c7ab74c9 (diff) | |
download | gcc-f13c61f87a185d403dcbe2dffcceccf3edbb5abc.tar.gz |
* 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
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 4 | ||||
-rw-r--r-- | libjava/java/util/Hashtable.java | 47 |
2 files changed, 34 insertions, 17 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5530021402a..2278b73c0e6 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 <tromey@redhat.com> * Makefile.in: Rebuilt. diff --git a/libjava/java/util/Hashtable.java b/libjava/java/util/Hashtable.java index 4475785bbbb..48939b25f15 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; } - } + } } |