Pre-fill arrays with nulls javap
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 17 Nov 2012 17:43:15 +0100
branchjavap
changeset 1729eb74b221cff
parent 171 f61602ea7759
child 173 2f0205599623
Pre-fill arrays with nulls
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java
vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java
vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java
     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  }