diff -r 6d1e8eccdc98 -r a2ca83ddc521 javap/src/main/java/org/apidesign/javap/TrapDataIterator.java --- a/javap/src/main/java/org/apidesign/javap/TrapDataIterator.java Sun Dec 09 16:16:19 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/TrapDataIterator.java Sun Dec 09 16:25:36 2012 +0100 @@ -11,7 +11,8 @@ public final class TrapDataIterator { private final java.util.Map exStart = new java.util.HashMap(); private final java.util.Map exStop = new java.util.HashMap(); - private final java.util.Deque current = new java.util.ArrayDeque(); + private TrapData[] current = new TrapData[10]; + private int currentCount; TrapDataIterator(Vector exceptionTable) { for (int i=0 ; i < exceptionTable.size(); i++) { @@ -24,19 +25,45 @@ public void advanceTo(int i) { TrapData e = exStart.get((short) i); if (e != null) { - current.addFirst(e); + add(e); } e = exStop.get((short) i); if (e != null) { - current.remove(e); + remove(e); } } public boolean useTry() { - return !current.isEmpty(); + return currentCount > 0; } public TrapData[] current() { - return current.toArray(new TrapData[0]); + return current; + } + + private void add(TrapData e) { + if (currentCount == current.length) { + TrapData[] data = new TrapData[currentCount * 2]; + for (int i = 0; i < currentCount; i++) { + data[i] = current[i]; + } + current = data; + } + current[currentCount++] = e; + } + + private void remove(TrapData e) { + int from = 0; + while (from < currentCount) { + if (e == current[from++]) { + break; + } + } + while (from < currentCount) { + current[from - 1] = current[from]; + current[from] = null; + from++; + } + currentCount--; } }