[builtins] IndexOf/LastIndexOf implementation for typedarrays
Removes dependence on InnerArrayIndexOf/InnerArrayLastIndexOf and reduces type polution caused by sharing these functions between standard and typed arrays. BUG= Review-Url: https://codereview.chromium.org/2243523002 Cr-Commit-Position: refs/heads/master@{#38637}
This commit is contained in:
parent
c5701e166e
commit
b052909c25
@ -28,9 +28,7 @@ var InnerArrayFilter;
|
|||||||
var InnerArrayFind;
|
var InnerArrayFind;
|
||||||
var InnerArrayFindIndex;
|
var InnerArrayFindIndex;
|
||||||
var InnerArrayForEach;
|
var InnerArrayForEach;
|
||||||
var InnerArrayIndexOf;
|
|
||||||
var InnerArrayJoin;
|
var InnerArrayJoin;
|
||||||
var InnerArrayLastIndexOf;
|
|
||||||
var InnerArrayReduce;
|
var InnerArrayReduce;
|
||||||
var InnerArrayReduceRight;
|
var InnerArrayReduceRight;
|
||||||
var InnerArraySome;
|
var InnerArraySome;
|
||||||
@ -79,9 +77,7 @@ utils.Import(function(from) {
|
|||||||
InnerArrayFind = from.InnerArrayFind;
|
InnerArrayFind = from.InnerArrayFind;
|
||||||
InnerArrayFindIndex = from.InnerArrayFindIndex;
|
InnerArrayFindIndex = from.InnerArrayFindIndex;
|
||||||
InnerArrayForEach = from.InnerArrayForEach;
|
InnerArrayForEach = from.InnerArrayForEach;
|
||||||
InnerArrayIndexOf = from.InnerArrayIndexOf;
|
|
||||||
InnerArrayJoin = from.InnerArrayJoin;
|
InnerArrayJoin = from.InnerArrayJoin;
|
||||||
InnerArrayLastIndexOf = from.InnerArrayLastIndexOf;
|
|
||||||
InnerArrayReduce = from.InnerArrayReduce;
|
InnerArrayReduce = from.InnerArrayReduce;
|
||||||
InnerArrayReduceRight = from.InnerArrayReduceRight;
|
InnerArrayReduceRight = from.InnerArrayReduceRight;
|
||||||
InnerArraySome = from.InnerArraySome;
|
InnerArraySome = from.InnerArraySome;
|
||||||
@ -572,7 +568,31 @@ function TypedArrayIndexOf(element, index) {
|
|||||||
if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray);
|
if (!IS_TYPEDARRAY(this)) throw %make_type_error(kNotTypedArray);
|
||||||
|
|
||||||
var length = %_TypedArrayGetLength(this);
|
var length = %_TypedArrayGetLength(this);
|
||||||
return InnerArrayIndexOf(this, element, index, length);
|
|
||||||
|
if (length === 0) return -1;
|
||||||
|
if (!IS_NUMBER(element)) return -1;
|
||||||
|
var n = TO_INTEGER(index);
|
||||||
|
|
||||||
|
var k;
|
||||||
|
if (n === 0) {
|
||||||
|
k = 0;
|
||||||
|
} else if (n > 0) {
|
||||||
|
k = n;
|
||||||
|
} else {
|
||||||
|
k = length + n;
|
||||||
|
if (k < 0) {
|
||||||
|
k = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (k < length) {
|
||||||
|
var elementK = this[k];
|
||||||
|
if (element === elementK) {
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
++k;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
%FunctionSetLength(TypedArrayIndexOf, 1);
|
%FunctionSetLength(TypedArrayIndexOf, 1);
|
||||||
|
|
||||||
@ -583,8 +603,36 @@ function TypedArrayLastIndexOf(element, index) {
|
|||||||
|
|
||||||
var length = %_TypedArrayGetLength(this);
|
var length = %_TypedArrayGetLength(this);
|
||||||
|
|
||||||
return InnerArrayLastIndexOf(this, element, index, length,
|
if (length === 0) return -1;
|
||||||
arguments.length);
|
if (!IS_NUMBER(element)) return -1;
|
||||||
|
var n;
|
||||||
|
if (arguments.length < 2) {
|
||||||
|
n = length - 1;
|
||||||
|
} else {
|
||||||
|
n = TO_INTEGER(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
var k;
|
||||||
|
if (n >= 0) {
|
||||||
|
if (length <= n) {
|
||||||
|
k = length - 1;
|
||||||
|
} else if (n === 0) {
|
||||||
|
k = 0;
|
||||||
|
} else {
|
||||||
|
k = n;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
k = length + n;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (k >= 0) {
|
||||||
|
var elementK = this[k];
|
||||||
|
if (element === elementK) {
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
--k;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
%FunctionSetLength(TypedArrayLastIndexOf, 1);
|
%FunctionSetLength(TypedArrayLastIndexOf, 1);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user