vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchexceptions
changeset 376 059cb07ac9b3
parent 358 f6a165f7f00f
parent 292 fc3f6ea5e246
child 392 44a5802816be
child 407 b2f68438b0e2
     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("};");