1ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
2ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Redistribution and use in source and binary forms, with or without
3ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// modification, are permitted provided that the following conditions are
4ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// met:
5ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//
6ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//     * Redistributions of source code must retain the above copyright
7ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       notice, this list of conditions and the following disclaimer.
8ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//     * Redistributions in binary form must reproduce the above
9ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       copyright notice, this list of conditions and the following
10ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       disclaimer in the documentation and/or other materials provided
11ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       with the distribution.
12ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//     * Neither the name of Google Inc. nor the names of its
13ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       contributors may be used to endorse or promote products derived
14ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//       from this software without specific prior written permission.
15ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//
16ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
28ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org////////////////////////////////////////////////////////////////////////
29ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Tests below verify that elements set on Array.prototype's proto propagate
30ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// for various Array.prototype functions (like unshift, shift, etc.)
31ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// If add any new tests here, consider adding them to all other files:
32ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//   array-elements-from-array-prototype.js
33ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//   array-elements-from-array-prototype-chain.js
34ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//   array-elements-from-object-prototype.js
35ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// those ideally should be identical modulo host of elements and
36ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// the way elements introduced.
37ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//
38ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Note: they are put into a separate file as we need maximally clean
39ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// VM setup---some optimizations might be already turned off in
40ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 'dirty' VM.
41ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org////////////////////////////////////////////////////////////////////////
42ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
43ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar at3 = '@3'
44ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar at7 = '@7'
45ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
46ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgArray.prototype.__proto__ = {3: at3};
47ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgArray.prototype.__proto__.__proto__ = {7: at7};
48ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
49ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a = new Array(13)
50ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
51ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3])
52ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3))
53ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
54ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7])
55ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7))
56ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
57ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a.shift(), 'hole should be returned as undefined')
58ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: Array.prototype[3] percolates into a[2] and Array.prototype[7[
59ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// into a[6], still visible at the corresponding indices.
60ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
61ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[2])
62ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(2))
63ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3])
64ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3))
65ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
66ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[6])
67ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(6))
68ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7])
69ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7))
70ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
71ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orga.unshift('foo', 'bar')
72ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: Array.prototype[3] now percolates into a[5] and Array.prototype[7]
73ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// into a[9].
74ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
75ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3])
76ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3))
77ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[4])
78ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(4))
79ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[5])
80ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(5))
81ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
82ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a[6])
83ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(6))
84ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
85ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7])
86ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7))
87ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[8])
88ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(8))
89ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[9])
90ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(9))
91ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
92ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar sliced = a.slice(3, 10)
93ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Slice must keep intact a and reify holes at indices 0--2 and 4--6.
94ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
95ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3])
96ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3))
97ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[4])
98ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(4))
99ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[5])
100ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(5))
101ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
102ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a[6])
103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(6))
104ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
105ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7])
106ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7))
107ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[8])
108ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(8))
109ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[9])
110ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(9))
111ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
112ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[0])
113ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(0))
114ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[1])
115ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(1))
116ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[2])
117ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(2))
118ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
119ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Note: sliced[3] comes directly from Array.prototype[3]
120ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[3]);
121ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(sliced.hasOwnProperty(3))
122ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
123ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[4])
124ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(4))
125ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[5])
126ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(5))
127ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[6])
128ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(6))
129ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
130ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
131ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Splice is too complicated the operation, start afresh.
132ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
133ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Shrking array.
134ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a0 = [0, 1, , , 4, 5, , , , 9]
135ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar result = a0.splice(4, 1)
136ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: everything before 4 is kept intact:
137ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
138ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(0, a0[0])
139ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(0))
140ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(1, a0[1])
141ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(1))
142ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a0[2])
143ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(2))
144ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a0[3])
145ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(3))
146ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
147ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 4 and above shifted left by one reifying at7 into a0[6] and keeping
148ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// a hole at a0[7]
149ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
150ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(5, a0[4])
151ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(4))
152ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a0[5])
153ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(5))
154ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a0[6])
155ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(6))
156ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a0[7])
157ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(7))
158ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(9, a0[8])
159ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(8))
160ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
161ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Growing array.
162ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a1 = [0, 1, , , 4, 5, , , , 9]
163ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar result = a1.splice(4, 0, undefined)
164ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: everything before 4 is kept intact:
165ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
166ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(0, a1[0])
167ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(0))
168ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(1, a1[1])
169ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(1))
170ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[2])
171ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(2))
172ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a1[3])
173ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(3))
174ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
175ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Now owned undefined resides at 4 and rest is shifted right by one
176ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// reifying at7 into a0[8] and keeping a hole at a0[7].
177ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
178ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[4])
179ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(4))
180ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(4, a1[5])
181ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(5))
182ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(5, a1[6])
183ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(6))
184ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a1[7])
185ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(7))
186ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a1[8])
187ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(8))
188ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[9])
189ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(9))
190ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(9, a1[10])
191ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(10))
192