javap/src/main/java/org/apidesign/javap/TrapDataIterator.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 29 Dec 2012 20:10:10 +0100
changeset 398 945c799a6812
parent 378 ccb1544a88bc
child 400 5452b9fbd253
permissions -rw-r--r--
Use only single try/catch on when there is no branching point
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.javap;
    19 
    20 /**
    21  *
    22  * @author Jaroslav Tulach <jtulach@netbeans.org>
    23  */
    24 public final class TrapDataIterator {
    25     private final Hashtable exStart = new Hashtable();
    26     private final Hashtable exStop = new Hashtable();
    27     private TrapData[] current = new TrapData[10];
    28     private int currentCount;
    29     
    30     TrapDataIterator(Vector exceptionTable) {
    31         for (int i=0 ; i < exceptionTable.size(); i++) {
    32             final TrapData td = (TrapData)exceptionTable.elementAt(i);
    33             exStart.put(td.start_pc, td);
    34             exStop.put(td.end_pc, td);
    35         }
    36     }
    37 
    38     public boolean advanceTo(int i) {
    39         boolean change = false;
    40         Short s = Short.valueOf((short)i);
    41         TrapData e = (TrapData) exStart.get(s);
    42         if (e != null) {
    43             add(e);
    44             change = true;
    45         }
    46         e = (TrapData) exStop.get(s);
    47         if (e != null) {
    48             remove(e);
    49             change = true;
    50         }
    51         return change;
    52     }
    53 
    54     public boolean useTry() {
    55         return currentCount > 0;
    56     }
    57 
    58     public TrapData[] current() {
    59         return current;
    60     }
    61 
    62     private void add(TrapData e) {
    63         if (currentCount == current.length) {
    64             TrapData[] data = new TrapData[currentCount * 2];
    65             for (int i = 0; i < currentCount; i++) {
    66                 data[i] = current[i];
    67             }
    68             current = data;
    69         }
    70         current[currentCount++] = e;
    71     }
    72 
    73     private void remove(TrapData e) {
    74         int from = 0;
    75         while (from < currentCount) {
    76             if (e == current[from++]) {
    77                 break;
    78             }
    79         }
    80         while (from < currentCount) {
    81             current[from - 1] = current[from];
    82             current[from] = null;
    83             from++;
    84         }
    85         currentCount--;
    86     }
    87 }