blob: f0ea64101051b70574b8c77a78b8f4cb2d19706a [file] [log] [blame]
function testArray(arrayType)
{
var testCode =
`
// We make this look like a polymorphic types for incomingObject but the GetByVal are never actually
// polymorphic. The boolean isTypedArray let us differentiate the types.
function ${ arrayType }AndObjectSpeculationInBounds(incomingObject, iterationLength, isTypedArray) {
var output = 0;
output += incomingObject.length;
if (isTypedArray) {
for (var i = 0; i < iterationLength; ++i) {
output += incomingObject[i];
}
} else {
for (var i = 0; i < iterationLength; ++i) {
output += incomingObject[i];
}
}
return output;
}
noInline(${ arrayType }AndObjectSpeculationInBounds);
var typedArray = new ${ arrayType }(64);
var regularArray = new Array(64);
for (var i = 0; i < 64; ++i) {
typedArray[i] = i;
regularArray[i] = i;
}
// Access in bounds.
for (var i = 0; i < 1e4; ++i) {
var output = ${ arrayType }AndObjectSpeculationInBounds(typedArray, 64, true);
if (output !== 32 * 65)
throw "${ arrayType }AndObjectSpeculationInBounds(typedArray, 64, true) failed, value = " + output;
var output = ${ arrayType }AndObjectSpeculationInBounds(regularArray, 64, false);
if (output !== 32 * 65)
throw "${ arrayType }AndObjectSpeculationInBounds(regularArray, 64, false) failed, value = " + output;
}
// One out of bounds on top of the in bounds profile.
{
var output = ${ arrayType }AndObjectSpeculationInBounds(typedArray, 128, true);
if (output === output)
throw "${ arrayType }AndObjectSpeculationInBounds(typedArray, 128, true) failed, value = " + output;
var output = ${ arrayType }AndObjectSpeculationInBounds(regularArray, 128, false);
if (output === output)
throw "${ arrayType }AndObjectSpeculationInBounds(regularArray, 128, false) failed, value = " + output;
}
// Same but here we make out-of-bounds a normal case.
function ${ arrayType }AndObjectSpeculationOutOfBounds(incomingObject, iterationLength, isTypedArray) {
var output = 0;
output += incomingObject.length;
if (isTypedArray) {
for (var i = 0; i < iterationLength; ++i) {
output += incomingObject[i]|0;
}
} else {
for (var i = 0; i < iterationLength; ++i) {
output += incomingObject[i]|0;
}
}
return output;
}
noInline(${ arrayType }AndObjectSpeculationOutOfBounds);
for (var i = 0; i < 1e4; ++i) {
var output = ${ arrayType }AndObjectSpeculationOutOfBounds(typedArray, 128, true);
if (output !== 32 * 65)
throw "${ arrayType }AndObjectSpeculationOutOfBounds(typedArray, 128, true) failed, value = " + output;
var output = ${ arrayType }AndObjectSpeculationOutOfBounds(regularArray, 128, false);
if (output !== 32 * 65)
throw "${ arrayType }AndObjectSpeculationOutOfBounds(regularArray, 128, false) failed, value = " + output;
}`
eval(testCode);
}
testArray("Int8Array");
testArray("Uint8Array");
testArray("Uint8ClampedArray");
testArray("Int16Array");
testArray("Uint16Array");
testArray("Int32Array");
testArray("Uint32Array");
testArray("Float32Array");
testArray("Float64Array");