Commit 46bd4afe authored by Marja Hölttä's avatar Marja Hölttä Committed by V8 LUCI CQ

[rab/gsab] Tests for Array.p methods, part 4

In this part: indexOf, lastIndexOf

Bug: v8:11111
Change-Id: I51481ccf44ad6c3ebc9216c1b6cc870fda73566e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3726209
Commit-Queue: Marja Hölttä <marja@chromium.org>
Reviewed-by: 's avatarShu-yu Guo <syg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81439}
parent 34112c3a
......@@ -251,39 +251,76 @@ function ArrayIncludesHelper(array, n, fromIndex) {
return Array.prototype.includes.call(array, n, fromIndex);
}
function IndexOfHelper(array, n, fromIndex) {
function TypedArrayIndexOfHelper(ta, n, fromIndex) {
if (typeof n == 'number' &&
(array instanceof BigInt64Array || array instanceof BigUint64Array)) {
(ta instanceof BigInt64Array || ta instanceof BigUint64Array)) {
if (fromIndex == undefined) {
// Technically, passing fromIndex here would still result in the correct
// behavior, since "undefined" gets converted to 0 which is a good
// "default" index.
return array.indexOf(BigInt(n));
// "default" index. This is to test the "only 1 argument passed" code
// path, too.
return ta.indexOf(BigInt(n));
}
return array.indexOf(BigInt(n), fromIndex);
return ta.indexOf(BigInt(n), fromIndex);
}
if (fromIndex == undefined) {
return array.indexOf(n);
return ta.indexOf(n);
}
return array.indexOf(n, fromIndex);
return ta.indexOf(n, fromIndex);
}
function LastIndexOfHelper(array, n, fromIndex) {
function ArrayIndexOfHelper(ta, n, fromIndex) {
if (typeof n == 'number' &&
(array instanceof BigInt64Array || array instanceof BigUint64Array)) {
(ta instanceof BigInt64Array || ta instanceof BigUint64Array)) {
if (fromIndex == undefined) {
// Technically, passing fromIndex here would still result in the correct
// behavior, since "undefined" gets converted to 0 which is a good
// "default" index. This is to test the "only 1 argument passed" code
// path, too.
return Array.prototype.indexOf.call(ta, BigInt(n));
}
return Array.prototype.indexOf.call(ta, BigInt(n), fromIndex);
}
if (fromIndex == undefined) {
return Array.prototype.indexOf.call(ta, n);
}
return Array.prototype.indexOf.call(ta, n, fromIndex);
}
function TypedArrayLastIndexOfHelper(ta, n, fromIndex) {
if (typeof n == 'number' &&
(ta instanceof BigInt64Array || ta instanceof BigUint64Array)) {
if (fromIndex == undefined) {
// Shouldn't pass fromIndex here, since passing "undefined" is not the
// same as not passing the parameter at all. "Undefined" will get
// converted to 0 which is not a good "default" index, since lastIndexOf
// iterates from the index downwards.
return ta.lastIndexOf(BigInt(n));
}
return ta.lastIndexOf(BigInt(n), fromIndex);
}
if (fromIndex == undefined) {
return ta.lastIndexOf(n);
}
return ta.lastIndexOf(n, fromIndex);
}
function ArrayLastIndexOfHelper(ta, n, fromIndex) {
if (typeof n == 'number' &&
(ta instanceof BigInt64Array || ta instanceof BigUint64Array)) {
if (fromIndex == undefined) {
// Shouldn't pass fromIndex here, since passing "undefined" is not the
// same as not passing the parameter at all. "Undefined" will get
// converted to 0 which is not a good "default" index, since lastIndexOf
// iterates from the index downwards.
return array.lastIndexOf(BigInt(n));
return Array.prototype.lastIndexOf.call(ta, BigInt(n));
}
return array.lastIndexOf(BigInt(n), fromIndex);
return Array.prototype.lastIndexOf.call(ta, BigInt(n), fromIndex);
}
if (fromIndex == undefined) {
return array.lastIndexOf(n);
return Array.prototype.lastIndexOf.call(ta, n);
}
return array.lastIndexOf(n, fromIndex);
return Array.prototype.lastIndexOf.call(ta, n, fromIndex);
}
function SetHelper(target, source, offset) {
......
......@@ -909,7 +909,7 @@ FindLastIndexDetachMidIteration(ArrayFindLastIndexHelper);
}
})();
(function IndexOfParameterConversionDetaches() {
function IndexOfParameterConversionDetaches(indexOfHelper) {
for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
......@@ -919,9 +919,9 @@ FindLastIndexDetachMidIteration(ArrayFindLastIndexHelper);
%ArrayBufferDetach(rab);
return 0;
}};
assertEquals(0, IndexOfHelper(lengthTracking, 0));
assertEquals(0, indexOfHelper(lengthTracking, 0));
// The buffer is detached so indexOf returns -1.
assertEquals(-1, IndexOfHelper(lengthTracking, 0, evil));
assertEquals(-1, indexOfHelper(lengthTracking, 0, evil));
}
for (let ctor of ctors) {
......@@ -933,13 +933,15 @@ FindLastIndexDetachMidIteration(ArrayFindLastIndexHelper);
%ArrayBufferDetach(rab);
return 0;
}};
assertEquals(0, IndexOfHelper(lengthTracking, 0));
assertEquals(0, indexOfHelper(lengthTracking, 0));
// The buffer is detached so indexOf returns -1, also for undefined).
assertEquals(-1, IndexOfHelper(lengthTracking, undefined, evil));
assertEquals(-1, indexOfHelper(lengthTracking, undefined, evil));
}
})();
}
IndexOfParameterConversionDetaches(TypedArrayIndexOfHelper);
IndexOfParameterConversionDetaches(ArrayIndexOfHelper);
(function LastIndexOfParameterConversionDetaches() {
function LastIndexOfParameterConversionDetaches(lastIndexOfHelper) {
for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
......@@ -949,9 +951,9 @@ FindLastIndexDetachMidIteration(ArrayFindLastIndexHelper);
%ArrayBufferDetach(rab);
return 2;
}};
assertEquals(3, LastIndexOfHelper(lengthTracking, 0));
assertEquals(3, lastIndexOfHelper(lengthTracking, 0));
// The buffer is detached so lastIndexOf returns -1.
assertEquals(-1, LastIndexOfHelper(lengthTracking, 0, evil));
assertEquals(-1, lastIndexOfHelper(lengthTracking, 0, evil));
}
for (let ctor of ctors) {
......@@ -963,11 +965,13 @@ FindLastIndexDetachMidIteration(ArrayFindLastIndexHelper);
%ArrayBufferDetach(rab);
return 2;
}};
assertEquals(3, LastIndexOfHelper(lengthTracking, 0));
assertEquals(3, lastIndexOfHelper(lengthTracking, 0));
// The buffer is detached so lastIndexOf returns -1, also for undefined).
assertEquals(-1, LastIndexOfHelper(lengthTracking, undefined, evil));
assertEquals(-1, lastIndexOfHelper(lengthTracking, undefined, evil));
}
})();
}
LastIndexOfParameterConversionDetaches(TypedArrayLastIndexOfHelper);
LastIndexOfParameterConversionDetaches(ArrayLastIndexOfHelper);
(function JoinToLocaleString() {
for (let ctor of ctors) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment