# HG changeset patch # User Jaroslav Tulach # Date 1353170595 -3600 # Node ID 9eb74b221cff9512c22d2d9d2fc91d441f8641f2 # Parent f61602ea7759cdeac8b785fbb40c7cf967f15582 Pre-fill arrays with nulls diff -r f61602ea7759 -r 9eb74b221cff vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 16:15:10 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 17:43:15 2012 +0100 @@ -592,25 +592,25 @@ } case opc_newarray: { int type = byteCodes[i++]; - out.append("stack.push(new Array(stack.pop()));"); + out.append("stack.push(new Array(stack.pop()).fillNulls());"); break; } case opc_anewarray: { i += 2; // skip type of array - out.append("stack.push(new Array(stack.pop()));"); + out.append("stack.push(new Array(stack.pop()).fillNulls());"); break; } case opc_multianewarray: { i += 2; int dim = readByte(byteCodes, ++i); - out.append("{ var a0 = new Array(stack.pop());"); + out.append("{ var a0 = new Array(stack.pop()).fillNulls();"); for (int d = 1; d < dim; d++) { out.append("\n var l" + d).append(" = stack.pop();"); 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(");"); + append (" = new Array(l" + d).append(").fillNulls();"); out.append("\n a" + (d - 1)).append("[i" + d).append("] = a" + d). append(";"); } diff -r f61602ea7759 -r 9eb74b221cff vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sat Nov 17 16:15:10 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sat Nov 17 17:43:15 2012 +0100 @@ -41,6 +41,14 @@ compile(GenJS.class.getClassLoader(), out, names); } static void compile(ClassLoader l, Appendable out, StringArray names) throws IOException { + out.append("Array.prototype.fillNulls = function() {\n" + + " for(var i = 0; i < this.length; i++) {\n" + + " this[i] = null;\n" + + " }\n" + + " return this;\n" + + "};"); + + StringArray processed = new StringArray(); StringArray initCode = new StringArray(); for (String baseClass : names.toArray()) { diff -r f61602ea7759 -r 9eb74b221cff vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Sat Nov 17 16:15:10 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Sat Nov 17 17:43:15 2012 +0100 @@ -64,9 +64,9 @@ try { ret = code.invokeFunction(methodName, args); } catch (ScriptException ex) { - fail("Execution failed in\n" + codeSeq, ex); + fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex); } catch (NoSuchMethodException ex) { - fail("Cannot find method in\n" + codeSeq, ex); + fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex); } if (ret == null && expRes == null) { return; diff -r f61602ea7759 -r 9eb74b221cff vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 16:15:10 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 17:43:15 2012 +0100 @@ -275,15 +275,17 @@ return (Invocable)js; } catch (Exception ex) { if (sb.length() > 2000) { - File f = File.createTempFile("execution", ".js"); - FileWriter w = new FileWriter(f); - w.append(sb); - w.close(); - sb.setLength(0); - sb.append(f.getPath()); + dumpJS(sb); } fail("Could not compile:\n" + sb, ex); return null; } } + static String dumpJS(CharSequence sb) throws IOException { + File f = File.createTempFile("execution", ".js"); + FileWriter w = new FileWriter(f); + w.append(sb); + w.close(); + return f.getPath(); + } }