1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2009 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Flags: --allow-natives-syntax
298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test the handling of initialization of deleted const variables.
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This only makes sense in local scopes since the declaration and
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// initialization of consts in the global scope happen at the same
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// time.
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testIntroduceGlobal() {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var source =
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Deleting 'x' removes the local const property.
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      "delete x;" +
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Initialization redefines global 'x'.
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      "const x = 3; assertEquals(3, x);" +
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Test constness of the global 'x'.
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "x = 4; assertEquals(3, x);";
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval(source);
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestIntroduceGlobal();
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("undefined", typeof x);
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testAssignExistingGlobal() {
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var source =
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Delete 'x' to remove the local const property.
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      "delete x;" +
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Initialization redefines global 'x'.
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      "const x = 5; assertEquals(5, x);" +
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Test constness of the global 'x'.
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "x = 6; assertEquals(5, x);";
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval(source);
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestAssignExistingGlobal();
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("undefined", typeof x);
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testAssignmentArgument(x) {
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function local() {
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var source = "delete x; const x = 7; assertEquals(7, x)";
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval(source);
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  local();
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals("undefined", typeof x);
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfor (var i = 0; i < 5; i++) {
7380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  testAssignmentArgument();
7480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch%OptimizeFunctionOnNextCall(testAssignmentArgument);
768b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignmentArgument();
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("undefined", typeof x);
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block__defineSetter__('x', function() { throw 42; });
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar finished = false;
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction testRedefineGlobal() {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Initialization redefines global 'x'.
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var source = "delete x; const x = 8; finished = true;";
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval(source);
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochtestRedefineGlobal();
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(finished);
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testInitFastCaseExtension() {
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var source = "const x = 9; assertEquals(9, x); x = 10; assertEquals(9, x)";
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval(source);
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestInitFastCaseExtension();
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testInitSlowCaseExtension() {
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var source = "";
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Introduce 100 properties on the context extension object to force
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // it in slow case.
1017f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  for (var i = 0; i < 100; i++) source += ("var a" + i + " = " + i + ";");
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  source += "const x = 10; assertEquals(10, x); x = 11; assertEquals(10, x)";
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  eval(source);
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestInitSlowCaseExtension();
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testAssignSurroundingContextSlot() {
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var x = 12;
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function local() {
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var source = "delete x; const x = 13; assertEquals(13, x)";
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    eval(source);
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  local();
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(12, x);
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestAssignSurroundingContextSlot();
119