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[];