| // Copyright 2010 the V8 project authors. All rights reserved. |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following |
| // disclaimer in the documentation and/or other materials provided |
| // with the distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived |
| // from this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| // Check that shifting array of holes keeps it as array of holes |
| (function() { |
| var array = new Array(10); |
| array.shift(); |
| assertFalse(0 in array); |
| })(); |
| |
| // Now check the case with array of holes and some elements on prototype. |
| (function() { |
| var len = 9; |
| var array = new Array(len); |
| Array.prototype[3] = "@3"; |
| Array.prototype[7] = "@7"; |
| |
| assertEquals(len, array.length); |
| for (var i = 0; i < array.length; i++) { |
| assertEquals(array[i], Array.prototype[i]); |
| } |
| |
| array.shift(); |
| |
| assertEquals(len - 1, array.length); |
| // Note that shift copies values from prototype into the array. |
| assertEquals(array[2], Array.prototype[3]); |
| assertTrue(array.hasOwnProperty(2)); |
| |
| assertEquals(array[6], Array.prototype[7]); |
| assertTrue(array.hasOwnProperty(6)); |
| |
| // ... but keeps the rest as holes: |
| Array.prototype[5] = "@5"; |
| assertEquals(array[5], Array.prototype[5]); |
| assertFalse(array.hasOwnProperty(5)); |
| |
| assertEquals(array[3], Array.prototype[3]); |
| assertFalse(array.hasOwnProperty(3)); |
| |
| assertEquals(array[7], Array.prototype[7]); |
| assertFalse(array.hasOwnProperty(7)); |
| |
| assertTrue(delete Array.prototype[3]); |
| assertTrue(delete Array.prototype[5]); |
| assertTrue(delete Array.prototype[7]); |
| })(); |
| |
| // Now check the case with array of holes and some elements on prototype |
| // which is an array itself. |
| (function() { |
| var len = 9; |
| var array = new Array(len); |
| var array_proto = new Array(); |
| array_proto[3] = "@3"; |
| array_proto[7] = "@7"; |
| array.__proto__ = array_proto; |
| |
| assertEquals(len, array.length); |
| for (var i = 0; i < array.length; i++) { |
| assertEquals(array[i], array_proto[i]); |
| } |
| |
| array.shift(); |
| |
| assertEquals(len - 1, array.length); |
| // Note that shift copies values from prototype into the array. |
| assertEquals(array[2], array_proto[3]); |
| assertTrue(array.hasOwnProperty(2)); |
| |
| assertEquals(array[6], array_proto[7]); |
| assertTrue(array.hasOwnProperty(6)); |
| |
| // ... but keeps the rest as holes: |
| array_proto[5] = "@5"; |
| assertEquals(array[5], array_proto[5]); |
| assertFalse(array.hasOwnProperty(5)); |
| |
| assertEquals(array[3], array_proto[3]); |
| assertFalse(array.hasOwnProperty(3)); |
| |
| assertEquals(array[7], array_proto[7]); |
| assertFalse(array.hasOwnProperty(7)); |
| })(); |
| |
| // Check that non-enumerable elements are treated appropriately |
| (function() { |
| var array = [1, 2, 3]; |
| Object.defineProperty(array, '1', {enumerable: false}); |
| assertEquals(1, array.shift()); |
| assertEquals([2, 3], array); |
| |
| array = [1,,3]; |
| array.__proto__[1] = 2; |
| Object.defineProperty(array.__proto__, '1', {enumerable: false}); |
| assertEquals(1, array.shift()); |
| assertEquals([2, 3], array); |
| })(); |