1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 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 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction check_enumeration_order(obj) { 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var value = 0; 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var name in obj) assertTrue(value < obj[name]); 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value = obj[name]; 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction make_object(size) { 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var a = new Object(); 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i++) a["a_" + i] = i + 1; 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block check_enumeration_order(a); 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i +=3) delete a["a_" + i]; 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block check_enumeration_order(a); 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Validate the enumeration order for object up to 100 named properties. 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfor (var j = 1; j< 100; j++) make_object(j); 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction make_literal_object(size) { 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var code = "{ "; 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size-1; i++) code += " a_" + i + " : " + (i + 1) + ", "; 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block code += "a_" + (size - 1) + " : " + size; 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block code += " }"; 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block eval("var a = " + code); 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block check_enumeration_order(a); 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Validate the enumeration order for object literals up to 100 named 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties. 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfor (var j = 1; j< 100; j++) make_literal_object(j); 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// We enumerate indexed properties in numerical order followed by 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// named properties in insertion order, followed by indexed properties 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of the prototype object in numerical order, followed by named 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties of the prototype object in insertion order, and so on. 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This enumeration order is not required by the specification, so 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this just documents our choice. 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar proto2 = {}; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2[140000] = 0; 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2.a = 0; 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2[2] = 0; 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2[3] = 0; // also on the 'proto1' object 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2.b = 0; 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2[4294967295] = 0; 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2.c = 0; 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto2[4294967296] = 0; 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar proto1 = {}; 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1[5] = 0; 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1.d = 0; 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1[3] = 0; 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1.e = 0; 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1.f = 0; // also on the 'o' object 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar o = {}; 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko[-23] = 0; 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko[300000000000] = 0; 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko[23] = 0; 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko.f = 0; 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko.g = 0; 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko[-4] = 0; 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko[42] = 0; 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocko.__proto__ = proto1; 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockproto1.__proto__ = proto2; 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar expected = ['23', '42', // indexed from 'o' 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block '-23', '300000000000', 'f', 'g', '-4', // named from 'o' 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block '3', '5', // indexed from 'proto1' 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 'd', 'e', // named from 'proto1' 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block '2', '140000', '4294967295', // indexed from 'proto2' 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 'a', 'b', 'c', '4294967296']; // named from 'proto2' 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar actual = []; 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfor (var p in o) actual.push(p); 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertArrayEquals(expected, actual); 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110