summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-13 23:20:19 +0000
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-13 23:20:19 +0000
commitf13c61f87a185d403dcbe2dffcceccf3edbb5abc (patch)
treee91afa34b8fe397cfc21764b75025a4034a96d56 /libjava
parent600b78d180d192d1daccf8051f0b3e82c7ab74c9 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--libjava/java/util/Hashtable.java47
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;
}
- }
+ }
}