ArrayIndexOutOfBoundsEx when reading from array
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 15 Jan 2013 12:38:49 +0100
changeset 458b157a354003f
parent 457 b0e82dcf51fb
child 459 a2871a3fd4c5
ArrayIndexOutOfBoundsEx when reading from array
emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareByteArrayTest.java
     1.1 --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Tue Jan 15 12:26:19 2013 +0100
     1.2 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Tue Jan 15 12:38:49 2013 +0100
     1.3 @@ -7,6 +7,14 @@
     1.4    this.jvmName = sig;
     1.5    return this;
     1.6  };
     1.7 +Array.prototype.at = function(indx) {
     1.8 +  if (indx < 0 || indx > this.length) {
     1.9 +      var e = vm.java_lang_ArrayIndexOutOfBoundsException(true);
    1.10 +      e.constructor.cons__VLjava_lang_String_2.call(e, indx.toString());
    1.11 +      throw e;
    1.12 +  }
    1.13 +  return this[indx];
    1.14 +};
    1.15  Array.prototype.getClass__Ljava_lang_Class_2 = function() {
    1.16    return vm.java_lang_Class(false).defineArray__Ljava_lang_Class_2Ljava_lang_String_2(this.jvmName);
    1.17  };
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Jan 15 12:26:19 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Jan 15 12:38:49 2013 +0100
     2.3 @@ -996,26 +996,26 @@
     2.4                           smapper.popI(), smapper.popI(), smapper.popA());
     2.5                      break;
     2.6                  case opc_laload:
     2.7 -                    emit(out, "@3 = @2[@1];",
     2.8 +                    emit(out, "@3 = @2.at(@1);",
     2.9                           smapper.popI(), smapper.popA(), smapper.pushL());
    2.10                      break;
    2.11                  case opc_faload:
    2.12 -                    emit(out, "@3 = @2[@1];",
    2.13 +                    emit(out, "@3 = @2.at(@1);",
    2.14                           smapper.popI(), smapper.popA(), smapper.pushF());
    2.15                      break;
    2.16                  case opc_daload:
    2.17 -                    emit(out, "@3 = @2[@1];",
    2.18 +                    emit(out, "@3 = @2.at(@1);",
    2.19                           smapper.popI(), smapper.popA(), smapper.pushD());
    2.20                      break;
    2.21                  case opc_aaload:
    2.22 -                    emit(out, "@3 = @2[@1];",
    2.23 +                    emit(out, "@3 = @2.at(@1);",
    2.24                           smapper.popI(), smapper.popA(), smapper.pushA());
    2.25                      break;
    2.26                  case opc_iaload:
    2.27                  case opc_baload:
    2.28                  case opc_caload:
    2.29                  case opc_saload:
    2.30 -                    emit(out, "@3 = @2[@1];",
    2.31 +                    emit(out, "@3 = @2.at(@1);",
    2.32                           smapper.popI(), smapper.popA(), smapper.pushI());
    2.33                      break;
    2.34                  case opc_pop:
     3.1 --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareByteArrayTest.java	Tue Jan 15 12:26:19 2013 +0100
     3.2 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/CompareByteArrayTest.java	Tue Jan 15 12:38:49 2013 +0100
     3.3 @@ -49,6 +49,24 @@
     3.4          return sum;
     3.5      }
     3.6      
     3.7 +    @Compare public String noOutOfBounds() {
     3.8 +        return atIndex(1);
     3.9 +    }
    3.10 +
    3.11 +    @Compare public String outOfBounds() {
    3.12 +        return atIndex(5);
    3.13 +    }
    3.14 +
    3.15 +    @Compare public String outOfBoundsMinus() {
    3.16 +        return atIndex(-1);
    3.17 +    }
    3.18 +
    3.19 +    private static final int[] arr = { 0, 1, 2 };
    3.20 +    public static String atIndex(int at) {
    3.21 +        return "at@" + arr[at];
    3.22 +    }
    3.23 +    
    3.24 +    
    3.25      @Factory
    3.26      public static Object[] create() {
    3.27          return VMTest.create(CompareByteArrayTest.class);