| 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".
|
|
|