1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Dec 20 21:39:16 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 24 08:19:55 2012 +0100
1.3 @@ -25,6 +25,8 @@
1.4 import org.apidesign.javap.MethodData;
1.5 import org.apidesign.javap.StackMapIterator;
1.6 import static org.apidesign.javap.RuntimeConstants.*;
1.7 +import org.apidesign.javap.TrapData;
1.8 +import org.apidesign.javap.TrapDataIterator;
1.9
1.10 /** Translator of the code inside class files to JavaScript.
1.11 *
1.12 @@ -222,6 +224,7 @@
1.13 private void generateMethod(String prefix, String name, MethodData m)
1.14 throws IOException {
1.15 final StackMapIterator stackMapIterator = m.createStackMapIterator();
1.16 + TrapDataIterator trap = m.getTrapDataIterator();
1.17 final LocalsMapper lmapper =
1.18 new LocalsMapper(stackMapIterator.getArguments());
1.19
1.20 @@ -273,14 +276,18 @@
1.21 for (int i = 0; i < byteCodes.length; i++) {
1.22 int prev = i;
1.23 stackMapIterator.advanceTo(i);
1.24 + trap.advanceTo(i);
1.25 if (lastStackFrame != stackMapIterator.getFrameIndex()) {
1.26 lastStackFrame = stackMapIterator.getFrameIndex();
1.27 lmapper.syncWithFrameLocals(stackMapIterator.getFrameLocals());
1.28 smapper.syncWithFrameStack(stackMapIterator.getFrameStack());
1.29 - out.append(" case " + i).append(": ");
1.30 + out.append(" case " + i).append(": ");
1.31 } else {
1.32 out.append(" /* " + i).append(" */ ");
1.33 }
1.34 + if (trap.useTry()) {
1.35 + out.append("try {");
1.36 + }
1.37 final int c = readByte(byteCodes, i);
1.38 switch (c) {
1.39 case opc_aload_0:
1.40 @@ -1104,13 +1111,32 @@
1.41 Integer.toString(c));
1.42 }
1.43 }
1.44 + if (trap.useTry()) {
1.45 + out.append("} catch (e) {");
1.46 + for (TrapData e : trap.current()) {
1.47 + if (e == null) {
1.48 + break;
1.49 + }
1.50 + if (e.catch_cpx != 0) { //not finally
1.51 + final String classInternalName = jc.getClassName(e.catch_cpx);
1.52 + addReference(classInternalName);
1.53 + out.append("if (e.$instOf_"+classInternalName.replace('/', '_')+") {");
1.54 + out.append("gt="+e.handler_pc+"; continue;");
1.55 + out.append("} ");
1.56 + } else {
1.57 + //finally - todo
1.58 + }
1.59 + }
1.60 + out.append("throw e;");
1.61 + out.append("}");
1.62 + }
1.63 out.append(" //");
1.64 for (int j = prev; j <= i; j++) {
1.65 out.append(" ");
1.66 final int cc = readByte(byteCodes, j);
1.67 out.append(Integer.toString(cc));
1.68 }
1.69 - out.append("\n");
1.70 + out.append("\n");
1.71 }
1.72 out.append(" }\n");
1.73 out.append("};");