mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 19:53:50 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			228 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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);
 | |
| }
 | |
| 
 | |
| 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");
 | |
| }
 | |
| 
 | |
| 
 | |
| function TrueToString() {
 | |
|   return true.toString();
 | |
| }
 | |
| 
 | |
| 
 | |
| function FalseToString() {
 | |
|   return false.toString();
 | |
| }
 | |
| 
 | |
| 
 | |
| function BoolTest() {
 | |
|   assertEquals("true", TrueToString());
 | |
|   assertEquals("true", TrueToString());
 | |
|   assertEquals("true", TrueToString());
 | |
|   assertEquals("false", FalseToString());
 | |
|   assertEquals("false", FalseToString());
 | |
|   assertEquals("false", FalseToString());
 | |
|   Boolean.prototype.toString = function() { return "foo"; }
 | |
|   assertEquals("foo", TrueToString());
 | |
|   assertEquals("foo", FalseToString());
 | |
| }
 | |
| 
 | |
| 
 | |
| // Some tests of shifts that get into the corners in terms of coverage.
 | |
| // We generate different code for the case where the operand is a constant.
 | |
| function ShiftTest() {
 | |
|   var x = 123;
 | |
|   assertEquals(x, x >> 0);
 | |
|   assertEquals(x, x << 0);
 | |
|   assertEquals(x, x >>> 0);
 | |
|   assertEquals(61, x >> 1);
 | |
|   assertEquals(246, x << 1);
 | |
|   assertEquals(61, x >>> 1);
 | |
|   x = -123;
 | |
|   assertEquals(x, x >> 0);
 | |
|   assertEquals(x, x << 0);
 | |
|   assertEquals(0x10000 * 0x10000 + x, x >>> 0);
 | |
|   assertEquals(-62, x >> 1);
 | |
|   assertEquals(-246, x << 1);
 | |
|   assertEquals(0x10000 * 0x8000 - 62, x >>> 1);
 | |
|   // Answer is non-Smi so the subtraction is not folded in the code
 | |
|   // generator.
 | |
|   assertEquals(-0x40000001, -0x3fffffff - 2);
 | |
| 
 | |
|   x = 123;
 | |
|   assertEquals(0, x & 0);
 | |
| 
 | |
|   // Answer is non-smi and lhs of << is a temporary heap number that we can
 | |
|   // overwrite.
 | |
|   x = 123.0001;
 | |
|   assertEquals(1073741824, (x * x) << 30);
 | |
|   x = 123;
 | |
|   // Answer is non-smi and lhs of << is a temporary heap number that we think
 | |
|   // we can overwrite (but we can't because it's a Smi).
 | |
|   assertEquals(1073741824, (x * x) << 30);
 | |
| }
 | |
| 
 | |
| 
 | |
| test();
 | |
| BoolTest();
 | |
| ShiftTest();
 |