blob: 9f70a2305803b4e204d1b17193187caa6ce81e2a [file] [log] [blame]
function testArray(arrayType)
{
var testCode =
`
function testOutOfBoundsValues(regularArray, typedArray) {
for (var i = 0; i < 16; ++i) {
var typedArrayValue = typedArray[i]
if (typedArrayValue !== i) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, typedArrayValue = " + typedArrayValue + " for i = " + i;
}
var regularArrayValue = regularArray[i];
if (regularArrayValue !== i) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, regularArrayValue = " + regularArrayValue + " for i = " + i;
}
}
for (var i = 16; i < 24; ++i) {
var typedArrayValue = typedArray[i]
if (typedArrayValue !== undefined) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, typedArrayValue = " + typedArrayValue + " for i = " + i;
}
var regularArrayValue = regularArray[i];
if (regularArrayValue !== i) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, regularArrayValue = " + regularArrayValue + " for i = " + i;
}
}
}
// 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) {
if (isTypedArray) {
for (var i = 0; i < iterationLength; ++i) {
incomingObject[i] = i;
}
} else {
for (var i = 0; i < iterationLength; ++i) {
incomingObject[i] = i;
}
}
}
noInline(${ arrayType }AndObjectSpeculationInBounds);
var typedArray = new ${ arrayType }(16);
var regularArray = new Array(16);
// Access in bounds.
for (var i = 0; i < 1e4; ++i) {
${ arrayType }AndObjectSpeculationInBounds(regularArray, 16, false);
${ arrayType }AndObjectSpeculationInBounds(typedArray, 16, true);
}
for (var i = 0; i < 16; ++i) {
var typedArrayValue = typedArray[i]
if (typedArrayValue !== i) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, typedArrayValue = " + typedArrayValue + " for i = " + i;
}
var regularArrayValue = regularArray[i];
if (regularArrayValue !== i) {
throw "Failed ${ arrayType }AndObjectSpeculationInBounds, regularArrayValue = " + regularArrayValue + " for i = " + i;
}
}
// One "out of bounds" on top of the in bounds profile.
${ arrayType }AndObjectSpeculationInBounds(regularArray, 24, false);
${ arrayType }AndObjectSpeculationInBounds(typedArray, 24, true);
testOutOfBoundsValues(regularArray, typedArray);
// Same but here we make out-of-bounds a normal case.
function ${ arrayType }AndObjectSpeculationOutOfBounds(incomingObject, iterationLength, isTypedArray) {
if (isTypedArray) {
for (var i = 0; i < iterationLength; ++i) {
incomingObject[i] = i;
}
} else {
for (var i = 0; i < iterationLength; ++i) {
incomingObject[i] = i;
}
}
}
noInline(${ arrayType }AndObjectSpeculationOutOfBounds);
var typedArray = new ${ arrayType }(16);
var regularArray = new Array(16);
for (var i = 0; i < 1e4; ++i) {
${ arrayType }AndObjectSpeculationInBounds(regularArray, 24, false);
${ arrayType }AndObjectSpeculationInBounds(typedArray, 24, true);
}`
eval(testCode);
}
testArray("Int8Array");
testArray("Uint8Array");
testArray("Uint8ClampedArray");
testArray("Int16Array");
testArray("Uint16Array");
testArray("Int32Array");
testArray("Uint32Array");
testArray("Float32Array");
testArray("Float64Array");