add-dense-element-non-writable-length.js (3225B)
1 // Add dense elements to packed and non-packed arrays. Cover both mono- and 2 // polymorphic call sites. Change array length to non-writable during execution. 3 4 function testAddDenseEmpty() { 5 var array = []; 6 7 function store(ar, index) { 8 ar[index] = index; 9 } 10 11 for (var i = 0; i < 10; ++i) { 12 if (i === 5) { 13 Object.defineProperty(array, "length", {writable: false}); 14 } 15 store(array, i); 16 } 17 18 assertEq(array.length, 5); 19 for (var i = 0; i < 5; ++i) { 20 assertEq(array[i], i); 21 } 22 for (var i = 5; i < 10; ++i) { 23 assertEq(i in array, false); 24 } 25 } 26 testAddDenseEmpty(); 27 28 function testAddDensePacked() { 29 var array = [0, 1]; 30 31 function store(ar, index) { 32 ar[index] = index; 33 } 34 35 for (var i = 2; i < 10; ++i) { 36 if (i === 5) { 37 Object.defineProperty(array, "length", {writable: false}); 38 } 39 store(array, i); 40 } 41 42 assertEq(array.length, 5); 43 for (var i = 0; i < 5; ++i) { 44 assertEq(array[i], i); 45 } 46 for (var i = 5; i < 10; ++i) { 47 assertEq(i in array, false); 48 } 49 } 50 testAddDensePacked(); 51 52 function testAddDenseNonPacked() { 53 var array = [/* hole */, 1]; 54 55 function store(ar, index) { 56 ar[index] = index; 57 } 58 59 for (var i = 2; i < 10; ++i) { 60 if (i === 5) { 61 Object.defineProperty(array, "length", {writable: false}); 62 } 63 store(array, i); 64 } 65 66 assertEq(array.length, 5); 67 assertEq(0 in array, false); 68 for (var i = 1; i < 5; ++i) { 69 assertEq(array[i], i); 70 } 71 for (var i = 5; i < 10; ++i) { 72 assertEq(i in array, false); 73 } 74 } 75 testAddDenseNonPacked(); 76 77 function testAddDenseEmptyPoly() { 78 var array = []; 79 80 function store(ar, index) { 81 ar[index] = index; 82 } 83 84 var objects = [array, {}]; 85 86 for (var i = 0; i < 10; ++i) { 87 if (i === 5) { 88 Object.defineProperty(array, "length", {writable: false}); 89 } 90 for (var j = 0; j < objects.length; ++j) { 91 store(objects[j], i); 92 } 93 } 94 95 assertEq(array.length, 5); 96 for (var i = 0; i < 5; ++i) { 97 assertEq(array[i], i); 98 } 99 for (var i = 5; i < 10; ++i) { 100 assertEq(i in array, false); 101 } 102 } 103 testAddDenseEmptyPoly(); 104 105 function testAddDensePackedPoly() { 106 var array = [0, 1]; 107 108 function store(ar, index) { 109 ar[index] = index; 110 } 111 112 var objects = [array, {}]; 113 114 for (var i = 2; i < 10; ++i) { 115 if (i === 5) { 116 Object.defineProperty(array, "length", {writable: false}); 117 } 118 for (var j = 0; j < objects.length; ++j) { 119 store(objects[j], i); 120 } 121 } 122 123 assertEq(array.length, 5); 124 for (var i = 0; i < 5; ++i) { 125 assertEq(array[i], i); 126 } 127 for (var i = 5; i < 10; ++i) { 128 assertEq(i in array, false); 129 } 130 } 131 testAddDensePackedPoly(); 132 133 function testAddDenseNonPackedPoly() { 134 var array = [/* hole */, 1]; 135 136 function store(ar, index) { 137 ar[index] = index; 138 } 139 140 var objects = [array, {}]; 141 142 for (var i = 2; i < 10; ++i) { 143 if (i === 5) { 144 Object.defineProperty(array, "length", {writable: false}); 145 } 146 for (var j = 0; j < objects.length; ++j) { 147 store(objects[j], i); 148 } 149 } 150 151 assertEq(array.length, 5); 152 assertEq(0 in array, false); 153 for (var i = 1; i < 5; ++i) { 154 assertEq(array[i], i); 155 } 156 for (var i = 5; i < 10; ++i) { 157 assertEq(i in array, false); 158 } 159 } 160 testAddDenseNonPackedPoly();