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