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
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@288
    12
    private final java.util.Map<Short, TrapData> exStart = new java.util.HashMap<Short, TrapData>();
jaroslav@288
    13
    private final java.util.Map<Short, TrapData> exStop = new java.util.HashMap<Short, TrapData>();
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@288
    26
        TrapData e = exStart.get((short) i);
jaroslav@288
    27
        if (e != null) {
jaroslav@289
    28
            add(e);
jaroslav@288
    29
        }
jaroslav@288
    30
        e = exStop.get((short) i);
jaroslav@288
    31
        if (e != null) {
jaroslav@289
    32
            remove(e);
jaroslav@288
    33
        }
jaroslav@288
    34
    }
jaroslav@288
    35
jaroslav@288
    36
    public boolean useTry() {
jaroslav@289
    37
        return currentCount > 0;
jaroslav@288
    38
    }
jaroslav@288
    39
jaroslav@288
    40
    public TrapData[] current() {
jaroslav@289
    41
        return current;
jaroslav@289
    42
    }
jaroslav@289
    43
jaroslav@289
    44
    private void add(TrapData e) {
jaroslav@289
    45
        if (currentCount == current.length) {
jaroslav@289
    46
            TrapData[] data = new TrapData[currentCount * 2];
jaroslav@289
    47
            for (int i = 0; i < currentCount; i++) {
jaroslav@289
    48
                data[i] = current[i];
jaroslav@289
    49
            }
jaroslav@289
    50
            current = data;
jaroslav@289
    51
        }
jaroslav@289
    52
        current[currentCount++] = e;
jaroslav@289
    53
    }
jaroslav@289
    54
jaroslav@289
    55
    private void remove(TrapData e) {
jaroslav@289
    56
        int from = 0;
jaroslav@289
    57
        while (from < currentCount) {
jaroslav@289
    58
            if (e == current[from++]) {
jaroslav@289
    59
                break;
jaroslav@289
    60
            }
jaroslav@289
    61
        }
jaroslav@289
    62
        while (from < currentCount) {
jaroslav@289
    63
            current[from - 1] = current[from];
jaroslav@289
    64
            current[from] = null;
jaroslav@289
    65
            from++;
jaroslav@289
    66
        }
jaroslav@289
    67
        currentCount--;
jaroslav@288
    68
    }
jaroslav@288
    69
}