| "use strict" |
| |
| // Test in-bounds access. |
| function opaqueGetByVal1(array, index) { |
| return array[index]; |
| } |
| noInline(opaqueGetByVal1); |
| |
| function testAccessInBounds() { |
| const target = new Array(100); |
| |
| // We start with an original array. Those GetByVal can be eliminated. |
| for (let i = 0; i < 1e4; ++i) { |
| const value = opaqueGetByVal1(target, i % 100); |
| if (value !== undefined) |
| throw "opaqueGetByVal1() case 1 failed for i = " + i + " value = " + value; |
| } |
| |
| Object.prototype[42] = "Uh!"; |
| |
| for (let i = 0; i < 1e4; ++i) { |
| const index = i % 100; |
| const value = opaqueGetByVal1(target, index); |
| if (index == 42) { |
| if (value !== "Uh!") |
| throw "opaqueGetByVal1() case 2 failed on 42, value = " + value; |
| } else if (value !== undefined) |
| throw "opaqueGetByVal1() case 2 failed for i = " + i + " value = " + value; |
| } |
| } |
| testAccessInBounds(); |
| |
| // Test in-bounds access. |
| function opaqueGetByVal2(array, index) { |
| return array[index]; |
| } |
| noInline(opaqueGetByVal2); |
| |
| function testAccessOnEmpty() { |
| const target = new Array(); |
| |
| for (let i = 0; i < 1e4; ++i) { |
| const index = i % 100; |
| const value = opaqueGetByVal2(target, index); |
| if (index == 42) { |
| if (value !== "Uh!") |
| throw "opaqueGetByVal2() case 2 failed on 42, value = " + value; |
| } else if (value !== undefined) |
| throw "opaqueGetByVal2() case 2 failed for i = " + i + " value = " + value; |
| } |
| } |
| testAccessOnEmpty(); |