Creation of multi dimensional arrays unified under java.lang.reflect.Array ArrayReflect
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 18 Jan 2013 18:52:02 +0100
branchArrayReflect
changeset 481472209ab1112
parent 480 dfebf4fbb711
child 482 05a87bc23192
Creation of multi dimensional arrays unified under java.lang.reflect.Array
emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Fri Jan 18 18:35:17 2013 +0100
     1.2 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Fri Jan 18 18:52:02 2013 +0100
     1.3 @@ -2,12 +2,6 @@
     1.4  vm.java_lang_reflect_Array(false);
     1.5  vm.java_lang_String(false);
     1.6  
     1.7 -// we need initialized arrays
     1.8 -Array.prototype.initWith = function(sig, value) {
     1.9 -  for(var i = 0; i < this.length; i++) this[i] = value;
    1.10 -  this.jvmName = sig;
    1.11 -  return this;
    1.12 -};
    1.13  Array.prototype.at = function(indx, value) {
    1.14    if (indx < 0 || indx > this.length) {
    1.15        var e = vm.java_lang_ArrayIndexOutOfBoundsException(true);
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jan 18 18:35:17 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jan 18 18:52:02 2013 +0100
     2.3 @@ -947,26 +947,17 @@
     2.4                      i += 2;
     2.5                      String typeName = jc.getClassName(type);
     2.6                      int dim = readByte(byteCodes, ++i);
     2.7 -                    out.append("{ var a0 = new Array(").append(smapper.popI())
     2.8 -                       .append(").initWith('").append(typeName).append("', null);");
     2.9 -                    for (int d = 1; d < dim; d++) {
    2.10 -                        typeName = typeName.substring(1);
    2.11 -                        out.append("\n  var l" + d).append(" = ")
    2.12 -                           .append(smapper.popI()).append(';');
    2.13 -                        out.append("\n  for (var i" + d).append (" = 0; i" + d).
    2.14 -                            append(" < a" + (d - 1)).
    2.15 -                            append(".length; i" + d).append("++) {");
    2.16 -                        out.append("\n    var a" + d).
    2.17 -                            append (" = new Array(l" + d).append(").initWith('")
    2.18 -                            .append(typeName).append("', ")
    2.19 -                            .append(typeName.length() == 2 ? "0" : "null").append(");");
    2.20 -                        out.append("\n    a" + (d - 1)).append("[i" + d).append("] = a" + d).
    2.21 -                            append(";");
    2.22 +                    StringBuilder dims = new StringBuilder();
    2.23 +                    dims.append('[');
    2.24 +                    for (int d = 0; d < dim; d++) {
    2.25 +                        if (d != 0) {
    2.26 +                            dims.append(",");
    2.27 +                        }
    2.28 +                        dims.append(smapper.popI());
    2.29                      }
    2.30 -                    for (int d = 1; d < dim; d++) {
    2.31 -                        out.append("\n  }");
    2.32 -                    }
    2.33 -                    out.append("\n").append(smapper.pushA()).append(" = a0; }");
    2.34 +                    dims.append(']');
    2.35 +                    emit(out, "@2 = Array.prototype.multiNewArray__Ljava_lang_Object_2Ljava_lang_String_2_3II('@3', @1, 0);",
    2.36 +                         dims.toString(), smapper.pushA(), typeName);
    2.37                      break;
    2.38                  }
    2.39                  case opc_arraylength: