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

[rab/gsab] Add RAB / GSAB support to various TA.prototype functions

Functions affected:
filter
find
findIndex
findLast
findLastIndex
forEach
reduce
reduceRight

Bug: v8:11111
Change-Id: Ifb40143e5b6ed4a3eb30cb25332e2387009e3274
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3205421
Commit-Queue: Marja Hölttä <marja@chromium.org>
Reviewed-by: 's avatarShu-yu Guo <syg@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#77422}
parent 5c1adef7
...@@ -9,13 +9,14 @@ const kBuiltinNameEvery: constexpr string = '%TypedArray%.prototype.every'; ...@@ -9,13 +9,14 @@ const kBuiltinNameEvery: constexpr string = '%TypedArray%.prototype.every';
// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every
transitioning macro EveryAllElements(implicit context: Context)( transitioning macro EveryAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, length: uintptr, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
callbackfn: Callable, thisArg: JSAny): Boolean { callbackfn: Callable, thisArg: JSAny): Boolean {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
// 5. Let k be 0. // 5. Let k be 0.
// 6. Repeat, while k < len // 6. Repeat, while k < len
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -59,13 +60,12 @@ TypedArrayPrototypeEvery( ...@@ -59,13 +60,12 @@ TypedArrayPrototypeEvery(
// 3. Let len be IntegerIndexedObjectLength(O). // 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const length = LoadJSTypedArrayLengthAndCheckDetached(array) const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds; otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception. // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable; const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return EveryAllElements( return EveryAllElements(attachedArrayAndLength, callbackfn, thisArg);
%RawDownCast<AttachedJSTypedArray>(array), length, callbackfn, thisArg);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameEvery); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameEvery);
} label IsDetachedOrOutOfBounds deferred { } label IsDetachedOrOutOfBounds deferred {
......
...@@ -13,14 +13,13 @@ transitioning javascript builtin TypedArrayPrototypeFilter( ...@@ -13,14 +13,13 @@ transitioning javascript builtin TypedArrayPrototypeFilter(
try { try {
// 1. Let O be the this value. // 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O). // 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise ThrowTypeError( otherwise ThrowTypeError(
MessageTemplate::kNotTypedArray, kBuiltinNameFilter); MessageTemplate::kNotTypedArray, kBuiltinNameFilter);
const src = typed_array::EnsureAttached(array) otherwise IsDetached;
// 3. Let len be O.[[ArrayLength]].
const len: uintptr = src.length;
const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception. // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) const callbackfn = Cast<Callable>(arguments[0])
otherwise ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); otherwise ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
...@@ -32,19 +31,20 @@ transitioning javascript builtin TypedArrayPrototypeFilter( ...@@ -32,19 +31,20 @@ transitioning javascript builtin TypedArrayPrototypeFilter(
// TODO(v8:4153): Support huge TypedArrays here. (growable fixed arrays // TODO(v8:4153): Support huge TypedArrays here. (growable fixed arrays
// can't be longer than kMaxSmiValue). // can't be longer than kMaxSmiValue).
let kept = growable_fixed_array::NewGrowableFixedArray(); let kept = growable_fixed_array::NewGrowableFixedArray();
let witness = typed_array::NewAttachedJSTypedArrayWitness(src); let witness = typed_array::NewAttachedJSTypedArrayWitness(
attachedArrayAndLength.array);
// 7. Let k be 0. // 7. Let k be 0.
// 8. Let captured be 0. // 8. Let captured be 0.
// 9. Repeat, while k < len // 9. Repeat, while k < len
for (let k: uintptr = 0; k < len; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
let value: JSAny; let value: JSAny;
// a. Let Pk be ! ToString(k). // a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk). // b. Let kValue be ? Get(O, Pk).
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -80,7 +80,7 @@ transitioning javascript builtin TypedArrayPrototypeFilter( ...@@ -80,7 +80,7 @@ transitioning javascript builtin TypedArrayPrototypeFilter(
// 13. Return A. // 13. Return A.
return typedArray; return typedArray;
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFilter); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFilter);
} }
} }
......
...@@ -9,13 +9,14 @@ const kBuiltinNameFind: constexpr string = '%TypedArray%.prototype.find'; ...@@ -9,13 +9,14 @@ const kBuiltinNameFind: constexpr string = '%TypedArray%.prototype.find';
// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find
transitioning macro FindAllElements(implicit context: Context)( transitioning macro FindAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, predicate: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
thisArg: JSAny): JSAny { predicate: Callable, thisArg: JSAny): JSAny {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
const length: uintptr = witness.Get().length; typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
// 5. Let k be 0.
// 6. Repeat, while k < len // 6. Repeat, while k < len
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -23,9 +24,9 @@ transitioning macro FindAllElements(implicit context: Context)( ...@@ -23,9 +24,9 @@ transitioning macro FindAllElements(implicit context: Context)(
// kValue must be undefined when the buffer is detached. // kValue must be undefined when the buffer is detached.
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -56,18 +57,22 @@ TypedArrayPrototypeFind( ...@@ -56,18 +57,22 @@ TypedArrayPrototypeFind(
// arguments[0] = callback // arguments[0] = callback
// arguments[1] = thisArg // arguments[1] = thisArg
try { try {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(predicate) is false, throw a TypeError exception.
const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable; const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return FindAllElements(uarray, predicate, thisArg); return FindAllElements(attachedArrayAndLength, predicate, thisArg);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFind); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFind);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFind); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFind);
} }
} }
......
...@@ -9,13 +9,14 @@ const kBuiltinNameFindIndex: constexpr string = ...@@ -9,13 +9,14 @@ const kBuiltinNameFindIndex: constexpr string =
'%TypedArray%.prototype.findIndex'; '%TypedArray%.prototype.findIndex';
transitioning macro FindIndexAllElements(implicit context: Context)( transitioning macro FindIndexAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, predicate: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
thisArg: JSAny): Number { predicate: Callable, thisArg: JSAny): Number {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
const length: uintptr = witness.Get().length; typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
// 5. Let k be 0.
// 6. Repeat, while k < len // 6. Repeat, while k < len
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -23,9 +24,9 @@ transitioning macro FindIndexAllElements(implicit context: Context)( ...@@ -23,9 +24,9 @@ transitioning macro FindIndexAllElements(implicit context: Context)(
// kValue must be undefined when the buffer is detached. // kValue must be undefined when the buffer is detached.
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -47,21 +48,25 @@ transitioning macro FindIndexAllElements(implicit context: Context)( ...@@ -47,21 +48,25 @@ transitioning macro FindIndexAllElements(implicit context: Context)(
transitioning javascript builtin transitioning javascript builtin
TypedArrayPrototypeFindIndex( TypedArrayPrototypeFindIndex(
js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny { js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
// arguments[0] = callback // arguments[0] = predicate
// arguments[1] = thisArg. // arguments[1] = thisArg.
try { try {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(predicate) is false, throw a TypeError exception.
const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable; const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return FindIndexAllElements(uarray, predicate, thisArg); return FindIndexAllElements(attachedArrayAndLength, predicate, thisArg);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindIndex); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindIndex);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFindIndex); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFindIndex);
} }
} }
......
...@@ -10,14 +10,13 @@ const kBuiltinNameFindLast: constexpr string = ...@@ -10,14 +10,13 @@ const kBuiltinNameFindLast: constexpr string =
// https://tc39.es/proposal-array-find-from-last/index.html#sec-%typedarray%.prototype.findlast // https://tc39.es/proposal-array-find-from-last/index.html#sec-%typedarray%.prototype.findlast
transitioning macro FindLastAllElements(implicit context: Context)( transitioning macro FindLastAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, predicate: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
thisArg: JSAny): JSAny { predicate: Callable, thisArg: JSAny): JSAny {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
// 3. Let len be O.[[ArrayLength]]. typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
const length: uintptr = witness.Get().length;
// 5. Let k be len - 1. // 5. Let k be len - 1.
// 6. Repeat, while k ≥ 0 // 6. Repeat, while k ≥ 0
for (let k: uintptr = length; k-- > 0;) { for (let k: uintptr = attachedArrayAndLength.length; k-- > 0;) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -25,9 +24,9 @@ transitioning macro FindLastAllElements(implicit context: Context)( ...@@ -25,9 +24,9 @@ transitioning macro FindLastAllElements(implicit context: Context)(
// kValue must be undefined when the buffer was detached. // kValue must be undefined when the buffer was detached.
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -54,24 +53,25 @@ transitioning macro FindLastAllElements(implicit context: Context)( ...@@ -54,24 +53,25 @@ transitioning macro FindLastAllElements(implicit context: Context)(
transitioning javascript builtin transitioning javascript builtin
TypedArrayPrototypeFindLast( TypedArrayPrototypeFindLast(
js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny { js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
// arguments[0] = callback // arguments[0] = predicate
// arguments[1] = thisArg // arguments[1] = thisArg
try { try {
// 1. Let O be the this value. // 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
// 2. Perform ? ValidateTypedArray(O). const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(predicate) is false, throw a TypeError exception. // 4. If IsCallable(predicate) is false, throw a TypeError exception.
const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable; const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return FindLastAllElements(uarray, predicate, thisArg); return FindLastAllElements(attachedArrayAndLength, predicate, thisArg);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindLast); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindLast);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFindLast); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameFindLast);
} }
} }
......
...@@ -10,14 +10,13 @@ const kBuiltinNameFindLastIndex: constexpr string = ...@@ -10,14 +10,13 @@ const kBuiltinNameFindLastIndex: constexpr string =
// https://tc39.es/proposal-array-find-from-last/index.html#sec-%typedarray%.prototype.findlastindex // https://tc39.es/proposal-array-find-from-last/index.html#sec-%typedarray%.prototype.findlastindex
transitioning macro FindLastIndexAllElements(implicit context: Context)( transitioning macro FindLastIndexAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, predicate: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
thisArg: JSAny): Number { predicate: Callable, thisArg: JSAny): Number {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
// 3. Let len be O.[[ArrayLength]]. typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
const length: uintptr = witness.Get().length;
// 5. Let k be len - 1. // 5. Let k be len - 1.
// 6. Repeat, while k ≥ 0 // 6. Repeat, while k ≥ 0
for (let k: uintptr = length; k-- > 0;) { for (let k: uintptr = attachedArrayAndLength.length; k-- > 0;) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -25,9 +24,9 @@ transitioning macro FindLastIndexAllElements(implicit context: Context)( ...@@ -25,9 +24,9 @@ transitioning macro FindLastIndexAllElements(implicit context: Context)(
// kValue must be undefined when the buffer was detached. // kValue must be undefined when the buffer was detached.
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -54,25 +53,25 @@ transitioning macro FindLastIndexAllElements(implicit context: Context)( ...@@ -54,25 +53,25 @@ transitioning macro FindLastIndexAllElements(implicit context: Context)(
transitioning javascript builtin transitioning javascript builtin
TypedArrayPrototypeFindLastIndex( TypedArrayPrototypeFindLastIndex(
js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny { js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
// arguments[0] = callback // arguments[0] = predicate
// arguments[1] = thisArg. // arguments[1] = thisArg
try { try {
// 1. Let O be the this value. // 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
// 2. Perform ? ValidateTypedArray(O). const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(predicate) is false, throw a TypeError exception. // 4. If IsCallable(predicate) is false, throw a TypeError exception.
const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable; const predicate = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return FindLastIndexAllElements(attachedArrayAndLength, predicate, thisArg);
return FindLastIndexAllElements(uarray, predicate, thisArg);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindLastIndex); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameFindLastIndex);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError( ThrowTypeError(
MessageTemplate::kDetachedOperation, kBuiltinNameFindLastIndex); MessageTemplate::kDetachedOperation, kBuiltinNameFindLastIndex);
} }
......
...@@ -8,13 +8,14 @@ namespace typed_array { ...@@ -8,13 +8,14 @@ namespace typed_array {
const kBuiltinNameForEach: constexpr string = '%TypedArray%.prototype.forEach'; const kBuiltinNameForEach: constexpr string = '%TypedArray%.prototype.forEach';
transitioning macro ForEachAllElements(implicit context: Context)( transitioning macro ForEachAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, callbackfn: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
thisArg: JSAny): Undefined { callbackfn: Callable, thisArg: JSAny): Undefined {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
const length: uintptr = witness.Get().length; typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
// 5. Let k be 0.
// 6. Repeat, while k < len // 6. Repeat, while k < len
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -22,9 +23,9 @@ transitioning macro ForEachAllElements(implicit context: Context)( ...@@ -22,9 +23,9 @@ transitioning macro ForEachAllElements(implicit context: Context)(
// kValue must be undefined when the buffer is detached. // kValue must be undefined when the buffer is detached.
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() otherwise goto IsDetached; witness.RecheckIndex(k) otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
...@@ -50,18 +51,22 @@ TypedArrayPrototypeForEach(js-implicit context: NativeContext, receiver: JSAny)( ...@@ -50,18 +51,22 @@ TypedArrayPrototypeForEach(js-implicit context: NativeContext, receiver: JSAny)(
// arguments[1] = this_arg. // arguments[1] = this_arg.
try { try {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable; const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return ForEachAllElements(uarray, callbackfn, thisArg); return ForEachAllElements(attachedArrayAndLength, callbackfn, thisArg);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameForEach); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameForEach);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameForEach); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameForEach);
} }
} }
......
...@@ -8,19 +8,19 @@ namespace typed_array { ...@@ -8,19 +8,19 @@ namespace typed_array {
const kBuiltinNameReduce: constexpr string = '%TypedArray%.prototype.reduce'; const kBuiltinNameReduce: constexpr string = '%TypedArray%.prototype.reduce';
transitioning macro ReduceAllElements(implicit context: Context)( transitioning macro ReduceAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, callbackfn: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
initialValue: JSAny|TheHole): JSAny { callbackfn: Callable, initialValue: JSAny|TheHole): JSAny {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
const length: uintptr = witness.Get().length; typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
let accumulator = initialValue; let accumulator = initialValue;
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() witness.RecheckIndex(k)
otherwise goto IsDetached; otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
typeswitch (accumulator) { typeswitch (accumulator) {
...@@ -53,18 +53,22 @@ TypedArrayPrototypeReduce( ...@@ -53,18 +53,22 @@ TypedArrayPrototypeReduce(
// arguments[0] = callback // arguments[0] = callback
// arguments[1] = initialValue. // arguments[1] = initialValue.
try { try {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable; const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
const initialValue = arguments.length >= 2 ? arguments[1] : TheHole; const initialValue = arguments.length >= 2 ? arguments[1] : TheHole;
return ReduceAllElements(uarray, callbackfn, initialValue); return ReduceAllElements(attachedArrayAndLength, callbackfn, initialValue);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameReduce); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameReduce);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameReduce); ThrowTypeError(MessageTemplate::kDetachedOperation, kBuiltinNameReduce);
} }
} }
......
...@@ -10,18 +10,18 @@ const kBuiltinNameReduceRight: constexpr string = ...@@ -10,18 +10,18 @@ const kBuiltinNameReduceRight: constexpr string =
// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright
transitioning macro ReduceRightAllElements(implicit context: Context)( transitioning macro ReduceRightAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, callbackfn: Callable, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
initialValue: JSAny|TheHole): JSAny { callbackfn: Callable, initialValue: JSAny|TheHole): JSAny {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
const length: uintptr = witness.Get().length; typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
let accumulator = initialValue; let accumulator = initialValue;
for (let k: uintptr = length; k-- > 0;) { for (let k: uintptr = attachedArrayAndLength.length; k-- > 0;) {
let value: JSAny; let value: JSAny;
try { try {
witness.Recheck() witness.RecheckIndex(k)
otherwise goto IsDetached; otherwise goto IsDetachedOrOutOfBounds;
value = witness.Load(k); value = witness.Load(k);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
value = Undefined; value = Undefined;
} }
typeswitch (accumulator) { typeswitch (accumulator) {
...@@ -55,19 +55,24 @@ TypedArrayPrototypeReduceRight( ...@@ -55,19 +55,24 @@ TypedArrayPrototypeReduceRight(
// arguments[0] = callback // arguments[0] = callback
// arguments[1] = initialValue. // arguments[1] = initialValue.
try { try {
// 1. Let O be the this value.
// 2. Perform ? ValidateTypedArray(O).
// 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const uarray = typed_array::EnsureAttached(array) otherwise IsDetached; const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable; const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
const initialValue = arguments.length >= 2 ? arguments[1] : TheHole; const initialValue = arguments.length >= 2 ? arguments[1] : TheHole;
return ReduceRightAllElements(uarray, callbackfn, initialValue); return ReduceRightAllElements(
attachedArrayAndLength, callbackfn, initialValue);
} label NotCallable deferred { } label NotCallable deferred {
ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]); ThrowTypeError(MessageTemplate::kCalledNonCallable, arguments[0]);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameReduceRight); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameReduceRight);
} label IsDetached deferred { } label IsDetachedOrOutOfBounds deferred {
ThrowTypeError( ThrowTypeError(
MessageTemplate::kDetachedOperation, kBuiltinNameReduceRight); MessageTemplate::kDetachedOperation, kBuiltinNameReduceRight);
} }
......
...@@ -9,13 +9,14 @@ const kBuiltinNameSome: constexpr string = '%TypedArray%.prototype.some'; ...@@ -9,13 +9,14 @@ const kBuiltinNameSome: constexpr string = '%TypedArray%.prototype.some';
// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some // https://tc39.es/ecma262/#sec-%typedarray%.prototype.some
transitioning macro SomeAllElements(implicit context: Context)( transitioning macro SomeAllElements(implicit context: Context)(
array: typed_array::AttachedJSTypedArray, length: uintptr, attachedArrayAndLength: typed_array::AttachedJSTypedArrayAndLength,
callbackfn: Callable, thisArg: JSAny): Boolean { callbackfn: Callable, thisArg: JSAny): Boolean {
let witness = typed_array::NewAttachedJSTypedArrayWitness(array); let witness =
typed_array::NewAttachedJSTypedArrayWitness(attachedArrayAndLength.array);
// 5. Let k be 0. // 5. Let k be 0.
// 6. Repeat, while k < len // 6. Repeat, while k < len
for (let k: uintptr = 0; k < length; k++) { for (let k: uintptr = 0; k < attachedArrayAndLength.length; k++) {
// 6a. Let Pk be ! ToString(𝔽(k)). // 6a. Let Pk be ! ToString(𝔽(k)).
// There is no need to cast ToString to load elements. // There is no need to cast ToString to load elements.
...@@ -61,13 +62,12 @@ TypedArrayPrototypeSome( ...@@ -61,13 +62,12 @@ TypedArrayPrototypeSome(
// 3. Let len be IntegerIndexedObjectLength(O). // 3. Let len be IntegerIndexedObjectLength(O).
const array: JSTypedArray = Cast<JSTypedArray>(receiver) const array: JSTypedArray = Cast<JSTypedArray>(receiver)
otherwise NotTypedArray; otherwise NotTypedArray;
const length = LoadJSTypedArrayLengthAndCheckDetached(array) const attachedArrayAndLength = EnsureAttachedAndReadLength(array)
otherwise IsDetachedOrOutOfBounds; otherwise IsDetachedOrOutOfBounds;
// 4. If IsCallable(callbackfn) is false, throw a TypeError exception. // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable; const callbackfn = Cast<Callable>(arguments[0]) otherwise NotCallable;
const thisArg = arguments[1]; const thisArg = arguments[1];
return SomeAllElements( return SomeAllElements(attachedArrayAndLength, callbackfn, thisArg);
%RawDownCast<AttachedJSTypedArray>(array), length, callbackfn, thisArg);
} label NotTypedArray deferred { } label NotTypedArray deferred {
ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameSome); ThrowTypeError(MessageTemplate::kNotTypedArray, kBuiltinNameSome);
} label IsDetachedOrOutOfBounds deferred { } label IsDetachedOrOutOfBounds deferred {
......
...@@ -195,21 +195,27 @@ macro EnsureAttached(array: JSTypedArray): AttachedJSTypedArray ...@@ -195,21 +195,27 @@ macro EnsureAttached(array: JSTypedArray): AttachedJSTypedArray
} }
} }
struct AttachedJSTypedArrayWitness { struct AttachedJSTypedArrayAndLength {
macro Get(): AttachedJSTypedArray { array: AttachedJSTypedArray;
return this.unstable; length: uintptr;
} }
macro EnsureAttachedAndReadLength(array: JSTypedArray):
AttachedJSTypedArrayAndLength
labels DetachedOrOutOfBounds {
const length = LoadJSTypedArrayLengthAndCheckDetached(array)
otherwise DetachedOrOutOfBounds;
return AttachedJSTypedArrayAndLength{
array: %RawDownCast<AttachedJSTypedArray>(array),
length: length
};
}
struct AttachedJSTypedArrayWitness {
macro GetStable(): JSTypedArray { macro GetStable(): JSTypedArray {
return this.stable; return this.stable;
} }
// TODO(v8:11111): Migrate users to use RecheckIndex.
macro Recheck(): void labels Detached {
if (IsDetachedBuffer(this.stable.buffer)) goto Detached;
this.unstable = %RawDownCast<AttachedJSTypedArray>(this.stable);
}
macro RecheckIndex(index: uintptr): void labels DetachedOrOutOfBounds { macro RecheckIndex(index: uintptr): void labels DetachedOrOutOfBounds {
const length = LoadJSTypedArrayLengthAndCheckDetached(this.stable) const length = LoadJSTypedArrayLengthAndCheckDetached(this.stable)
otherwise DetachedOrOutOfBounds; otherwise DetachedOrOutOfBounds;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --harmony-rab-gsab --allow-natives-syntax // Flags: --harmony-rab-gsab --allow-natives-syntax
// Flags: --harmony-relative-indexing-methods // Flags: --harmony-relative-indexing-methods --harmony-array-find-last
"use strict"; "use strict";
...@@ -1249,7 +1249,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1249,7 +1249,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
let gsab; let gsab;
let growAfter; let growAfter;
let growTo; let growTo;
function myFunc(n) { function CollectValuesAndGrow(n) {
if (n == undefined) { if (n == undefined) {
values.push(n); values.push(n);
} else { } else {
...@@ -1267,7 +1267,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1267,7 +1267,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 2; growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLength.every(myFunc)); assertTrue(fixedLength.every(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -1277,7 +1277,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1277,7 +1277,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 1; growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLengthWithOffset.every(myFunc)); assertTrue(fixedLengthWithOffset.every(CollectValuesAndGrow));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
...@@ -1287,7 +1287,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1287,7 +1287,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 2; growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTracking.every(myFunc)); assertTrue(lengthTracking.every(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -1297,7 +1297,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1297,7 +1297,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 1; growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTrackingWithOffset.every(myFunc)); assertTrue(lengthTrackingWithOffset.every(CollectValuesAndGrow));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
})(); })();
...@@ -1323,7 +1323,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1323,7 +1323,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
let gsab; let gsab;
let growAfter; let growAfter;
let growTo; let growTo;
function myFunc(n) { function CollectValuesAndGrow(n) {
if (n == undefined) { if (n == undefined) {
values.push(n); values.push(n);
} else { } else {
...@@ -1341,7 +1341,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1341,7 +1341,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 2; growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLength.some(myFunc)); assertFalse(fixedLength.some(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -1352,7 +1352,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1352,7 +1352,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
gsab = gsab; gsab = gsab;
growAfter = 1; growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLengthWithOffset.some(myFunc)); assertFalse(fixedLengthWithOffset.some(CollectValuesAndGrow));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
...@@ -1362,7 +1362,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1362,7 +1362,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 2; growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTracking.some(myFunc)); assertFalse(lengthTracking.some(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -1372,7 +1372,728 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, ...@@ -1372,7 +1372,728 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after,
values = []; values = [];
growAfter = 1; growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT; growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTrackingWithOffset.some(myFunc)); assertFalse(lengthTrackingWithOffset.some(CollectValuesAndGrow));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
})(); })();
(function FindFindIndexFindLastFindLastIndex() {
for (let ctor of ctors) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(gsab, 0, 4);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(gsab, 0);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function isTwoOrFour(n) {
return n == 2 || n == 4;
}
assertEquals(2, Number(fixedLength.find(isTwoOrFour)));
assertEquals(4, Number(fixedLengthWithOffset.find(isTwoOrFour)));
assertEquals(2, Number(lengthTracking.find(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.find(isTwoOrFour)));
assertEquals(1, fixedLength.findIndex(isTwoOrFour));
assertEquals(0, fixedLengthWithOffset.findIndex(isTwoOrFour));
assertEquals(1, lengthTracking.findIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findIndex(isTwoOrFour));
assertEquals(4, Number(fixedLength.findLast(isTwoOrFour)));
assertEquals(4, Number(fixedLengthWithOffset.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTracking.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.findLast(isTwoOrFour)));
assertEquals(2, fixedLength.findLastIndex(isTwoOrFour));
assertEquals(0, fixedLengthWithOffset.findLastIndex(isTwoOrFour));
assertEquals(2, lengthTracking.findLastIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findLastIndex(isTwoOrFour));
// Grow.
gsab.grow(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 0);
}
WriteToTypedArray(taWrite, 4, 2);
WriteToTypedArray(taWrite, 5, 4);
// Orig. array: [0, 0, 0, 0, 2, 4]
// [0, 0, 0, 0] << fixedLength
// [0, 0] << fixedLengthWithOffset
// [0, 0, 0, 0, 2, 4, ...] << lengthTracking
// [0, 0, 2, 4, ...] << lengthTrackingWithOffset
assertEquals(undefined, fixedLength.find(isTwoOrFour));
assertEquals(undefined, fixedLengthWithOffset.find(isTwoOrFour));
assertEquals(2, Number(lengthTracking.find(isTwoOrFour)));
assertEquals(2, Number(lengthTrackingWithOffset.find(isTwoOrFour)));
assertEquals(-1, fixedLength.findIndex(isTwoOrFour));
assertEquals(-1, fixedLengthWithOffset.findIndex(isTwoOrFour));
assertEquals(4, lengthTracking.findIndex(isTwoOrFour));
assertEquals(2, lengthTrackingWithOffset.findIndex(isTwoOrFour));
assertEquals(undefined, fixedLength.findLast(isTwoOrFour));
assertEquals(undefined, fixedLengthWithOffset.findLast(isTwoOrFour));
assertEquals(4, Number(lengthTracking.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.findLast(isTwoOrFour)));
assertEquals(-1, fixedLength.findLastIndex(isTwoOrFour));
assertEquals(-1, fixedLengthWithOffset.findLastIndex(isTwoOrFour));
assertEquals(5, lengthTracking.findLastIndex(isTwoOrFour));
assertEquals(3, lengthTrackingWithOffset.findLastIndex(isTwoOrFour));
}
})();
(function FindGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndGrow(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return false;
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLength.find(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLengthWithOffset.find(CollectValuesAndGrow));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTracking.find(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTrackingWithOffset.find(CollectValuesAndGrow));
assertEquals([4, 6], values);
}
})();
(function FindIndexGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndGrow(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return false;
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findIndex(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findIndex(CollectValuesAndGrow));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findIndex(CollectValuesAndGrow));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findIndex(CollectValuesAndGrow));
assertEquals([4, 6], values);
}
})();
(function FindLastGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndGrow(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return false;
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLength.findLast(CollectValuesAndGrow));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLengthWithOffset.findLast(CollectValuesAndGrow));
assertEquals([6, 4], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTracking.findLast(CollectValuesAndGrow));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTrackingWithOffset.findLast(CollectValuesAndGrow));
assertEquals([6, 4], values);
}
})();
(function FindLastIndexGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndGrow(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return false;
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findLastIndex(CollectValuesAndGrow));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findLastIndex(CollectValuesAndGrow));
assertEquals([6, 4], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findLastIndex(CollectValuesAndGrow));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findLastIndex(CollectValuesAndGrow));
assertEquals([6, 4], values);
}
})();
(function Filter() {
for (let ctor of ctors) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(gsab, 0, 4);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(gsab, 0);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, i);
}
// Orig. array: [0, 1, 2, 3]
// [0, 1, 2, 3] << fixedLength
// [2, 3] << fixedLengthWithOffset
// [0, 1, 2, 3, ...] << lengthTracking
// [2, 3, ...] << lengthTrackingWithOffset
function isEven(n) {
return n != undefined && Number(n) % 2 == 0;
}
assertEquals([0, 2], ToNumbers(fixedLength.filter(isEven)));
assertEquals([2], ToNumbers(fixedLengthWithOffset.filter(isEven)));
assertEquals([0, 2], ToNumbers(lengthTracking.filter(isEven)));
assertEquals([2], ToNumbers(lengthTrackingWithOffset.filter(isEven)));
// Grow.
gsab.grow(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 6; ++i) {
WriteToTypedArray(taWrite, i, i);
}
// Orig. array: [0, 1, 2, 3, 4, 5]
// [0, 1, 2, 3] << fixedLength
// [2, 3] << fixedLengthWithOffset
// [0, 1, 2, 3, 4, 5, ...] << lengthTracking
// [2, 3, 4, 5, ...] << lengthTrackingWithOffset
assertEquals([0, 2], ToNumbers(fixedLength.filter(isEven)));
assertEquals([2], ToNumbers(fixedLengthWithOffset.filter(isEven)));
assertEquals([0, 2, 4], ToNumbers(lengthTracking.filter(isEven)));
assertEquals([2, 4], ToNumbers(lengthTrackingWithOffset.filter(isEven)));
}
})();
(function FilterGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndGrow(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return false;
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLength.filter(CollectValuesAndGrow)));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLengthWithOffset.filter(CollectValuesAndGrow)));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
values = [];
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTracking.filter(CollectValuesAndGrow)));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTrackingWithOffset.filter(CollectValuesAndGrow)));
assertEquals([4, 6], values);
}
})();
(function ForEachReduceReduceRight() {
for (let ctor of ctors) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(gsab, 0, 4);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(gsab, 0);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function Helper(array) {
const forEachValues = [];
const reduceValues = [];
const reduceRightValues = [];
array.forEach((n) => { forEachValues.push(n);});
array.reduce((acc, n) => {
reduceValues.push(n);
}, "initial value");
array.reduceRight((acc, n) => {
reduceRightValues.push(n);
}, "initial value");
assertEquals(reduceValues, forEachValues);
reduceRightValues.reverse();
assertEquals(reduceValues, reduceRightValues);
return ToNumbers(forEachValues);
}
assertEquals([0, 2, 4, 6], Helper(fixedLength));
assertEquals([4, 6], Helper(fixedLengthWithOffset));
assertEquals([0, 2, 4, 6], Helper(lengthTracking));
assertEquals([4, 6], Helper(lengthTrackingWithOffset));
// Grow.
gsab.grow(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 6; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6, 8, 10]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, 8, 10, ...] << lengthTracking
// [4, 6, 8, 10, ...] << lengthTrackingWithOffset
assertEquals([0, 2, 4, 6], Helper(fixedLength));
assertEquals([4, 6], Helper(fixedLengthWithOffset));
assertEquals([0, 2, 4, 6, 8, 10], Helper(lengthTracking));
assertEquals([4, 6, 8, 10], Helper(lengthTrackingWithOffset));
}
})();
(function ForEachReduceReduceRightGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateGsabForTest(ctor) {
const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(gsab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return gsab;
}
let values;
let gsab;
let growAfter;
let growTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == growAfter) {
gsab.grow(growTo);
}
return true;
}
function ForEachHelper(array) {
values = [];
array.forEach(CollectValuesAndResize);
return values;
}
function ReduceHelper(array) {
values = [];
array.reduce((acc, n) => { CollectValuesAndResize(n); }, "initial value");
return values;
}
function ReduceRightHelper(array) {
values = [];
array.reduceRight((acc, n) => { CollectValuesAndResize(n); },
"initial value");
return values;
}
// Test for forEach.
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ForEachHelper(fixedLength));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ForEachHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ForEachHelper(lengthTracking));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ForEachHelper(lengthTrackingWithOffset));
}
// Test for reduce.
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ReduceHelper(fixedLength));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ReduceHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ReduceHelper(lengthTracking));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ReduceHelper(lengthTrackingWithOffset));
}
// Test for reduceRight.
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLength = new ctor(gsab, 0, 4);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4, 2, 0], ReduceRightHelper(fixedLength));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4], ReduceRightHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTracking = new ctor(gsab, 0);
growAfter = 2;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4, 2, 0], ReduceRightHelper(lengthTracking));
}
for (let ctor of ctors) {
gsab = CreateGsabForTest(ctor);
const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT);
growAfter = 1;
growTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4], ReduceRightHelper(lengthTrackingWithOffset));
}
})();
...@@ -45,7 +45,11 @@ function WriteToTypedArray(array, index, value) { ...@@ -45,7 +45,11 @@ function WriteToTypedArray(array, index, value) {
function ToNumbers(array) { function ToNumbers(array) {
let result = []; let result = [];
for (let item of array) { for (let item of array) {
result.push(Number(item)); if (typeof item == 'bigint') {
result.push(Number(item));
} else {
result.push(item);
}
} }
return result; return result;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --harmony-rab-gsab --allow-natives-syntax // Flags: --harmony-rab-gsab --allow-natives-syntax --harmony-array-find-last
"use strict"; "use strict";
...@@ -171,7 +171,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -171,7 +171,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
let values = []; let values = [];
let rab; let rab;
let detachAfter; let detachAfter;
function myFunc(n) { function CollectValuesAndDetach(n) {
if (n == undefined) { if (n == undefined) {
values.push(n); values.push(n);
} else { } else {
...@@ -188,7 +188,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -188,7 +188,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const fixedLength = new ctor(rab, 0, 4); const fixedLength = new ctor(rab, 0, 4);
values = []; values = [];
detachAfter = 2; detachAfter = 2;
assertTrue(fixedLength.every(myFunc)); assertTrue(fixedLength.every(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -197,7 +197,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -197,7 +197,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = []; values = [];
detachAfter = 1; detachAfter = 1;
assertTrue(fixedLengthWithOffset.every(myFunc)); assertTrue(fixedLengthWithOffset.every(CollectValuesAndDetach));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
...@@ -206,7 +206,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -206,7 +206,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const lengthTracking = new ctor(rab, 0); const lengthTracking = new ctor(rab, 0);
values = []; values = [];
detachAfter = 2; detachAfter = 2;
assertTrue(lengthTracking.every(myFunc)); assertTrue(lengthTracking.every(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -215,7 +215,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -215,7 +215,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = []; values = [];
detachAfter = 1; detachAfter = 1;
assertTrue(lengthTrackingWithOffset.every(myFunc)); assertTrue(lengthTrackingWithOffset.every(CollectValuesAndDetach));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
})(); })();
...@@ -240,7 +240,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -240,7 +240,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
let values; let values;
let rab; let rab;
let detachAfter; let detachAfter;
function myFunc(n) { function CollectValuesAndDetach(n) {
if (n == undefined) { if (n == undefined) {
values.push(n); values.push(n);
} else { } else {
...@@ -257,7 +257,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -257,7 +257,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const fixedLength = new ctor(rab, 0, 4); const fixedLength = new ctor(rab, 0, 4);
values = []; values = [];
detachAfter = 2; detachAfter = 2;
assertFalse(fixedLength.some(myFunc)); assertFalse(fixedLength.some(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -266,7 +266,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -266,7 +266,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = []; values = [];
detachAfter = 1; detachAfter = 1;
assertFalse(fixedLengthWithOffset.some(myFunc)); assertFalse(fixedLengthWithOffset.some(CollectValuesAndDetach));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
...@@ -275,7 +275,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -275,7 +275,7 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const lengthTracking = new ctor(rab, 0); const lengthTracking = new ctor(rab, 0);
values = []; values = [];
detachAfter = 2; detachAfter = 2;
assertFalse(lengthTracking.some(myFunc)); assertFalse(lengthTracking.some(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -284,7 +284,494 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js'); ...@@ -284,7 +284,494 @@ d8.file.execute('test/mjsunit/typedarray-helpers.js');
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = []; values = [];
detachAfter = 1; detachAfter = 1;
assertFalse(lengthTrackingWithOffset.some(myFunc)); assertFalse(lengthTrackingWithOffset.some(CollectValuesAndDetach));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
})(); })();
(function FindDetachMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndDetach(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
detachAfter = 2;
assertEquals(undefined, fixedLength.find(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
detachAfter = 1;
assertEquals(undefined, fixedLengthWithOffset.find(CollectValuesAndDetach));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
detachAfter = 2;
assertEquals(undefined, lengthTracking.find(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
detachAfter = 1;
assertEquals(undefined, lengthTrackingWithOffset.find(CollectValuesAndDetach));
assertEquals([4, undefined], values);
}
})();
(function FindIndexDetachMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndDetach(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
detachAfter = 2;
assertEquals(-1, fixedLength.findIndex(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
detachAfter = 1;
assertEquals(-1, fixedLengthWithOffset.findIndex(CollectValuesAndDetach));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
detachAfter = 2;
assertEquals(-1, lengthTracking.findIndex(CollectValuesAndDetach));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
detachAfter = 1;
assertEquals(-1, lengthTrackingWithOffset.findIndex(CollectValuesAndDetach));
assertEquals([4, undefined], values);
}
})();
(function FindLastDetachMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndDetach(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
detachAfter = 2;
assertEquals(undefined, fixedLength.findLast(CollectValuesAndDetach));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
detachAfter = 1;
assertEquals(undefined, fixedLengthWithOffset.findLast(CollectValuesAndDetach));
assertEquals([6, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
detachAfter = 2;
assertEquals(undefined, lengthTracking.findLast(CollectValuesAndDetach));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
detachAfter = 1;
assertEquals(undefined, lengthTrackingWithOffset.findLast(CollectValuesAndDetach));
assertEquals([6, undefined], values);
}
})();
(function FindLastIndexDetachMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndDetach(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
detachAfter = 2;
assertEquals(-1, fixedLength.findLastIndex(CollectValuesAndDetach));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
detachAfter = 1;
assertEquals(-1, fixedLengthWithOffset.findLastIndex(CollectValuesAndDetach));
assertEquals([6, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
detachAfter = 2;
assertEquals(-1, lengthTracking.findLastIndex(CollectValuesAndDetach));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
detachAfter = 1;
assertEquals(-1, lengthTrackingWithOffset.findLastIndex(CollectValuesAndDetach));
assertEquals([6, undefined], values);
}
})();
(function FilterShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndDetach(n) {
if (n == undefined) {
values.push(n);
} else {
values.push(Number(n));
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
detachAfter = 2;
assertEquals([], ToNumbers(fixedLength.filter(CollectValuesAndDetach)));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
detachAfter = 1;
assertEquals([], ToNumbers(fixedLengthWithOffset.filter(CollectValuesAndDetach)));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
detachAfter = 2;
assertEquals([], ToNumbers(lengthTracking.filter(CollectValuesAndDetach)));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
detachAfter = 1;
assertEquals([], ToNumbers(lengthTrackingWithOffset.filter(CollectValuesAndDetach)));
assertEquals([4, undefined], values);
}
})();
(function ForEachReduceReduceRightDetachMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let detachAfter;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == detachAfter) {
%ArrayBufferDetach(rab);
}
return true;
}
function ForEachHelper(array) {
values = [];
array.forEach(CollectValuesAndResize);
return values;
}
function ReduceHelper(array) {
values = [];
array.reduce((acc, n) => { CollectValuesAndResize(n); }, "initial value");
return values;
}
function ReduceRightHelper(array) {
values = [];
array.reduceRight((acc, n) => { CollectValuesAndResize(n); },
"initial value");
return values;
}
// Test for forEach.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
detachAfter = 2;
assertEquals([0, 2, undefined, undefined], ForEachHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
detachAfter = 1;
assertEquals([4, undefined], ForEachHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
detachAfter = 2;
assertEquals([0, 2, undefined, undefined], ForEachHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
detachAfter = 1;
assertEquals([4, undefined], ForEachHelper(lengthTrackingWithOffset));
}
// Tests for reduce.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
detachAfter = 2;
assertEquals([0, 2, undefined, undefined], ReduceHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
detachAfter = 1;
assertEquals([4, undefined], ReduceHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
detachAfter = 2;
assertEquals([0, 2, undefined, undefined], ReduceHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
detachAfter = 1;
assertEquals([4, undefined], ReduceHelper(lengthTrackingWithOffset));
}
// Tests for reduceRight.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
detachAfter = 2;
assertEquals([6, 4, undefined, undefined], ReduceRightHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
detachAfter = 1;
assertEquals([6, undefined], ReduceRightHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
detachAfter = 2;
assertEquals([6, 4, undefined, undefined], ReduceRightHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
detachAfter = 1;
assertEquals([6, undefined], ReduceRightHelper(lengthTrackingWithOffset));
}
})();
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --harmony-rab-gsab --allow-natives-syntax // Flags: --harmony-rab-gsab --allow-natives-syntax
// Flags: --harmony-relative-indexing-methods // Flags: --harmony-relative-indexing-methods --harmony-array-find-last
"use strict"; "use strict";
...@@ -2143,11 +2143,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2143,11 +2143,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
let rab; let rab;
let resizeAfter; let resizeAfter;
let resizeTo; let resizeTo;
function myFunc(n) { function CollectValuesAndResize(n) {
if (n == undefined) { if (typeof n == 'bigint') {
values.push(n);
} else {
values.push(Number(n)); values.push(Number(n));
} else {
values.push(n);
} }
if (values.length == resizeAfter) { if (values.length == resizeAfter) {
rab.resize(resizeTo); rab.resize(resizeTo);
...@@ -2161,7 +2161,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2161,7 +2161,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLength.every(myFunc)); assertTrue(fixedLength.every(CollectValuesAndResize));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -2171,7 +2171,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2171,7 +2171,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLengthWithOffset.every(myFunc)); assertTrue(fixedLengthWithOffset.every(CollectValuesAndResize));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
...@@ -2181,7 +2181,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2181,7 +2181,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTracking.every(myFunc)); assertTrue(lengthTracking.every(CollectValuesAndResize));
assertEquals([0, 2, 4, undefined], values); assertEquals([0, 2, 4, undefined], values);
} }
...@@ -2191,7 +2191,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2191,7 +2191,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTrackingWithOffset.every(myFunc)); assertTrue(lengthTrackingWithOffset.every(CollectValuesAndResize));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
})(); })();
...@@ -2217,11 +2217,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2217,11 +2217,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
let rab; let rab;
let resizeAfter; let resizeAfter;
let resizeTo; let resizeTo;
function myFunc(n) { function CollectValuesAndResize(n) {
if (n == undefined) { if (typeof n == 'bigint') {
values.push(n);
} else {
values.push(Number(n)); values.push(Number(n));
} else {
values.push(n);
} }
if (values.length == resizeAfter) { if (values.length == resizeAfter) {
rab.resize(resizeTo); rab.resize(resizeTo);
...@@ -2235,7 +2235,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2235,7 +2235,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLength.every(myFunc)); assertTrue(fixedLength.every(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -2245,7 +2245,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2245,7 +2245,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(fixedLengthWithOffset.every(myFunc)); assertTrue(fixedLengthWithOffset.every(CollectValuesAndResize));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
...@@ -2255,7 +2255,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2255,7 +2255,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTracking.every(myFunc)); assertTrue(lengthTracking.every(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -2265,7 +2265,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2265,7 +2265,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertTrue(lengthTrackingWithOffset.every(myFunc)); assertTrue(lengthTrackingWithOffset.every(CollectValuesAndResize));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
})(); })();
...@@ -2291,11 +2291,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2291,11 +2291,11 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
let rab; let rab;
let resizeAfter; let resizeAfter;
let resizeTo; let resizeTo;
function myFunc(n) { function CollectValuesAndResize(n) {
if (n == undefined) { if (typeof n == 'bigint') {
values.push(n);
} else {
values.push(Number(n)); values.push(Number(n));
} else {
values.push(n);
} }
if (values.length == resizeAfter) { if (values.length == resizeAfter) {
rab.resize(resizeTo); rab.resize(resizeTo);
...@@ -2309,7 +2309,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2309,7 +2309,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLength.some(myFunc)); assertFalse(fixedLength.some(CollectValuesAndResize));
assertEquals([0, 2, undefined, undefined], values); assertEquals([0, 2, undefined, undefined], values);
} }
...@@ -2319,7 +2319,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2319,7 +2319,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLengthWithOffset.some(myFunc)); assertFalse(fixedLengthWithOffset.some(CollectValuesAndResize));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
...@@ -2329,7 +2329,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2329,7 +2329,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTracking.some(myFunc)); assertFalse(lengthTracking.some(CollectValuesAndResize));
assertEquals([0, 2, 4, undefined], values); assertEquals([0, 2, 4, undefined], values);
} }
...@@ -2339,7 +2339,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2339,7 +2339,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT; resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTrackingWithOffset.some(myFunc)); assertFalse(lengthTrackingWithOffset.some(CollectValuesAndResize));
assertEquals([4, undefined], values); assertEquals([4, undefined], values);
} }
})(); })();
...@@ -2365,11 +2365,316 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2365,11 +2365,316 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
let rab; let rab;
let resizeAfter; let resizeAfter;
let resizeTo; let resizeTo;
function myFunc(n) { function CollectValuesAndResize(n) {
if (n == undefined) { if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n); values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLength.some(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLengthWithOffset.some(CollectValuesAndResize));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTracking.some(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
rab = rab;
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTrackingWithOffset.some(CollectValuesAndResize));
assertEquals([4, 6], values);
}
})();
(function FindFindIndexFindLastFindLastIndex() {
for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(rab, 0, 4);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(rab, 0);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function isTwoOrFour(n) {
return n == 2 || n == 4;
}
assertEquals(2, Number(fixedLength.find(isTwoOrFour)));
assertEquals(4, Number(fixedLengthWithOffset.find(isTwoOrFour)));
assertEquals(2, Number(lengthTracking.find(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.find(isTwoOrFour)));
assertEquals(1, fixedLength.findIndex(isTwoOrFour));
assertEquals(0, fixedLengthWithOffset.findIndex(isTwoOrFour));
assertEquals(1, lengthTracking.findIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findIndex(isTwoOrFour));
assertEquals(4, Number(fixedLength.findLast(isTwoOrFour)));
assertEquals(4, Number(fixedLengthWithOffset.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTracking.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.findLast(isTwoOrFour)));
assertEquals(2, fixedLength.findLastIndex(isTwoOrFour));
assertEquals(0, fixedLengthWithOffset.findLastIndex(isTwoOrFour));
assertEquals(2, lengthTracking.findLastIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findLastIndex(isTwoOrFour));
// Shrink so that fixed length TAs go out of bounds.
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
// Orig. array: [0, 2, 4]
// [0, 2, 4, ...] << lengthTracking
// [4, ...] << lengthTrackingWithOffset
assertThrows(() => { fixedLength.find(isTwoOrFour); });
assertThrows(() => { fixedLength.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLength.findLast(isTwoOrFour); });
assertThrows(() => { fixedLength.findLastIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.find(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLast(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLastIndex(isTwoOrFour); });
assertEquals(2, Number(lengthTracking.find(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.find(isTwoOrFour)));
assertEquals(1, lengthTracking.findIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findIndex(isTwoOrFour));
assertEquals(4, Number(lengthTracking.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.findLast(isTwoOrFour)));
assertEquals(2, lengthTracking.findLastIndex(isTwoOrFour));
assertEquals(0, lengthTrackingWithOffset.findLastIndex(isTwoOrFour));
// Shrink so that the TAs with offset go out of bounds.
rab.resize(1 * ctor.BYTES_PER_ELEMENT);
assertThrows(() => { fixedLength.find(isTwoOrFour); });
assertThrows(() => { fixedLength.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLength.findLast(isTwoOrFour); });
assertThrows(() => { fixedLength.findLastIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.find(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLast(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLastIndex(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.find(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findIndex(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findLast(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findLastIndex(isTwoOrFour); });
assertEquals(undefined, lengthTracking.find(isTwoOrFour));
assertEquals(-1, lengthTracking.findIndex(isTwoOrFour));
assertEquals(undefined, lengthTracking.findLast(isTwoOrFour));
assertEquals(-1, lengthTracking.findLastIndex(isTwoOrFour));
// Shrink to zero.
rab.resize(0);
assertThrows(() => { fixedLength.find(isTwoOrFour); });
assertThrows(() => { fixedLength.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLength.findLast(isTwoOrFour); });
assertThrows(() => { fixedLength.findLastIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.find(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findIndex(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLast(isTwoOrFour); });
assertThrows(() => { fixedLengthWithOffset.findLastIndex(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.find(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findIndex(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findLast(isTwoOrFour); });
assertThrows(() => { lengthTrackingWithOffset.findLastIndex(isTwoOrFour); });
assertEquals(undefined, lengthTracking.find(isTwoOrFour));
assertEquals(-1, lengthTracking.findIndex(isTwoOrFour));
assertEquals(undefined, lengthTracking.findLast(isTwoOrFour));
assertEquals(-1, lengthTracking.findLastIndex(isTwoOrFour));
// Grow so that all TAs are back in-bounds.
rab.resize(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 0);
}
WriteToTypedArray(taWrite, 4, 2);
WriteToTypedArray(taWrite, 5, 4);
// Orig. array: [0, 0, 0, 0, 2, 4]
// [0, 0, 0, 0] << fixedLength
// [0, 0] << fixedLengthWithOffset
// [0, 0, 0, 0, 2, 4, ...] << lengthTracking
// [0, 0, 2, 4, ...] << lengthTrackingWithOffset
assertEquals(undefined, fixedLength.find(isTwoOrFour));
assertEquals(undefined, fixedLengthWithOffset.find(isTwoOrFour));
assertEquals(2, Number(lengthTracking.find(isTwoOrFour)));
assertEquals(2, Number(lengthTrackingWithOffset.find(isTwoOrFour)));
assertEquals(-1, fixedLength.findIndex(isTwoOrFour));
assertEquals(-1, fixedLengthWithOffset.findIndex(isTwoOrFour));
assertEquals(4, lengthTracking.findIndex(isTwoOrFour));
assertEquals(2, lengthTrackingWithOffset.findIndex(isTwoOrFour));
assertEquals(undefined, fixedLength.findLast(isTwoOrFour));
assertEquals(undefined, fixedLengthWithOffset.findLast(isTwoOrFour));
assertEquals(4, Number(lengthTracking.findLast(isTwoOrFour)));
assertEquals(4, Number(lengthTrackingWithOffset.findLast(isTwoOrFour)));
assertEquals(-1, fixedLength.findLastIndex(isTwoOrFour));
assertEquals(-1, fixedLengthWithOffset.findLastIndex(isTwoOrFour));
assertEquals(5, lengthTracking.findLastIndex(isTwoOrFour));
assertEquals(3, lengthTrackingWithOffset.findLastIndex(isTwoOrFour));
}
})();
(function FindShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else { } else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLength.find(CollectValuesAndResize));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLengthWithOffset.find(CollectValuesAndResize));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTracking.find(CollectValuesAndResize));
assertEquals([0, 2, 4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTrackingWithOffset.find(CollectValuesAndResize));
assertEquals([4, undefined], values);
}
})();
(function FindGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n)); values.push(Number(n));
} else {
values.push(n);
} }
if (values.length == resizeAfter) { if (values.length == resizeAfter) {
rab.resize(resizeTo); rab.resize(resizeTo);
...@@ -2383,7 +2688,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2383,7 +2688,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLength.some(myFunc)); assertEquals(undefined, fixedLength.find(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -2393,7 +2698,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2393,7 +2698,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 1; resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(fixedLengthWithOffset.some(myFunc)); assertEquals(undefined, fixedLengthWithOffset.find(CollectValuesAndResize));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
...@@ -2403,7 +2708,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2403,7 +2708,7 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
values = []; values = [];
resizeAfter = 2; resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTracking.some(myFunc)); assertEquals(undefined, lengthTracking.find(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values); assertEquals([0, 2, 4, 6], values);
} }
...@@ -2411,10 +2716,1108 @@ function TestIterationAndResize(ta, expected, rab, resize_after, ...@@ -2411,10 +2716,1108 @@ function TestIterationAndResize(ta, expected, rab, resize_after,
rab = CreateRabForTest(ctor); rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = []; values = [];
rab = rab;
resizeAfter = 1; resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT; resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertFalse(lengthTrackingWithOffset.some(myFunc)); assertEquals(undefined, lengthTrackingWithOffset.find(CollectValuesAndResize));
assertEquals([4, 6], values); assertEquals([4, 6], values);
} }
})(); })();
(function FindIndexShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findIndex(CollectValuesAndResize));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findIndex(CollectValuesAndResize));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findIndex(CollectValuesAndResize));
assertEquals([0, 2, 4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findIndex(CollectValuesAndResize));
assertEquals([4, undefined], values);
}
})();
(function FindIndexGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findIndex(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findIndex(CollectValuesAndResize));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findIndex(CollectValuesAndResize));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findIndex(CollectValuesAndResize));
assertEquals([4, 6], values);
}
})();
(function FindLastShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLength.findLast(CollectValuesAndResize));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLengthWithOffset.findLast(CollectValuesAndResize));
assertEquals([6, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTracking.findLast(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTrackingWithOffset.findLast(CollectValuesAndResize));
assertEquals([6, 4], values);
}
})();
(function FindLastGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLength.findLast(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, fixedLengthWithOffset.findLast(CollectValuesAndResize));
assertEquals([6, 4], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTracking.findLast(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(undefined, lengthTrackingWithOffset.findLast(CollectValuesAndResize));
assertEquals([6, 4], values);
}
})();
(function FindLastIndexShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findLastIndex(CollectValuesAndResize));
assertEquals([6, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 1;
resizeTo = 2 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findLastIndex(CollectValuesAndResize));
assertEquals([6, undefined, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4], values);
}
})();
(function FindLastIndexGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLength.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, fixedLengthWithOffset.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTracking.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4, 2, 0], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals(-1, lengthTrackingWithOffset.findLastIndex(CollectValuesAndResize));
assertEquals([6, 4], values);
}
})();
(function Filter() {
for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(rab, 0, 4);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(rab, 0);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, i);
}
// Orig. array: [0, 1, 2, 3]
// [0, 1, 2, 3] << fixedLength
// [2, 3] << fixedLengthWithOffset
// [0, 1, 2, 3, ...] << lengthTracking
// [2, 3, ...] << lengthTrackingWithOffset
function isEven(n) {
return n != undefined && Number(n) % 2 == 0;
}
assertEquals([0, 2], ToNumbers(fixedLength.filter(isEven)));
assertEquals([2], ToNumbers(fixedLengthWithOffset.filter(isEven)));
assertEquals([0, 2], ToNumbers(lengthTracking.filter(isEven)));
assertEquals([2], ToNumbers(lengthTrackingWithOffset.filter(isEven)));
// Shrink so that fixed length TAs go out of bounds.
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
// Orig. array: [0, 1, 2]
// [0, 1, 2, ...] << lengthTracking
// [2, ...] << lengthTrackingWithOffset
assertThrows(() => { fixedLength.filter(isEven); });
assertThrows(() => { fixedLengthWithOffset.filter(isEven); });
assertEquals([0, 2], ToNumbers(lengthTracking.filter(isEven)));
assertEquals([2], ToNumbers(lengthTrackingWithOffset.filter(isEven)));
// Shrink so that the TAs with offset go out of bounds.
rab.resize(1 * ctor.BYTES_PER_ELEMENT);
assertThrows(() => { fixedLength.filter(isEven); });
assertThrows(() => { fixedLengthWithOffset.filter(isEven); });
assertThrows(() => { lengthTrackingWithOffset.filter(isEven); });
assertEquals([0], ToNumbers(lengthTracking.filter(isEven)));
// Shrink to zero.
rab.resize(0);
assertThrows(() => { fixedLength.filter(isEven); });
assertThrows(() => { fixedLengthWithOffset.filter(isEven); });
assertThrows(() => { lengthTrackingWithOffset.filter(isEven); });
assertEquals([], ToNumbers(lengthTracking.filter(isEven)));
// Grow so that all TAs are back in-bounds.
rab.resize(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 6; ++i) {
WriteToTypedArray(taWrite, i, i);
}
// Orig. array: [0, 1, 2, 3, 4, 5]
// [0, 1, 2, 3] << fixedLength
// [2, 3] << fixedLengthWithOffset
// [0, 1, 2, 3, 4, 5, ...] << lengthTracking
// [2, 3, 4, 5, ...] << lengthTrackingWithOffset
assertEquals([0, 2], ToNumbers(fixedLength.filter(isEven)));
assertEquals([2], ToNumbers(fixedLengthWithOffset.filter(isEven)));
assertEquals([0, 2, 4], ToNumbers(lengthTracking.filter(isEven)));
assertEquals([2, 4], ToNumbers(lengthTrackingWithOffset.filter(isEven)));
}
})();
(function FilterShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLength.filter(CollectValuesAndResize)));
assertEquals([0, 2, undefined, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLengthWithOffset.filter(CollectValuesAndResize)));
assertEquals([4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTracking.filter(CollectValuesAndResize)));
assertEquals([0, 2, 4, undefined], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTrackingWithOffset.filter(CollectValuesAndResize)));
assertEquals([4, undefined], values);
}
})();
(function FilterGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return false;
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLength.filter(CollectValuesAndResize)));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(fixedLengthWithOffset.filter(CollectValuesAndResize)));
assertEquals([4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
values = [];
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTracking.filter(CollectValuesAndResize)));
assertEquals([0, 2, 4, 6], values);
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
values = [];
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([], ToNumbers(lengthTrackingWithOffset.filter(CollectValuesAndResize)));
assertEquals([4, 6], values);
}
})();
(function ForEachReduceReduceRight() {
for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(rab, 0, 4);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
const lengthTracking = new ctor(rab, 0);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function Helper(array) {
const forEachValues = [];
const reduceValues = [];
const reduceRightValues = [];
array.forEach((n) => { forEachValues.push(n);});
array.reduce((acc, n) => {
reduceValues.push(n);
}, "initial value");
array.reduceRight((acc, n) => {
reduceRightValues.push(n);
}, "initial value");
assertEquals(reduceValues, forEachValues);
reduceRightValues.reverse();
assertEquals(reduceValues, reduceRightValues);
return ToNumbers(forEachValues);
}
assertEquals([0, 2, 4, 6], Helper(fixedLength));
assertEquals([4, 6], Helper(fixedLengthWithOffset));
assertEquals([0, 2, 4, 6], Helper(lengthTracking));
assertEquals([4, 6], Helper(lengthTrackingWithOffset));
// Shrink so that fixed length TAs go out of bounds.
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
// Orig. array: [0, 2, 4]
// [0, 2, 4, ...] << lengthTracking
// [4, ...] << lengthTrackingWithOffset
assertThrows(() => { Helper(fixedLength); });
assertThrows(() => { Helper(fixedLengthWithOffset); });
assertEquals([0, 2, 4], Helper(lengthTracking));
assertEquals([4], Helper(lengthTrackingWithOffset));
// Shrink so that the TAs with offset go out of bounds.
rab.resize(1 * ctor.BYTES_PER_ELEMENT);
assertThrows(() => { Helper(fixedLength); });
assertThrows(() => { Helper(fixedLengthWithOffset); });
assertThrows(() => { Helper(lengthTrackingWithOffset); });
assertEquals([0], Helper(lengthTracking));
// Shrink to zero.
rab.resize(0);
assertThrows(() => { Helper(fixedLength); });
assertThrows(() => { Helper(fixedLengthWithOffset); });
assertThrows(() => { Helper(lengthTrackingWithOffset); });
assertEquals([], Helper(lengthTracking));
// Grow so that all TAs are back in-bounds.
rab.resize(6 * ctor.BYTES_PER_ELEMENT);
for (let i = 0; i < 6; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
// Orig. array: [0, 2, 4, 6, 8, 10]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, 8, 10, ...] << lengthTracking
// [4, 6, 8, 10, ...] << lengthTrackingWithOffset
assertEquals([0, 2, 4, 6], Helper(fixedLength));
assertEquals([4, 6], Helper(fixedLengthWithOffset));
assertEquals([0, 2, 4, 6, 8, 10], Helper(lengthTracking));
assertEquals([4, 6, 8, 10], Helper(lengthTrackingWithOffset));
}
})();
(function ForEachReduceReduceRightShrinkMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return true;
}
function ForEachHelper(array) {
values = [];
array.forEach(CollectValuesAndResize);
return values;
}
function ReduceHelper(array) {
values = [];
array.reduce((acc, n) => { CollectValuesAndResize(n); }, "initial value");
return values;
}
function ReduceRightHelper(array) {
values = [];
array.reduceRight((acc, n) => { CollectValuesAndResize(n); },
"initial value");
return values;
}
// Test for forEach.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, undefined, undefined], ForEachHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, undefined], ForEachHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, undefined], ForEachHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, undefined], ForEachHelper(lengthTrackingWithOffset));
}
// Tests for reduce.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, undefined, undefined], ReduceHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, undefined], ReduceHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, undefined], ReduceHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, undefined], ReduceHelper(lengthTrackingWithOffset));
}
// Tests for reduceRight.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4, undefined, undefined], ReduceRightHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, undefined], ReduceRightHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
// Unaffected by the shrinking, since we've already iterated past the point.
assertEquals([6, 4, 2, 0], ReduceRightHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 1;
resizeTo = 2 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, undefined, 2, 0], ReduceRightHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
// Unaffected by the shrinking, since we've already iterated past the point.
assertEquals([6, 4], ReduceRightHelper(lengthTrackingWithOffset));
}
})();
(function ForEachReduceReduceRightGrowMidIteration() {
// Orig. array: [0, 2, 4, 6]
// [0, 2, 4, 6] << fixedLength
// [4, 6] << fixedLengthWithOffset
// [0, 2, 4, 6, ...] << lengthTracking
// [4, 6, ...] << lengthTrackingWithOffset
function CreateRabForTest(ctor) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT,
8 * ctor.BYTES_PER_ELEMENT);
// Write some data into the array.
const taWrite = new ctor(rab);
for (let i = 0; i < 4; ++i) {
WriteToTypedArray(taWrite, i, 2 * i);
}
return rab;
}
let values;
let rab;
let resizeAfter;
let resizeTo;
function CollectValuesAndResize(n) {
if (typeof n == 'bigint') {
values.push(Number(n));
} else {
values.push(n);
}
if (values.length == resizeAfter) {
rab.resize(resizeTo);
}
return true;
}
function ForEachHelper(array) {
values = [];
array.forEach(CollectValuesAndResize);
return values;
}
function ReduceHelper(array) {
values = [];
array.reduce((acc, n) => { CollectValuesAndResize(n); }, "initial value");
return values;
}
function ReduceRightHelper(array) {
values = [];
array.reduceRight((acc, n) => { CollectValuesAndResize(n); },
"initial value");
return values;
}
// Test for forEach.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ForEachHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ForEachHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ForEachHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ForEachHelper(lengthTrackingWithOffset));
}
// Test for reduce.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ReduceHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ReduceHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([0, 2, 4, 6], ReduceHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([4, 6], ReduceHelper(lengthTrackingWithOffset));
}
// Test for reduceRight.
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLength = new ctor(rab, 0, 4);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4, 2, 0], ReduceRightHelper(fixedLength));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4], ReduceRightHelper(fixedLengthWithOffset));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTracking = new ctor(rab, 0);
resizeAfter = 2;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4, 2, 0], ReduceRightHelper(lengthTracking));
}
for (let ctor of ctors) {
rab = CreateRabForTest(ctor);
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
resizeAfter = 1;
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
assertEquals([6, 4], ReduceRightHelper(lengthTrackingWithOffset));
}
})();
...@@ -422,18 +422,6 @@ ...@@ -422,18 +422,6 @@
'built-ins/DataView/prototype/setUint16/resizable-buffer': [FAIL], 'built-ins/DataView/prototype/setUint16/resizable-buffer': [FAIL],
'built-ins/DataView/prototype/setUint32/resizable-buffer': [FAIL], 'built-ins/DataView/prototype/setUint32/resizable-buffer': [FAIL],
'built-ins/DataView/prototype/setUint8/resizable-buffer': [FAIL], 'built-ins/DataView/prototype/setUint8/resizable-buffer': [FAIL],
'built-ins/TypedArray/prototype/filter/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/filter/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/find/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findIndex/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findIndex/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findLast/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findLastIndex/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findLastIndex/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/findLast/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/find/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/forEach/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/forEach/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/includes/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/includes/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/includes/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/includes/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/indexOf/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/indexOf/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
...@@ -444,10 +432,6 @@ ...@@ -444,10 +432,6 @@
'built-ins/TypedArray/prototype/lastIndexOf/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/lastIndexOf/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/map/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/map/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/map/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/map/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reduce/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reduce/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reduceRight/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reduceRight/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reverse/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/reverse/BigInt/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/reverse/return-abrupt-from-this-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/reverse/return-abrupt-from-this-out-of-bounds': [SKIP],
'built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-out-of-bounds': [SKIP], 'built-ins/TypedArray/prototype/set/BigInt/typedarray-arg-target-out-of-bounds': [SKIP],
......
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