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