| typedArrays = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array]; |
| |
| |
| function check(array, thunk, count) { |
| let failed = true; |
| try { |
| thunk(array, count); |
| } catch(e) { |
| if (e != "TypeError: Underlying ArrayBuffer has been detached from the view") |
| throw new Error([thunk, count, e]); |
| failed = false; |
| } |
| if (failed) |
| throw new Error([thunk, count]); |
| } |
| noInline(check); |
| |
| function test(thunk, array) { |
| let fn = Function("array", "i", thunk); |
| noInline(fn); |
| for (let i = 0; i < 10000; i++) |
| check(array, fn, i); |
| } |
| |
| for (let constructor of typedArrays) { |
| let array = new constructor(10); |
| transferArrayBuffer(array.buffer); |
| test("array[0]", array); |
| test("delete array[0]", array); |
| test("Object.getOwnPropertyDescriptor(array, 0)", array); |
| test("array[0] = 1", array); |
| test("array[i] = 1", array); |
| } |
| |
| function testFTL(thunk, array, failArray) { |
| let fn = Function("array", "i", thunk); |
| noInline(fn); |
| for (let i = 0; i < 10000; i++) |
| fn(array, i) |
| check(failArray, fn, 10000); |
| } |
| |
| for (let constructor of typedArrays) { |
| let array = new constructor(10); |
| let failArray = new constructor(10); |
| transferArrayBuffer(failArray.buffer); |
| testFTL("array[0]", array, failArray); |
| testFTL("delete array[0]", array, failArray); |
| testFTL("Object.getOwnPropertyDescriptor(array, 0)", array, failArray); |
| testFTL("array[0] = 1", array, failArray); |
| testFTL("array[i] = 1", array, failArray); |
| } |
| |
| |
| function checkNoException(array, thunk, count) { |
| thunk(array, count); |
| } |
| noInline(check); |
| |
| function testNoException(thunk, array) { |
| let fn = Function("array", "i", thunk); |
| noInline(fn); |
| for (let i = 0; i < 10000; i++) |
| checkNoException(array, fn, i); |
| } |
| |
| for (let constructor of typedArrays) { |
| let array = new constructor(10); |
| transferArrayBuffer(array.buffer); |
| testNoException("Object.defineProperty(array, 0, { value: 1, writable: true, configurable: false, enumerable: true })", array); |
| } |
| |
| function testFTLNoException(thunk, array, failArray) { |
| let fn = Function("array", "i", thunk); |
| noInline(fn); |
| for (let i = 0; i < 10000; i++) |
| fn(array, i) |
| checkNoException(failArray, fn, 10000); |
| } |
| for (let constructor of typedArrays) { |
| let array = new constructor(10); |
| let failArray = new constructor(10); |
| transferArrayBuffer(failArray.buffer); |
| testFTLNoException("Object.defineProperty(array, 0, { value: 1, writable: true, configurable: false, enumerable: true })", array, failArray); |
| } |