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