Index: test/mjsunit/for-in.js |
diff --git a/test/mjsunit/for-in.js b/test/mjsunit/for-in.js |
index 547c748dffddd36693a5057b35038e496f6f96ea..29d7445351ffa1788af1172a574e37e788cde9dd 100644 |
--- a/test/mjsunit/for-in.js |
+++ b/test/mjsunit/for-in.js |
@@ -30,61 +30,136 @@ |
function props(x) { |
var array = []; |
for (var p in x) array.push(p); |
- return array.sort(); |
+ return array; |
} |
-assertEquals(0, props({}).length, "olen0"); |
-assertEquals(1, props({x:1}).length, "olen1"); |
-assertEquals(2, props({x:1, y:2}).length, "olen2"); |
+(function forInBasic() { |
+ assertEquals(0, props({}).length, "olen0"); |
+ assertEquals(1, props({x:1}).length, "olen1"); |
+ assertEquals(2, props({x:1, y:2}).length, "olen2"); |
-assertArrayEquals(["x"], props({x:1}), "x"); |
-assertArrayEquals(["x", "y"], props({x:1, y:2}), "xy"); |
-assertArrayEquals(["x", "y", "zoom"], props({x:1, y:2, zoom:3}), "xyzoom"); |
+ assertArrayEquals(["x"], props({x:1}), "x"); |
+ assertArrayEquals(["x", "y"], props({x:1, y:2}), "xy"); |
+ assertArrayEquals(["x", "y", "zoom"], props({x:1, y:2, zoom:3}), "xyzoom"); |
-assertEquals(0, props([]).length, "alen0"); |
-assertEquals(1, props([1]).length, "alen1"); |
-assertEquals(2, props([1,2]).length, "alen2"); |
+ assertEquals(0, props([]).length, "alen0"); |
+ assertEquals(1, props([1]).length, "alen1"); |
+ assertEquals(2, props([1,2]).length, "alen2"); |
-assertArrayEquals(["0"], props([1]), "0"); |
-assertArrayEquals(["0", "1"], props([1,2]), "01"); |
-assertArrayEquals(["0", "1", "2"], props([1,2,3]), "012"); |
+ assertArrayEquals(["0"], props([1]), "0"); |
+ assertArrayEquals(["0", "1"], props([1,2]), "01"); |
+ assertArrayEquals(["0", "1", "2"], props([1,2,3]), "012"); |
+})(); |
-var o = {}; |
-var a = []; |
-for (var i = 0x0020; i < 0x01ff; i+=2) { |
- var s = 'char:' + String.fromCharCode(i); |
- a.push(s); |
- o[s] = i; |
-} |
-assertArrayEquals(a, props(o), "charcodes"); |
- |
-var a = []; |
-assertEquals(0, props(a).length, "proplen0"); |
-a[Math.pow(2,30)-1] = 0; |
-assertEquals(1, props(a).length, "proplen1"); |
-a[Math.pow(2,31)-1] = 0; |
-assertEquals(2, props(a).length, "proplen2"); |
-a[1] = 0; |
-assertEquals(3, props(a).length, "proplen3"); |
- |
-for (var hest = 'hest' in {}) { } |
-assertEquals('hest', hest, "empty-no-override"); |
- |
-var result = ''; |
-for (var p in {a : [0], b : 1}) { result += p; } |
-assertEquals('ab', result, "ab"); |
- |
-var result = ''; |
-for (var p in {a : {v:1}, b : 1}) { result += p; } |
-assertEquals('ab', result, "ab-nodeep"); |
- |
-var result = ''; |
-for (var p in { get a() {}, b : 1}) { result += p; } |
-assertEquals('ab', result, "abget"); |
- |
-var result = ''; |
-for (var p in { get a() {}, set a(x) {}, b : 1}) { result += p; } |
-assertEquals('ab', result, "abgetset"); |
+(function forInPrototype() { |
+ // Fast properties + fast elements |
+ var obj = {a:true, 3:true, 4:true}; |
+ obj.__proto__ = {c:true, b:true, 2:true, 1:true, 5:true}; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a125cb".split(""), props(obj)); |
+ } |
+ // Fast properties + dictionary elements |
+ delete obj.__proto__[2]; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a15cb".split(""), props(obj)); |
+ } |
+ // Slow properties + dictionary elements |
+ delete obj.__proto__.c; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a15b".split(""), props(obj)); |
+ } |
+ // Slow properties on the receiver as well |
+ delete obj.a; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("3415b".split(""), props(obj)); |
+ } |
+ delete obj[3]; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("415b".split(""), props(obj)); |
+ } |
+})(); |
+ |
+(function forInShadowing() { |
+ var obj = {a:true, 3:true, 4:true}; |
+ obj.__proto__ = { |
+ c:true, b:true, x:true, |
+ 2:true, 1:true, 5:true, 9:true}; |
+ Object.defineProperty(obj, 'x', {value:true, enumerable:false, configurable:true}); |
+ Object.defineProperty(obj, '9', {value:true, enumerable:false, configurable:true}); |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a125cb".split(""), props(obj)); |
+ } |
+ // Fast properties + dictionary elements |
+ delete obj.__proto__[2]; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a15cb".split(""), props(obj)); |
+ } |
+ // Slow properties + dictionary elements |
+ delete obj.__proto__.c; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a15b".split(""), props(obj)); |
+ } |
+ // Remove the shadowing properties |
+ delete obj.x; |
+ delete obj[9]; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34a159bx".split(""), props(obj)); |
+ } |
+ // Slow properties on the receiver as well |
+ delete obj.a; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("34159bx".split(""), props(obj)); |
+ } |
+ delete obj[3]; |
+ for (var i = 0; i < 3; i++) { |
+ assertArrayEquals("4159bx".split(""), props(obj)); |
+ } |
+})(); |
+ |
+(function forInCharCodes() { |
+ var o = {}; |
+ var a = []; |
+ for (var i = 0x0020; i < 0x01ff; i+=2) { |
+ var s = 'char:' + String.fromCharCode(i); |
+ a.push(s); |
+ o[s] = i; |
+ } |
+ assertArrayEquals(a, props(o), "charcodes"); |
+})(); |
+ |
+(function forInArray() { |
+ var a = []; |
+ assertEquals(0, props(a).length, "proplen0"); |
+ a[Math.pow(2,30)-1] = 0; |
+ assertEquals(1, props(a).length, "proplen1"); |
+ a[Math.pow(2,31)-1] = 0; |
+ assertEquals(2, props(a).length, "proplen2"); |
+ a[1] = 0; |
+ assertEquals(3, props(a).length, "proplen3"); |
+})(); |
+ |
+(function forInInitialize() { |
+ for (var hest = 'hest' in {}) { } |
+ assertEquals('hest', hest, "empty-no-override"); |
+})(); |
+ |
+(function forInObjects() { |
+ var result = ''; |
+ for (var p in {a : [0], b : 1}) { result += p; } |
+ assertEquals('ab', result, "ab"); |
+ |
+ var result = ''; |
+ for (var p in {a : {v:1}, b : 1}) { result += p; } |
+ assertEquals('ab', result, "ab-nodeep"); |
+ |
+ var result = ''; |
+ for (var p in { get a() {}, b : 1}) { result += p; } |
+ assertEquals('ab', result, "abget"); |
+ |
+ var result = ''; |
+ for (var p in { get a() {}, set a(x) {}, b : 1}) { result += p; } |
+ assertEquals('ab', result, "abgetset"); |
+})(); |
// Test that for-in in the global scope works with a keyed property as "each". |