"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();