1e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// Copyright 2009 the V8 project authors. All rights reserved.
2e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// Redistribution and use in source and binary forms, with or without
3e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// modification, are permitted provided that the following conditions are
4e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// met:
5e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//
6e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//     * Redistributions of source code must retain the above copyright
7e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       notice, this list of conditions and the following disclaimer.
8e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//     * Redistributions in binary form must reproduce the above
9e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       copyright notice, this list of conditions and the following
10e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       disclaimer in the documentation and/or other materials provided
11e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       with the distribution.
12e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//     * Neither the name of Google Inc. nor the names of its
13e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       contributors may be used to endorse or promote products derived
14e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//       from this software without specific prior written permission.
15e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke//
16e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
28e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkefunction testBitNot(x, name) {
29e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // The VM constant folds so we use that to check the result.
30e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  var expected = eval("~(" + x + ")");
31e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  var actual = ~x;
32e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  assertEquals(expected, actual, "x: " + name);
33e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
34e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // Test the path where we can overwrite the result. Use -
35e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // to avoid concatenating strings.
36e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  expected = eval("~(" + x + " - 0.01)");
37e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  actual = ~(x - 0.01);
38e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  assertEquals(expected, actual, "x - 0.01: " + name);
39e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
40e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
41e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
42e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0, 0);
43e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(1, 1);
44e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(-1, 1);
45e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(100, 100);
46e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x40000000, "0x40000000");
47e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x7fffffff, "0x7fffffff");
48e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x80000000, "0x80000000");
49e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
50e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(2.2, 2.2);
51e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(-2.3, -2.3);
52e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(Infinity, "Infinity");
53e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(NaN, "NaN");
54e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(-Infinity, "-Infinity");
55e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x40000000 + 0.12345, "float1");
56e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x40000000 - 0.12345, "float2");
57e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x7fffffff + 0.12345, "float3");
58e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x7fffffff - 0.12345, "float4");
59e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x80000000 + 0.12345, "float5");
60e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot(0x80000000 - 0.12345, "float6");
61e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
62e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot("0", "string0");
63e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot("2.3", "string2.3");
64e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarketestBitNot("-9.4", "string-9.4");
65e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
66e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
67e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// Try to test that we can deal with allocation failures in
68e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// the fast path and just use the slow path instead.
69e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkefunction TryToGC() {
70e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  var x = 0x40000000;
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Put in an eval to foil Crankshaft.
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  eval("");
73e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  for (var i = 0; i < 1000000; i++) {
74e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    assertEquals(~0x40000000, ~x);
75e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  }
76e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
77e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeTryToGC();
78