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.

     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 }

mercurial