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);