Index: test/mjsunit/enumeration-order.js |
=================================================================== |
--- test/mjsunit/enumeration-order.js (revision 1718) |
+++ test/mjsunit/enumeration-order.js (working copy) |
@@ -26,17 +26,17 @@ |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
function check_enumeration_order(obj) { |
- var value = 0; |
+ var value = 0; |
for (var name in obj) assertTrue(value < obj[name]); |
value = obj[name]; |
} |
function make_object(size) { |
var a = new Object(); |
- |
+ |
for (var i = 0; i < size; i++) a["a_" + i] = i + 1; |
check_enumeration_order(a); |
- |
+ |
for (var i = 0; i < size; i +=3) delete a["a_" + i]; |
check_enumeration_order(a); |
} |
@@ -51,9 +51,58 @@ |
code += "a_" + (size - 1) + " : " + size; |
code += " }"; |
eval("var a = " + code); |
- check_enumeration_order(a); |
+ check_enumeration_order(a); |
} |
// Validate the enumeration order for object literals up to 100 named properties. |
Kasper Lund
2009/04/16 11:22:04
Long line. Not your fault.
|
for (var j = 1; j< 100; j++) make_literal_object(j); |
+// We enumerate indexed properties in numerical order followed by |
+// named properties in insertion order, followed by indexed properties |
+// of the prototype object in numerical order, followed by named |
+// properties of the prototype object in insertion order, and so on. |
+// |
+// This enumeration order is not required by the specification, so |
+// this just documents our choice. |
+var proto2 = {}; |
+proto2[140000] = 0; |
+proto2.a = 0; |
+proto2[2] = 0; |
+proto2[3] = 0; // also on the 'proto1' object |
+proto2.b = 0; |
+proto2[4294967295] = 0; |
+proto2.c = 0; |
+proto2[4294967296] = 0; |
+ |
+var proto1 = {}; |
+proto1[5] = 0; |
+proto1.d = 0; |
+proto1[3] = 0; |
+proto1.e = 0; |
+proto1.f = 0; // also on the 'o' object |
+ |
+var o = {}; |
+o[-23] = 0; |
+o[300000000000] = 0; |
+o[23] = 0; |
+o.f = 0; |
+o.g = 0; |
+o[-4] = 0; |
+o[42] = 0; |
+ |
+o.__proto__ = proto1; |
+proto1.__proto__ = proto2; |
+ |
+var expected = ['23', '42', // indexed from 'o' |
+ '-23', '300000000000', 'f', 'g', '-4', // named from 'o' |
+ '3', '5', // indexed from 'proto1' |
+ 'd', 'e', // named from 'proto1' |
+ '2', '140000', '4294967295', // indexed from 'proto2' |
+ 'a', 'b', 'c', '4294967296']; // named from 'proto2' |
+var actual = []; |
+for (var p in o) actual.push(p); |
+assertArrayEquals(expected, actual); |
+ |
+ |
+ |
+ |