emul/src/main/java/java/io/DataInputStream.java
branchjavap
changeset 185 d441042e6c11
parent 149 32653a09f0db
     1.1 --- a/emul/src/main/java/java/io/DataInputStream.java	Sat Nov 10 19:01:28 2012 +0100
     1.2 +++ b/emul/src/main/java/java/io/DataInputStream.java	Sun Nov 18 19:01:38 2012 +0100
     1.3 @@ -25,6 +25,8 @@
     1.4  
     1.5  package java.io;
     1.6  
     1.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.8 +
     1.9  /**
    1.10   * A data input stream lets an application read primitive Java data
    1.11   * types from an underlying input stream in a machine-independent
    1.12 @@ -465,7 +467,41 @@
    1.13       * @see        java.lang.Double#longBitsToDouble(long)
    1.14       */
    1.15      public final double readDouble() throws IOException {
    1.16 -        return Double.longBitsToDouble(readLong());
    1.17 +        int hi = readInt();
    1.18 +        int low = readInt();
    1.19 +        return toDouble(hi, low);
    1.20 +    }
    1.21 +    
    1.22 +    @JavaScriptBody(args={ "hi", "low" },
    1.23 +        body=
    1.24 +          "if (low == 0) {\n"
    1.25 +        + "  if (hi === 0x7ff00000) return Number.POSITIVE_INFINITY;\n"
    1.26 +        + "  if (hi === 0xfff00000) return Number.NEGATIVE_INFINITY;\n"
    1.27 +        + "}\n"
    1.28 +        + "if (hi >= 0x7ff00000 && hi <= 0x7fffffff) return Number.NaN;\n"
    1.29 +        + "if (hi >= 0xfff00000 && hi <= 0xffffffff) return Number.NaN;\n"
    1.30 +        + "var s = (hi & 0x80000000) === 0 ? 1 : -1;\n"
    1.31 +        + "var e = (hi >> 20) & 0x7ff;\n"
    1.32 +        + "var to32 = low >> 0;\n"
    1.33 +        + "if (e === 0) {\n"
    1.34 +        + "  if (to32 & 0x80000000) {\n"
    1.35 +        + "    hi = hi << 1 + 1; low = low << 1;\n"
    1.36 +        + "  } else {\n"
    1.37 +        + "    hi = hi << 1; low = low << 1;\n"
    1.38 +        + "  }\n" 
    1.39 +        + "} else {\n"
    1.40 +        + "    hi = (hi & 0xfffff) | 0x100000;\n"
    1.41 +        + "}\n"
    1.42 +        + "to32 = low >> 0;\n"
    1.43 +        + "var m = Math.pow(2.0, 32) * hi + to32;\n"
    1.44 +        + "var r = s * m * Math.pow(2.0, e - 1075);\n"
    1.45 +        + "//throw 'exp: ' + e + ' sign: ' + s + ' hi:' + hi + ' low: ' + low + ' m: ' + m + ' r: ' + r;\n"
    1.46 +        + "return r;\n"
    1.47 +    )
    1.48 +    private static double toDouble(int hi, int low) {
    1.49 +        long both = hi;
    1.50 +        both = (both << 32) & low;
    1.51 +        return Double.doubleToLongBits(both);
    1.52      }
    1.53  
    1.54      private char lineBuffer[];