diff -r fe1a07c17681 -r a7a45e5e5e77 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 15:38:12 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 15:44:09 2013 +0100 @@ -52,7 +52,7 @@ /* * @param resourcePath name of resources to read */ - protected abstract void requireScript(String resourcePath); + protected abstract void requireScript(String resourcePath) throws IOException; /** Allows subclasses to redefine what field a function representing a * class gets assigned. By default it returns the suggested name followed @@ -212,7 +212,7 @@ out.append("\n return this;"); out.append("\n }"); out.append("\n return arguments[0] ? new CLS() : CLS.prototype;"); - out.append("\n}"); + out.append("\n};"); StringBuilder sb = new StringBuilder(); for (String init : toInitilize.toArray()) { sb.append("\n").append(init).append("();"); @@ -945,7 +945,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: { @@ -957,7 +957,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; } @@ -966,27 +966,17 @@ i += 2; String typeName = jc.getClassName(type); int dim = readUByte(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: @@ -1247,11 +1237,13 @@ int indx = readIntArg(byteCodes, i); final String type = jc.getClassName(indx); if (!type.startsWith("[")) { - // no way to check arrays right now - // XXX proper exception emit(out, "if (@1 !== null && !@1.$instOf_@2) throw {};", smapper.getA(0), type.replace('/', '_')); + } else { + emit(out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);", + smapper.getA(0), type + ); } i += 2; break; @@ -1259,9 +1251,16 @@ case opc_instanceof: { int indx = readIntArg(byteCodes, i); final String type = jc.getClassName(indx); - emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;", - smapper.popA(), smapper.pushI(), - type.replace('/', '_')); + if (!type.startsWith("[")) { + emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;", + smapper.popA(), smapper.pushI(), + type.replace('/', '_')); + } else { + emit(out, "var @2 = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@3').isInstance__ZLjava_lang_Object_2(@1);", + smapper.popA(), smapper.pushI(), + type + ); + } i += 2; break; } @@ -1567,8 +1566,12 @@ String[] classRef = { null }; String s = jc.stringValue(entryIndex, classRef); if (classRef[0] != null) { - addReference(classRef[0]); - s = accessClass(s.replace('/', '_')) + "(false).constructor.$class"; + if (classRef[0].startsWith("[")) { + s = accessClass("java_lang_Class") + "(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('" + classRef[0] + "');"; + } else { + addReference(classRef[0]); + s = accessClass(s.replace('/', '_')) + "(false).constructor.$class"; + } } return s; }