1f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
2f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// Redistribution and use in source and binary forms, with or without
3f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// modification, are permitted provided that the following conditions are
4f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// met:
5f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//
6f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//     * Redistributions of source code must retain the above copyright
7f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       notice, this list of conditions and the following disclaimer.
8f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//     * Redistributions in binary form must reproduce the above
9f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       copyright notice, this list of conditions and the following
10f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       disclaimer in the documentation and/or other materials provided
11f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       with the distribution.
12f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//     * Neither the name of Google Inc. nor the names of its
13f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       contributors may be used to endorse or promote products derived
14f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//       from this software without specific prior written permission.
15f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org//
16f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
28f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org// Check pops with various number of arguments.
29f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org(function() {
30f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  var a = [];
31f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  for (var i = 0; i < 7; i++) {
32f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    a = [7, 6, 5, 4, 3, 2, 1];
33f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
34f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(1, a.pop(), "1st pop");
35f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(6, a.length, "length 1st pop");
36f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
37f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(2, a.pop(1), "2nd pop");
38f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(5, a.length, "length 2nd pop");
39f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
40f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(3, a.pop(1, 2), "3rd pop");
41f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(4, a.length, "length 3rd pop");
42f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
43f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(4, a.pop(1, 2, 3), "4th pop");
44f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(3, a.length, "length 4th pop");
45f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
46f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(5, a.pop(), "5th pop");
47f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(2, a.length, "length 5th pop");
48f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
49f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(6, a.pop(), "6th pop");
50f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(1, a.length, "length 6th pop");
51f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
52f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(7, a.pop(), "7th pop");
53f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(0, a.length, "length 7th pop");
54f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
55f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(undefined, a.pop(), "8th pop");
56f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(0, a.length, "length 8th pop");
57f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
58f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(undefined, a.pop(1, 2, 3), "9th pop");
59f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    assertEquals(0, a.length, "length 9th pop");
60f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  }
61ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
62ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  // Check that pop works on inherited properties.
63ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  for (var i = 0; i < 10 ;i++) {  // Ensure ICs are stabilized.
64ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype[1] = 1;
65ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype[3] = 3;
66ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype[5] = 5;
67ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype[7] = 7;
68ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype[9] = 9;
69ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    a = [0,1,2,,4,,6,7,8,,];
70ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    assertEquals(10, a.length, "inherit-initial-length");
71ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    for (var j = 9; j >= 0; j--) {
72ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertEquals(j + 1, a.length, "inherit-pre-length-" + j);
73ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertTrue(j in a, "has property " + j);
74ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      var own = a.hasOwnProperty(j);
75ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      var inherited = Array.prototype.hasOwnProperty(j);
76ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertEquals(j, a.pop(), "inherit-pop");
77ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertEquals(j, a.length, "inherit-post-length");
78ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertFalse(a.hasOwnProperty(j), "inherit-deleted-own-" + j);
79ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      assertEquals(inherited, Array.prototype.hasOwnProperty(j),
80ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org                   "inherit-not-deleted-inherited" + j);
81ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    }
82ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    Array.prototype.length = 0;  // Clean-up.
83ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  }
84dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
85dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  // Check that pop works on inherited properties for
86dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  // arrays with array prototype.
87dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  for (var i = 0; i < 10 ;i++) {  // Ensure ICs are stabilized.
88dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    var array_proto = [];
89dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array_proto[1] = 1;
90dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array_proto[3] = 3;
91dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array_proto[5] = 5;
92dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array_proto[7] = 7;
93dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array_proto[9] = 9;
94dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    a = [0,1,2,,4,,6,7,8,,];
95dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    a.__proto__ = array_proto;
96dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    assertEquals(10, a.length, "array_proto-inherit-initial-length");
97dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    for (var j = 9; j >= 0; j--) {
98dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertEquals(j + 1, a.length, "array_proto-inherit-pre-length-" + j);
99dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertTrue(j in a, "array_proto-has property " + j);
100dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      var own = a.hasOwnProperty(j);
101dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      var inherited = array_proto.hasOwnProperty(j);
102dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertEquals(j, a.pop(), "array_proto-inherit-pop");
103dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertEquals(j, a.length, "array_proto-inherit-post-length");
104dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertFalse(a.hasOwnProperty(j), "array_proto-inherit-deleted-own-" + j);
105dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      assertEquals(inherited, array_proto.hasOwnProperty(j),
106dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org                   "array_proto-inherit-not-deleted-inherited" + j);
107dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    }
108dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  }
109dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
110dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  // Check that pop works on inherited properties for
111dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  // arrays with array prototype.
112f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org})();
113c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org
114c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org// Test the case of not JSArray receiver.
115c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org// Regression test for custom call generators, see issue 684.
116c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org(function() {
117c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  var a = [];
118c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  for (var i = 0; i < 100; i++) a.push(i);
119c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  var x = {__proto__: a};
120c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  for (var i = 0; i < 100; i++) {
121c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org    assertEquals(99 - i, x.pop(), i + 'th iteration');
122c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org  }
123c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org})();
124