1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 16:15:10 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 17:43:15 2012 +0100
1.3 @@ -592,25 +592,25 @@
1.4 }
1.5 case opc_newarray: {
1.6 int type = byteCodes[i++];
1.7 - out.append("stack.push(new Array(stack.pop()));");
1.8 + out.append("stack.push(new Array(stack.pop()).fillNulls());");
1.9 break;
1.10 }
1.11 case opc_anewarray: {
1.12 i += 2; // skip type of array
1.13 - out.append("stack.push(new Array(stack.pop()));");
1.14 + out.append("stack.push(new Array(stack.pop()).fillNulls());");
1.15 break;
1.16 }
1.17 case opc_multianewarray: {
1.18 i += 2;
1.19 int dim = readByte(byteCodes, ++i);
1.20 - out.append("{ var a0 = new Array(stack.pop());");
1.21 + out.append("{ var a0 = new Array(stack.pop()).fillNulls();");
1.22 for (int d = 1; d < dim; d++) {
1.23 out.append("\n var l" + d).append(" = stack.pop();");
1.24 out.append("\n for (var i" + d).append (" = 0; i" + d).
1.25 append(" < a" + (d - 1)).
1.26 append(".length; i" + d).append("++) {");
1.27 out.append("\n var a" + d).
1.28 - append (" = new Array(l" + d).append(");");
1.29 + append (" = new Array(l" + d).append(").fillNulls();");
1.30 out.append("\n a" + (d - 1)).append("[i" + d).append("] = a" + d).
1.31 append(";");
1.32 }
2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sat Nov 17 16:15:10 2012 +0100
2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sat Nov 17 17:43:15 2012 +0100
2.3 @@ -41,6 +41,14 @@
2.4 compile(GenJS.class.getClassLoader(), out, names);
2.5 }
2.6 static void compile(ClassLoader l, Appendable out, StringArray names) throws IOException {
2.7 + out.append("Array.prototype.fillNulls = function() {\n" +
2.8 + " for(var i = 0; i < this.length; i++) {\n" +
2.9 + " this[i] = null;\n" +
2.10 + " }\n" +
2.11 + " return this;\n" +
2.12 + "};");
2.13 +
2.14 +
2.15 StringArray processed = new StringArray();
2.16 StringArray initCode = new StringArray();
2.17 for (String baseClass : names.toArray()) {
3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Sat Nov 17 16:15:10 2012 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Sat Nov 17 17:43:15 2012 +0100
3.3 @@ -64,9 +64,9 @@
3.4 try {
3.5 ret = code.invokeFunction(methodName, args);
3.6 } catch (ScriptException ex) {
3.7 - fail("Execution failed in\n" + codeSeq, ex);
3.8 + fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
3.9 } catch (NoSuchMethodException ex) {
3.10 - fail("Cannot find method in\n" + codeSeq, ex);
3.11 + fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
3.12 }
3.13 if (ret == null && expRes == null) {
3.14 return;
4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 16:15:10 2012 +0100
4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 17:43:15 2012 +0100
4.3 @@ -275,15 +275,17 @@
4.4 return (Invocable)js;
4.5 } catch (Exception ex) {
4.6 if (sb.length() > 2000) {
4.7 - File f = File.createTempFile("execution", ".js");
4.8 - FileWriter w = new FileWriter(f);
4.9 - w.append(sb);
4.10 - w.close();
4.11 - sb.setLength(0);
4.12 - sb.append(f.getPath());
4.13 + dumpJS(sb);
4.14 }
4.15 fail("Could not compile:\n" + sb, ex);
4.16 return null;
4.17 }
4.18 }
4.19 + static String dumpJS(CharSequence sb) throws IOException {
4.20 + File f = File.createTempFile("execution", ".js");
4.21 + FileWriter w = new FileWriter(f);
4.22 + w.append(sb);
4.23 + w.close();
4.24 + return f.getPath();
4.25 + }
4.26 }