diff -r f6a165f7f00f -r 059cb07ac9b3 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Dec 20 21:39:16 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 24 08:19:55 2012 +0100 @@ -25,6 +25,8 @@ import org.apidesign.javap.MethodData; import org.apidesign.javap.StackMapIterator; import static org.apidesign.javap.RuntimeConstants.*; +import org.apidesign.javap.TrapData; +import org.apidesign.javap.TrapDataIterator; /** Translator of the code inside class files to JavaScript. * @@ -222,6 +224,7 @@ private void generateMethod(String prefix, String name, MethodData m) throws IOException { final StackMapIterator stackMapIterator = m.createStackMapIterator(); + TrapDataIterator trap = m.getTrapDataIterator(); final LocalsMapper lmapper = new LocalsMapper(stackMapIterator.getArguments()); @@ -273,14 +276,18 @@ for (int i = 0; i < byteCodes.length; i++) { int prev = i; stackMapIterator.advanceTo(i); + trap.advanceTo(i); if (lastStackFrame != stackMapIterator.getFrameIndex()) { lastStackFrame = stackMapIterator.getFrameIndex(); lmapper.syncWithFrameLocals(stackMapIterator.getFrameLocals()); smapper.syncWithFrameStack(stackMapIterator.getFrameStack()); - out.append(" case " + i).append(": "); + out.append(" case " + i).append(": "); } else { out.append(" /* " + i).append(" */ "); } + if (trap.useTry()) { + out.append("try {"); + } final int c = readByte(byteCodes, i); switch (c) { case opc_aload_0: @@ -1104,13 +1111,32 @@ Integer.toString(c)); } } + if (trap.useTry()) { + out.append("} catch (e) {"); + for (TrapData e : trap.current()) { + if (e == null) { + break; + } + if (e.catch_cpx != 0) { //not finally + final String classInternalName = jc.getClassName(e.catch_cpx); + addReference(classInternalName); + out.append("if (e.$instOf_"+classInternalName.replace('/', '_')+") {"); + out.append("gt="+e.handler_pc+"; continue;"); + out.append("} "); + } else { + //finally - todo + } + } + out.append("throw e;"); + out.append("}"); + } out.append(" //"); for (int j = prev; j <= i; j++) { out.append(" "); final int cc = readByte(byteCodes, j); out.append(Integer.toString(cc)); } - out.append("\n"); + out.append("\n"); } out.append(" }\n"); out.append("};");