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