javap/src/main/java/org/apidesign/javap/TrapDataIterator.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 09 Dec 2012 16:25:36 +0100
branchexceptions
changeset 289 a2ca83ddc521
parent 288 6d1e8eccdc98
child 290 57dff70280c7
permissions -rw-r--r--
Using plain array instead of ArrayDeque
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package org.apidesign.javap;
     6 
     7 /**
     8  *
     9  * @author Jaroslav Tulach <jtulach@netbeans.org>
    10  */
    11 public final class TrapDataIterator {
    12     private final java.util.Map<Short, TrapData> exStart = new java.util.HashMap<Short, TrapData>();
    13     private final java.util.Map<Short, TrapData> exStop = new java.util.HashMap<Short, TrapData>();
    14     private TrapData[] current = new TrapData[10];
    15     private int currentCount;
    16     
    17     TrapDataIterator(Vector exceptionTable) {
    18         for (int i=0 ; i < exceptionTable.size(); i++) {
    19             final TrapData td = (TrapData)exceptionTable.elementAt(i);
    20             exStart.put(td.start_pc, td);
    21             exStop.put(td.end_pc, td);
    22         }
    23     }
    24 
    25     public void advanceTo(int i) {
    26         TrapData e = exStart.get((short) i);
    27         if (e != null) {
    28             add(e);
    29         }
    30         e = exStop.get((short) i);
    31         if (e != null) {
    32             remove(e);
    33         }
    34     }
    35 
    36     public boolean useTry() {
    37         return currentCount > 0;
    38     }
    39 
    40     public TrapData[] current() {
    41         return current;
    42     }
    43 
    44     private void add(TrapData e) {
    45         if (currentCount == current.length) {
    46             TrapData[] data = new TrapData[currentCount * 2];
    47             for (int i = 0; i < currentCount; i++) {
    48                 data[i] = current[i];
    49             }
    50             current = data;
    51         }
    52         current[currentCount++] = e;
    53     }
    54 
    55     private void remove(TrapData e) {
    56         int from = 0;
    57         while (from < currentCount) {
    58             if (e == current[from++]) {
    59                 break;
    60             }
    61         }
    62         while (from < currentCount) {
    63             current[from - 1] = current[from];
    64             current[from] = null;
    65             from++;
    66         }
    67         currentCount--;
    68     }
    69 }