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