javap/src/main/java/org/apidesign/javap/TrapDataIterator.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 13:07:22 +0100
branchemul
changeset 695 dbcd1a21f3f8
parent 398 945c799a6812
permissions -rw-r--r--
Merging in long arithmetic, otherwise the zip support won't work
     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             put(exStart, td.start_pc, td);
    34             put(exStop, td.end_pc, td);
    35         }
    36     }
    37     
    38     private static void put(Hashtable h, short key, TrapData td) {
    39         Short s = Short.valueOf((short)key);
    40         Vector v = (Vector) h.get(s);
    41         if (v == null) {
    42             v = new Vector(1);
    43             h.put(s, v);
    44         }
    45         v.add(td);
    46     }
    47     
    48     private boolean processAll(Hashtable h, Short key, boolean add) {
    49         boolean change = false;
    50         Vector v = (Vector)h.get(key);
    51         if (v != null) {
    52             int s = v.size();
    53             for (int i = 0; i < s; i++) {
    54                 TrapData td = (TrapData)v.elementAt(i);
    55                 if (add) {
    56                     add(td);
    57                     change = true;
    58                 } else {
    59                     remove(td);
    60                     change = true;
    61                 }
    62             }
    63         }
    64         return change;
    65     }
    66     
    67     public boolean advanceTo(int i) {
    68         Short s = Short.valueOf((short)i);
    69         boolean ch1 = processAll(exStart, s, true);
    70         boolean ch2 = processAll(exStop, s, false);
    71         return ch1 || ch2;
    72     }
    73 
    74     public boolean useTry() {
    75         return currentCount > 0;
    76     }
    77 
    78     public TrapData[] current() {
    79         TrapData[] copy = new TrapData[currentCount];
    80         for (int i = 0; i < currentCount; i++) {
    81             copy[i] = current[i];
    82         }
    83         return copy;
    84     }
    85 
    86     private void add(TrapData e) {
    87         if (currentCount == current.length) {
    88             TrapData[] data = new TrapData[currentCount * 2];
    89             for (int i = 0; i < currentCount; i++) {
    90                 data[i] = current[i];
    91             }
    92             current = data;
    93         }
    94         current[currentCount++] = e;
    95     }
    96 
    97     private void remove(TrapData e) {
    98         if (currentCount == 0) {
    99             return;
   100         }
   101         int from = 0;
   102         while (from < currentCount) {
   103             if (e == current[from++]) {
   104                 break;
   105             }
   106         }
   107         while (from < currentCount) {
   108             current[from - 1] = current[from];
   109             current[from] = null;
   110             from++;
   111         }
   112         currentCount--;
   113     }
   114 }