1ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Copyright 2009 the V8 project authors. All rights reserved. 2ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Redistribution and use in source and binary forms, with or without 3ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// modification, are permitted provided that the following conditions are 4ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// met: 5ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// 6ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// * Redistributions of source code must retain the above copyright 7ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// notice, this list of conditions and the following disclaimer. 8ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// * Redistributions in binary form must reproduce the above 9ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// copyright notice, this list of conditions and the following 10ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// disclaimer in the documentation and/or other materials provided 11ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// with the distribution. 12ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// * Neither the name of Google Inc. nor the names of its 13ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// contributors may be used to endorse or promote products derived 14ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// from this software without specific prior written permission. 15ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// 16ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 28a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org// Flags: --allow-natives-syntax 29a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 30ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Test the handling of initialization of deleted const variables. 31ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// This only makes sense in local scopes since the declaration and 32ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// initialization of consts in the global scope happen at the same 33ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// time. 34ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 35ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testIntroduceGlobal() { 36ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = 37ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Deleting 'x' removes the local const property. 38ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "delete x;" + 399bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Initialization redefines global 'x'. 40ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "const x = 3; assertEquals(3, x);" + 419bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Test constness of the global 'x'. 429bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org "x = 4; assertEquals(3, x);"; 43ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 44ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 45ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 46ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestIntroduceGlobal(); 479bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgassertEquals("undefined", typeof x); 48ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 49ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testAssignExistingGlobal() { 50ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = 51ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Delete 'x' to remove the local const property. 52ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "delete x;" + 539bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Initialization redefines global 'x'. 54ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "const x = 5; assertEquals(5, x);" + 559bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Test constness of the global 'x'. 569bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org "x = 6; assertEquals(5, x);"; 57ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 58ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 59ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 60ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestAssignExistingGlobal(); 619bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgassertEquals("undefined", typeof x); 62ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 63ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testAssignmentArgument(x) { 64ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org function local() { 65ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = "delete x; const x = 7; assertEquals(7, x)"; 66ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 67ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 68ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org local(); 699bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org assertEquals("undefined", typeof x); 70ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 71ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 72a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgfor (var i = 0; i < 5; i++) { 73d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org testAssignmentArgument(); 74d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org} 75a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org%OptimizeFunctionOnNextCall(testAssignmentArgument); 76a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgtestAssignmentArgument(); 779bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgassertEquals("undefined", typeof x); 78ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 79ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org__defineSetter__('x', function() { throw 42; }); 809bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgvar finished = false; 819bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgfunction testRedefineGlobal() { 829bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Initialization redefines global 'x'. 839bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org var source = "delete x; const x = 8; finished = true;"; 84ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 85ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 86ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 879bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgtestRedefineGlobal(); 889bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgassertTrue(finished); 89ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 90ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testInitFastCaseExtension() { 91ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = "const x = 9; assertEquals(9, x); x = 10; assertEquals(9, x)"; 92ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 93ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 94ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 95ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestInitFastCaseExtension(); 96ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 97ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testInitSlowCaseExtension() { 98ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = ""; 99ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Introduce 100 properties on the context extension object to force 100ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // it in slow case. 1012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org for (var i = 0; i < 100; i++) source += ("var a" + i + " = " + i + ";"); 102ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org source += "const x = 10; assertEquals(10, x); x = 11; assertEquals(10, x)"; 103ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 104ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 105ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 106ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestInitSlowCaseExtension(); 107ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 108ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction testAssignSurroundingContextSlot() { 109ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var x = 12; 110ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org function local() { 111ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org var source = "delete x; const x = 13; assertEquals(13, x)"; 112ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org eval(source); 113ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 114ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org local(); 1159bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org assertEquals(12, x); 116ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 117ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 118ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtestAssignSurroundingContextSlot(); 119