vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
changeset 448 ac05de5a8786
parent 443 9359b006782b
child 453 5aca91d00356
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Jan 14 11:30:56 2013 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Jan 14 18:21:48 2013 +0100
     1.3 @@ -908,20 +908,42 @@
     1.4                      break;
     1.5                  }
     1.6                  case opc_newarray:
     1.7 -                    ++i; // skip type of array
     1.8 -                    emit(out, "@2 = new Array(@1).fillNulls();",
     1.9 -                         smapper.popI(), smapper.pushA());
    1.10 +                    int atype = readByte(byteCodes, ++i);
    1.11 +                    String jvmType;
    1.12 +                    switch (atype) {
    1.13 +                        case 4: jvmType = "[Z"; break;
    1.14 +                        case 5: jvmType = "[C"; break;
    1.15 +                        case 6: jvmType = "[F"; break;
    1.16 +                        case 7: jvmType = "[D"; break;
    1.17 +                        case 8: jvmType = "[B"; break;
    1.18 +                        case 9: jvmType = "[S"; break;
    1.19 +                        case 10: jvmType = "[I"; break;
    1.20 +                        case 11: jvmType = "[J"; break;
    1.21 +                        default: throw new IllegalStateException("Array type: " + atype);
    1.22 +                    }
    1.23 +                    emit(out, "@2 = new Array(@1).fillNulls().arrtype('@3');",
    1.24 +                         smapper.popI(), smapper.pushA(), jvmType);
    1.25                      break;
    1.26 -                case opc_anewarray:
    1.27 -                    i += 2; // skip type of array
    1.28 -                    emit(out, "@2 = new Array(@1).fillNulls();",
    1.29 -                         smapper.popI(), smapper.pushA());
    1.30 +                case opc_anewarray: {
    1.31 +                    int type = readIntArg(byteCodes, i);
    1.32 +                    i += 2;
    1.33 +                    String typeName = jc.getClassName(type);
    1.34 +                    if (typeName.startsWith("[")) {
    1.35 +                        typeName = "[" + typeName;
    1.36 +                    } else {
    1.37 +                        typeName = "[L" + typeName + ";";
    1.38 +                    }
    1.39 +                    emit(out, "@2 = new Array(@1).fillNulls().arrtype('@3');",
    1.40 +                         smapper.popI(), smapper.pushA(), typeName);
    1.41                      break;
    1.42 +                }
    1.43                  case opc_multianewarray: {
    1.44 +                    int type = readIntArg(byteCodes, i);
    1.45                      i += 2;
    1.46 +                    String typeName = jc.getClassName(type);
    1.47                      int dim = readByte(byteCodes, ++i);
    1.48                      out.append("{ var a0 = new Array(").append(smapper.popI())
    1.49 -                       .append(").fillNulls();");
    1.50 +                       .append(").fillNulls().arrtype('").append(typeName).append("');");
    1.51                      for (int d = 1; d < dim; d++) {
    1.52                          out.append("\n  var l" + d).append(" = ")
    1.53                             .append(smapper.popI()).append(';');