# HG changeset patch # User Jaroslav Tulach # Date 1353229223 -3600 # Node ID f426de5dc7f6329a9d78e894de5a0af6c78c1f69 # Parent 23d9144d8f452859bd30da48fece38647ddb7e4f Can deserialize float diff -r 23d9144d8f45 -r f426de5dc7f6 emul/src/main/java/java/lang/Float.java --- a/emul/src/main/java/java/lang/Float.java Sun Nov 18 08:58:16 2012 +0100 +++ b/emul/src/main/java/java/lang/Float.java Sun Nov 18 10:00:23 2012 +0100 @@ -819,6 +819,18 @@ * @return the {@code float} floating-point value with the same bit * pattern. */ + @JavaScriptBody(args = "bits", + body = + "if (bits === 0x7f800000) return Number.POSITIVE_INFINITY;\n" + + "if (bits === 0xff800000) return Number.NEGATIVE_INFINITY;\n" + + "if (bits >= 0x7f800001 && bits <= 0xffffffff) return Number.NaN;\n" + + "var s = ((bits >> 31) == 0) ? 1 : -1;\n" + + "var e = ((bits >> 23) & 0xff);\n" + + "var m = (e == 0) ?\n" + + " (bits & 0x7fffff) << 1 :\n" + + " (bits & 0x7fffff) | 0x800000;\n" + + "return s * m * Math.pow(2.0, e - 150);\n" + ) public static native float intBitsToFloat(int bits); /** diff -r 23d9144d8f45 -r f426de5dc7f6 vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Sun Nov 18 08:58:16 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java Sun Nov 18 10:00:23 2012 +0100 @@ -64,6 +64,26 @@ Double.valueOf(3.0), 303, 10 ); } + + @Test public void deserializeInt() throws Exception { + int exp = Numbers.deserInt(); + assertExec("Should be the same", "org_apidesign_vm4brwsr_Numbers_deserIntI", + Double.valueOf(exp) + ); + } + + @Test public void deserializeFloatInJava() throws Exception { + float f = 54324.32423f; + float r = Numbers.deserFloat(); + assertEquals(r, f, "Floats are the same"); + } + + @Test public void deserializeFloatInJS() throws Exception { + float f = 54324.32423f; + assertExec("Should be the same", "org_apidesign_vm4brwsr_Numbers_deserFloatF", + Double.valueOf(f) + ); + } private static CharSequence codeSeq; diff -r 23d9144d8f45 -r f426de5dc7f6 vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Sun Nov 18 08:58:16 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Numbers.java Sun Nov 18 10:00:23 2012 +0100 @@ -17,6 +17,10 @@ */ package org.apidesign.vm4brwsr; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + /** * * @author Jaroslav Tulach @@ -31,4 +35,19 @@ public static int rem(int a, int b) { return a % b; } + + static float deserFloat() throws IOException { + byte[] arr = {(byte) 71, (byte) 84, (byte) 52, (byte) 83}; + ByteArrayInputStream is = new ByteArrayInputStream(arr); + DataInputStream dis = new DataInputStream(is); + float r = dis.readFloat(); + return r; + } + static int deserInt() throws IOException { + byte[] arr = {(byte) 71, (byte) 84, (byte) 52, (byte) 83}; + ByteArrayInputStream is = new ByteArrayInputStream(arr); + DataInputStream dis = new DataInputStream(is); + return dis.readInt(); + } + }