Proper implementation of round and toInt32 conversions
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 26 Feb 2013 14:55:55 +0100
changeset 7714252bfc396fc
parent 758 caedc26b6dbf
child 772 d382dacfd73f
Proper implementation of round and toInt32 conversions
emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/JFXIssuesTest.java
emul/mini/src/main/java/java/lang/Math.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/JFXIssuesTest.java	Mon Feb 25 19:27:32 2013 +0100
     1.2 +++ b/emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/JFXIssuesTest.java	Tue Feb 26 14:55:55 2013 +0100
     1.3 @@ -54,7 +54,30 @@
     1.4  
     1.5          return l1 == l2;
     1.6      }
     1.7 +    
     1.8 +    @Compare public boolean roundOnDouble() {
     1.9 +        long l1 = Math.round(System.currentTimeMillis() / 1.1);
    1.10 +        long l2 = l1 + 0;
    1.11 +        
    1.12 +        return l1 == l2;
    1.13 +    }
    1.14  
    1.15 +    private static long val = 1238078409318L;
    1.16 +    
    1.17 +    @Compare public int valueConvertedToString() {
    1.18 +        return (int) val++;
    1.19 +    }
    1.20 +    
    1.21 +    @Compare public boolean roundOnFloat() {
    1.22 +        final float f = System.currentTimeMillis() / 1.1f;
    1.23 +        int l1 = Math.round(f);
    1.24 +        int l2 = l1 + 0;
    1.25 +        
    1.26 +        assert l1 == l2 : "Round " + l1 + " == " + l2;
    1.27 +        
    1.28 +        return l1 == l2;
    1.29 +    }
    1.30 +    
    1.31      @Factory public static Object[] create() {
    1.32          return VMTest.create(JFXIssuesTest.class);
    1.33      }
     2.1 --- a/emul/mini/src/main/java/java/lang/Math.java	Mon Feb 25 19:27:32 2013 +0100
     2.2 +++ b/emul/mini/src/main/java/java/lang/Math.java	Tue Feb 26 14:55:55 2013 +0100
     2.3 @@ -643,9 +643,8 @@
     2.4       * @see     java.lang.Integer#MAX_VALUE
     2.5       * @see     java.lang.Integer#MIN_VALUE
     2.6       */
     2.7 -    @JavaScriptBody(args="a", body="return Math.round(a);")
     2.8      public static int round(float a) {
     2.9 -        throw new UnsupportedOperationException();
    2.10 +        return (int)roundDbl(a);
    2.11      }
    2.12  
    2.13      /**
    2.14 @@ -668,10 +667,12 @@
    2.15       * @see     java.lang.Long#MAX_VALUE
    2.16       * @see     java.lang.Long#MIN_VALUE
    2.17       */
    2.18 +    public static long round(double a) {
    2.19 +        return (long)roundDbl(a);
    2.20 +    }
    2.21 +    
    2.22      @JavaScriptBody(args="a", body="return Math.round(a);")
    2.23 -    public static long round(double a) {
    2.24 -        throw new UnsupportedOperationException();
    2.25 -    }
    2.26 +    private static native double roundDbl(double d);
    2.27  
    2.28  //    private static Random randomNumberGenerator;
    2.29  //
     3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Feb 25 19:27:32 2013 +0100
     3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Feb 26 14:55:55 2013 +0100
     3.3 @@ -691,7 +691,7 @@
     3.4                      emit(out, "var @2 = @1;", smapper.popD(), smapper.pushF());
     3.5                      break;
     3.6                  case opc_f2i:
     3.7 -                    emit(out, "var @2 = Math.floor(@1);",
     3.8 +                    emit(out, "var @2 = Math.floor(@1).toInt32();",
     3.9                           smapper.popF(), smapper.pushI());
    3.10                      break;
    3.11                  case opc_f2l:
    3.12 @@ -699,7 +699,7 @@
    3.13                           smapper.popF(), smapper.pushL());
    3.14                      break;
    3.15                  case opc_d2i:
    3.16 -                    emit(out, "var @2 = Math.floor(@1);",
    3.17 +                    emit(out, "var @2 = Math.floor(@1).toInt32();",
    3.18                           smapper.popD(), smapper.pushI());
    3.19                      break;
    3.20                  case opc_d2l: