Backporting da9e5973e699 to make sure we run on Nashorn (at least a bit) closure
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 24 Apr 2014 18:05:21 +0200
branchclosure
changeset 14852af07db15110
parent 1147 894a5045e354
child 1486 b5c7970a39e6
Backporting da9e5973e699 to make sure we run on Nashorn (at least a bit)
rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java
     1.1 --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js	Mon May 27 08:33:59 2013 +0200
     1.2 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_String.js	Thu Apr 24 18:05:21 2014 +0200
     1.3 @@ -2,16 +2,16 @@
     1.4  vm.java_lang_reflect_Array(false);
     1.5  vm.java_lang_String(false);
     1.6  
     1.7 -Array.prototype.at = function(indx, value) {
     1.8 -  if (indx < 0 || indx > this.length) {
     1.9 +Array.at = function(arr, indx, value) {
    1.10 +  if (indx < 0 || indx >= arr.length) {
    1.11        var e = vm.java_lang_ArrayIndexOutOfBoundsException(true);
    1.12        e.constructor.cons__VLjava_lang_String_2.call(e, indx.toString());
    1.13        throw e;
    1.14    }
    1.15 -  if (arguments.length === 2) {
    1.16 -      this[indx] = value;
    1.17 +  if (arguments.length === 3) {
    1.18 +      arr[indx] = value;
    1.19    }
    1.20 -  return this[indx];
    1.21 +  return arr[indx];
    1.22  };
    1.23  Array.prototype.getClass__Ljava_lang_Class_2 = function() {
    1.24    return vm.java_lang_Class(false).defineArray__Ljava_lang_Class_2Ljava_lang_String_2(this.jvmName);
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon May 27 08:33:59 2013 +0200
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Apr 24 18:05:21 2014 +0200
     2.3 @@ -1003,49 +1003,49 @@
     2.4                           smapper.popA(), smapper.pushI());
     2.5                      break;
     2.6                  case opc_lastore:
     2.7 -                    emit(out, "@3.at(@2, @1);",
     2.8 +                    emit(out, "Array.at(@3, @2, @1);",
     2.9                           smapper.popL(), smapper.popI(), smapper.popA());
    2.10                      break;
    2.11                  case opc_fastore:
    2.12 -                    emit(out, "@3.at(@2, @1);",
    2.13 +                    emit(out, "Array.at(@3, @2, @1);",
    2.14                           smapper.popF(), smapper.popI(), smapper.popA());
    2.15                      break;
    2.16                  case opc_dastore:
    2.17 -                    emit(out, "@3.at(@2, @1);",
    2.18 +                    emit(out, "Array.at(@3, @2, @1);",
    2.19                           smapper.popD(), smapper.popI(), smapper.popA());
    2.20                      break;
    2.21                  case opc_aastore:
    2.22 -                    emit(out, "@3.at(@2, @1);",
    2.23 +                    emit(out, "Array.at(@3, @2, @1);",
    2.24                           smapper.popA(), smapper.popI(), smapper.popA());
    2.25                      break;
    2.26                  case opc_iastore:
    2.27                  case opc_bastore:
    2.28                  case opc_castore:
    2.29                  case opc_sastore:
    2.30 -                    emit(out, "@3.at(@2, @1);",
    2.31 +                    emit(out, "Array.at(@3, @2, @1);",
    2.32                           smapper.popI(), smapper.popI(), smapper.popA());
    2.33                      break;
    2.34                  case opc_laload:
    2.35 -                    emit(out, "var @3 = @2.at(@1);",
    2.36 +                    emit(out, "var @3 = Array.at(@2, @1);",
    2.37                           smapper.popI(), smapper.popA(), smapper.pushL());
    2.38                      break;
    2.39                  case opc_faload:
    2.40 -                    emit(out, "var @3 = @2.at(@1);",
    2.41 +                    emit(out, "var @3 = Array.at(@2, @1);",
    2.42                           smapper.popI(), smapper.popA(), smapper.pushF());
    2.43                      break;
    2.44                  case opc_daload:
    2.45 -                    emit(out, "var @3 = @2.at(@1);",
    2.46 +                    emit(out, "var @3 = Array.at(@2, @1);",
    2.47                           smapper.popI(), smapper.popA(), smapper.pushD());
    2.48                      break;
    2.49                  case opc_aaload:
    2.50 -                    emit(out, "var @3 = @2.at(@1);",
    2.51 +                    emit(out, "var @3 = Array.at(@2, @1);",
    2.52                           smapper.popI(), smapper.popA(), smapper.pushA());
    2.53                      break;
    2.54                  case opc_iaload:
    2.55                  case opc_baload:
    2.56                  case opc_caload:
    2.57                  case opc_saload:
    2.58 -                    emit(out, "var @3 = @2.at(@1);",
    2.59 +                    emit(out, "var @3 = Array.at(@2, @1);",
    2.60                           smapper.popI(), smapper.popA(), smapper.pushI());
    2.61                      break;
    2.62                  case opc_pop:
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java	Mon May 27 08:33:59 2013 +0200
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java	Thu Apr 24 18:05:21 2014 +0200
     3.3 @@ -94,12 +94,14 @@
     3.4          {
     3.5              // 2nd invocation
     3.6              Object ret = code.invokeMethod(clazz, method, "java.lang.String");
     3.7 -            assertEquals(ret, Double.valueOf(2));
     3.8 +            assertTrue(ret instanceof Number, "Is number: " + ret);
     3.9 +            assertEquals(((Number)ret).doubleValue(), 2.0);
    3.10          }
    3.11          {
    3.12              // 3rd invocation
    3.13              Object ret = code.invokeMethod(clazz, method, "java.lang.Integer");
    3.14 -            assertEquals(ret, Double.valueOf(3));
    3.15 +            assertTrue(ret instanceof Number, "Is number: " + ret);
    3.16 +            assertEquals(((Number)ret).doubleValue(), 3.0);
    3.17          }
    3.18      }
    3.19      
     4.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java	Mon May 27 08:33:59 2013 +0200
     4.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java	Thu Apr 24 18:05:21 2014 +0200
     4.3 @@ -65,7 +65,10 @@
     4.4              // in case of Long it is necessary convert it to number
     4.5              // since the Long is represented by two numbers in JavaScript
     4.6              try {
     4.7 -                ret = code.invokeMethod(ret, "toFP");
     4.8 +                final Object toFP = ((ScriptEngine)code).eval("Number.prototype.toFP");
     4.9 +                if (ret instanceof Long) {
    4.10 +                    ret = code.invokeMethod(toFP, "call", ret);
    4.11 +                }
    4.12                  ret = code.invokeFunction("Number", ret);
    4.13              } catch (ScriptException ex) {
    4.14                  fail("Conversion to number failed in " + dumpJS(codeSeq) + ": " + ex.getMessage(), ex);
    4.15 @@ -83,6 +86,9 @@
    4.16          if (ret == null) {
    4.17              return;
    4.18          }
    4.19 +        if (expRes instanceof Integer && ret instanceof Double) {
    4.20 +            expRes = ((Integer)expRes).doubleValue();
    4.21 +        }
    4.22          if (expRes != null && expRes.equals(ret)) {
    4.23              return;
    4.24          }
     5.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Mon May 27 08:33:59 2013 +0200
     5.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Thu Apr 24 18:05:21 2014 +0200
     5.3 @@ -90,6 +90,9 @@
     5.4          if (ret == null && expRes == null) {
     5.5              return;
     5.6          }
     5.7 +        if (expRes instanceof Double && ret instanceof Number) {
     5.8 +            ret = ((Number)ret).doubleValue();
     5.9 +        }
    5.10          if (expRes.equals(ret)) {
    5.11              return;
    5.12          }