js/src/jit-test/tests/ion/bug894786-2.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1
michael@0 2 function f56(x) {
michael@0 3 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 4 var b = 0x800000; // == 2^23 (bits = 24)
michael@0 5 if (a > 0) {
michael@0 6 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 7 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 55)
michael@0 8 var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 56)
michael@0 9 return (d | 0) & 1;
michael@0 10 } else {
michael@0 11 return 1;
michael@0 12 }
michael@0 13 }
michael@0 14
michael@0 15 function f55(x) {
michael@0 16 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 17 var b = 0x400000; // == 2^22 (bits = 23)
michael@0 18 if (a > 0) {
michael@0 19 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 20 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 54)
michael@0 21 var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 55)
michael@0 22 return (d | 0) & 1;
michael@0 23 } else {
michael@0 24 return 1;
michael@0 25 }
michael@0 26 }
michael@0 27
michael@0 28 // Still returns 1, because the top-level bit is not represented.
michael@0 29 function f54(x) {
michael@0 30 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 31 var b = 0x200000; // == 2^21 (bits = 22)
michael@0 32 if (a > 0) {
michael@0 33 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 34 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 53)
michael@0 35 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 54)
michael@0 36 return (d | 0) & 1;
michael@0 37 } else {
michael@0 38 return 1;
michael@0 39 }
michael@0 40 }
michael@0 41
michael@0 42 // Can safely truncate after these operations. (the mantissa has 53 bits)
michael@0 43 function f53(x) {
michael@0 44 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 45 var b = 0x100000; // == 2^20 (bits = 21)
michael@0 46 if (a > 0) {
michael@0 47 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 48 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 52)
michael@0 49 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 53)
michael@0 50 return (d | 0) & 1;
michael@0 51 } else {
michael@0 52 return 1;
michael@0 53 }
michael@0 54 }
michael@0 55
michael@0 56 function f52(x) {
michael@0 57 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 58 var b = 0x80000; // == 2^19 (bits = 20)
michael@0 59 if (a > 0) {
michael@0 60 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 61 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 51)
michael@0 62 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 52)
michael@0 63 return (d | 0) & 1;
michael@0 64 } else {
michael@0 65 return 1;
michael@0 66 }
michael@0 67 }
michael@0 68
michael@0 69 function f51(x) {
michael@0 70 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32)
michael@0 71 var b = 0x40000; // == 2^18 (bits = 19)
michael@0 72 if (a > 0) {
michael@0 73 // Beta node: Range [1 .. UINT32_MAX] (bits = 32)
michael@0 74 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 50)
michael@0 75 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 51)
michael@0 76 return (d | 0) & 1;
michael@0 77 } else {
michael@0 78 return 1;
michael@0 79 }
michael@0 80 }
michael@0 81
michael@0 82 var e = Math.pow(2, 32);
michael@0 83 for (var i = 1; i < e; i = i * 1.5) {
michael@0 84 var x = i >>> 0;
michael@0 85 assertEq(f56(x) , (x >= Math.pow(2, 30)) ? 0 : 1);
michael@0 86 assertEq(f55(x), (x >= Math.pow(2, 31)) ? 0 : 1);
michael@0 87 assertEq(f54(x), 1);
michael@0 88 assertEq(f53(x), 1);
michael@0 89 assertEq(f52(x), 1);
michael@0 90 assertEq(f51(x), 1);
michael@0 91 }

mercurial