michael@0: michael@0: function testOverwritingSparseHole() michael@0: { michael@0: var x = []; michael@0: for (var i = 0; i < 50; i++) michael@0: x[i] = i; michael@0: var hit = false; michael@0: Object.defineProperty(x, 40, {set: function() { hit = true; }}); michael@0: for (var i = 0; i < 50; i++) michael@0: x[i] = 10; michael@0: assertEq(hit, true); michael@0: } michael@0: testOverwritingSparseHole(); michael@0: michael@0: function testReadingSparseHole() michael@0: { michael@0: var x = []; michael@0: for (var i = 5; i < 50; i++) michael@0: x[i] = i; michael@0: var hit = false; michael@0: Object.defineProperty(x, 40, {get: function() { hit = true; return 5.5; }}); michael@0: var res = 0; michael@0: for (var i = 0; i < 50; i++) { michael@0: res += x[i]; michael@0: if (i == 10) michael@0: res = 0; michael@0: } michael@0: assertEq(res, 1135.5); michael@0: assertEq(hit, true); michael@0: } michael@0: testReadingSparseHole(); michael@0: michael@0: function testInSparseHole() michael@0: { michael@0: var x = []; michael@0: for (var i = 5; i < 50; i++) michael@0: x[i] = i; michael@0: Object.defineProperty(x, 40, {get: function() {}}); michael@0: var res = 0; michael@0: for (var i = 0; i < 50; i++) michael@0: res += (i in x) ? 1 : 0; michael@0: assertEq(res, 45); michael@0: } michael@0: testInSparseHole();