diff -r 859cc3a0b8f0 -r 9288ecf9657c vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 15:33:03 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Jan 19 06:07:49 2013 +0100 @@ -909,7 +909,7 @@ case 11: jvmType = "[J"; break; default: throw new IllegalStateException("Array type: " + atype); } - emit(out, "var @2 = new Array(@1).initWith('@3', 0);", + emit(out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(true, '@3', @1);", smapper.popI(), smapper.pushA(), jvmType); break; case opc_anewarray: { @@ -921,7 +921,7 @@ } else { typeName = "[L" + typeName + ";"; } - emit(out, "var @2 = new Array(@1).initWith('@3', null);", + emit(out, "var @2 = Array.prototype.newArray__Ljava_lang_Object_2ZLjava_lang_String_2I(false, '@3', @1);", smapper.popI(), smapper.pushA(), typeName); break; } @@ -930,27 +930,17 @@ i += 2; String typeName = jc.getClassName(type); int dim = readByte(byteCodes, ++i); - out.append("{ var a0 = new Array(").append(smapper.popI()) - .append(").initWith('").append(typeName).append("', null);"); - for (int d = 1; d < dim; d++) { - typeName = typeName.substring(1); - out.append("\n var l" + d).append(" = ") - .append(smapper.popI()).append(';'); - out.append("\n for (var i" + d).append (" = 0; i" + d). - append(" < a" + (d - 1)). - append(".length; i" + d).append("++) {"); - out.append("\n var a" + d). - append (" = new Array(l" + d).append(").initWith('") - .append(typeName).append("', ") - .append(typeName.length() == 2 ? "0" : "null").append(");"); - out.append("\n a" + (d - 1)).append("[i" + d).append("] = a" + d). - append(";"); + StringBuilder dims = new StringBuilder(); + dims.append('['); + for (int d = 0; d < dim; d++) { + if (d != 0) { + dims.append(","); + } + dims.append(smapper.popI()); } - for (int d = 1; d < dim; d++) { - out.append("\n }"); - } - out.append("\nvar ").append(smapper.pushA()) - .append(" = a0; }"); + dims.append(']'); + emit(out, "var @2 = Array.prototype.multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3II('@3', @1, 0);", + dims.toString(), smapper.pushA(), typeName); break; } case opc_arraylength: