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