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