// Copyright 2009 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Test operations that involve one or more constants. // The code generator now handles compile-time constants specially. // Test the code generated when operands are known at compile time // Test count operations involving constants function test_count() { var x = "foo"; var y = "3"; x += x++; // ++ and -- apply ToNumber to their operand, even for postfix. assertEquals(x, "fooNaN", "fooNaN test"); x = "luft"; x += ++x; assertEquals(x, "luftNaN", "luftNaN test"); assertTrue(y++ === 3, "y++ === 3, where y = \"3\""); y = 3; assertEquals(y++, 3, "y++ == 3, where y = 3"); y = "7.1"; assertTrue(y++ === 7.1, "y++ === 7.1, where y = \"7.1\""); var z = y = x = "9"; assertEquals( z++ + (++y) + x++, 28, "z++ + (++y) + x++ == 28"); z = y = x = 13; assertEquals( z++ + (++y) + x++, 40, "z++ + (++y) + x++ == 40"); z = y = x = -5.5; assertEquals( z++ + (++y) + x++, -15.5, "z++ + (++y) + x++ == -15.5"); assertEquals(y, -4.5); z = y; z++; assertEquals(y, -4.5); z = y; y++; assertEquals(z, -4.5); y = 20; z = y; z++; assertEquals(y, 20); z = y; y++; assertEquals(z, 20); const w = 30; assertEquals(w++, 30); assertEquals(++w, 31); assertEquals(++w, 31); } test_count(); // Test comparison operations that involve one or two constant smis. function test() { var i = 5; var j = 3; assertTrue( j < i ); i = 5; j = 3; assertTrue( j <= i ); i = 5; j = 3; assertTrue( i > j ); i = 5; j = 3; assertTrue( i >= j ); i = 5; j = 3; assertTrue( i != j ); i = 5; j = 3; assertTrue( i == i ); i = 5; j = 3; assertFalse( i < j ); i = 5; j = 3; assertFalse( i <= j ); i = 5; j = 3; assertFalse( j > i ); i = 5; j = 3; assertFalse(j >= i ); i = 5; j = 3; assertFalse( j == i); i = 5; j = 3; assertFalse( i != i); i = 10 * 10; while ( i < 107 ) { ++i; } j = 21; assertTrue( j < i ); j = 21; assertTrue( j <= i ); j = 21; assertTrue( i > j ); j = 21; assertTrue( i >= j ); j = 21; assertTrue( i != j ); j = 21; assertTrue( i == i ); j = 21; assertFalse( i < j ); j = 21; assertFalse( i <= j ); j = 21; assertFalse( j > i ); j = 21; assertFalse(j >= i ); j = 21; assertFalse( j == i); j = 21; assertFalse( i != i); j = 21; assertTrue( j == j ); j = 21; assertFalse( j != j ); assertTrue( 100 > 99 ); assertTrue( 101 >= 90 ); assertTrue( 11111 > -234 ); assertTrue( -888 <= -20 ); while ( 234 > 456 ) { i = i + 1; } switch(3) { case 5: assertUnreachable(); break; case 3: j = 13; default: i = 2; case 7: j = 17; break; case 9: j = 19; assertUnreachable(); break; } assertEquals(17, j, "switch with constant value"); } test();