vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchexceptions
changeset 288 6d1e8eccdc98
parent 287 6f696a0ef12f
child 289 a2ca83ddc521
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 08 10:32:04 2012 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Dec 09 16:16:19 2012 +0100
     1.3 @@ -25,7 +25,7 @@
     1.4  import org.apidesign.javap.MethodData;
     1.5  import static org.apidesign.javap.RuntimeConstants.*;
     1.6  import org.apidesign.javap.TrapData;
     1.7 -import org.apidesign.javap.Vector;
     1.8 +import org.apidesign.javap.TrapDataIterator;
     1.9  
    1.10  /** Translator of the code inside class files to JavaScript.
    1.11   *
    1.12 @@ -217,7 +217,7 @@
    1.13                  out.append("arg").append(String.valueOf(i)).append(";\n");
    1.14              }
    1.15              out.append("  var s = new Array();\n");
    1.16 -            produceCode(code, m.getexception_table());
    1.17 +            produceCode(m);
    1.18          } else {
    1.19              out.append("  throw 'no code found for ").append(m.getInternalSig()).append("';\n");
    1.20          }
    1.21 @@ -253,7 +253,7 @@
    1.22                  out.append("arg").append(String.valueOf(i + 1)).append(";\n");
    1.23              }
    1.24              out.append(";\n  var s = new Array();\n");
    1.25 -            produceCode(code, m.getexception_table());
    1.26 +            produceCode(m);
    1.27          } else {
    1.28              out.append("  throw 'no code found for ").append(m.getInternalSig()).append("';\n");
    1.29          }
    1.30 @@ -261,33 +261,18 @@
    1.31          return mn;
    1.32      }
    1.33  
    1.34 -    private void produceCode(byte[] byteCodes, Vector exceptionTable) throws IOException {
    1.35 -
    1.36 -        final java.util.Map<Short, TrapData> exStart = new java.util.HashMap<Short, TrapData>();
    1.37 -        final java.util.Map<Short, TrapData> exStop = new java.util.HashMap<Short, TrapData>();
    1.38 -        for (int i=0 ; i < exceptionTable.size(); i++) {
    1.39 -            final TrapData td = (TrapData)exceptionTable.elementAt(i);
    1.40 -            exStart.put(td.start_pc, td);
    1.41 -            exStop.put(td.end_pc, td);
    1.42 -        }
    1.43 -        final java.util.Deque<TrapData> current = new java.util.ArrayDeque<TrapData>();
    1.44 +    private void produceCode(MethodData md) throws IOException {
    1.45 +        byte[] byteCodes = md.getCode();
    1.46 +        
    1.47 +        TrapDataIterator trap = md.getTrapDataIterator();
    1.48          out.append("\n  var gt = 0;\n  for(;;) switch(gt) {\n");
    1.49  
    1.50          for (int i = 0; i < byteCodes.length; i++) {
    1.51  
    1.52 -            {
    1.53 -                TrapData e = exStart.get((short)i);
    1.54 -                if (e != null) {
    1.55 -                    current.addFirst(e);
    1.56 -                }
    1.57 -                e = exStop.get((short)i);
    1.58 -                if (e != null) {
    1.59 -                    current.remove(e);
    1.60 -                }
    1.61 -            }
    1.62 +            trap.advanceTo(i);
    1.63              int prev = i;
    1.64              out.append("    case " + i).append(": ");            
    1.65 -            if (!current.isEmpty()) {
    1.66 +            if (trap.useTry()) {
    1.67                  out.append("try {");
    1.68              }
    1.69              final int c = readByte(byteCodes, i);
    1.70 @@ -810,9 +795,9 @@
    1.71                  }
    1.72                      
    1.73              }
    1.74 -            if (!current.isEmpty()) {
    1.75 +            if (trap.useTry()) {
    1.76                  out.append("} catch (e) {");
    1.77 -                for (TrapData e : current) {
    1.78 +                for (TrapData e : trap.current()) {
    1.79                      if (e.catch_cpx != 0) { //not finally
    1.80                          final String classInternalName = jc.getClassName(e.catch_cpx);
    1.81                          addReference(classInternalName);