prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
1,186 lines (722 loc) • 65.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
exports.build = build;
var _types = require("../../types.js");
var _index = require("../../values/index.js");
var _call = require("../../methods/call.js");
var _get = require("../../methods/get.js");
var _has = require("../../methods/has.js");
var _is = require("../../methods/is.js");
var _typedarray = require("../../methods/typedarray.js");
var _arraybuffer = require("../../methods/arraybuffer.js");
var _abstract = require("../../methods/abstract.js");
var _singletons = require("../../singletons.js");
var _invariant = _interopRequireDefault(require("../../invariant.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
/* strict-local */
function _default(realm, obj) {
// ECMA262 22.2.3.1
obj.defineNativeGetter("buffer", context => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. If Type(O) is not Object, return undefined.
if (!(O instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
} // 3. If O does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (!("$TypedArrayName" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have a [[TypedArrayName]] internal slot");
} // 4. Assert: O has a [[ViewedArrayBuffer]] internal slot.
(0, _invariant.default)(O.$ViewedArrayBuffer, "O has a [[ViewedArrayBuffer]]"); // 5. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer; // 6. Return buffer.
return buffer;
}); // ECMA262 22.2.3.2
obj.defineNativeGetter("byteLength", context => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. If Type(O) is not Object, throw a TypeError exception.
if (!(O instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
} // 3. If O does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (!("$TypedArrayName" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have a [[TypedArrayName]] internal slot");
} // 4. Assert: O has [[ViewedArrayBuffer]] and [[ArrayLength]] internal slots.
(0, _invariant.default)(O.$ViewedArrayBuffer, "O has a [[ViewedArrayBuffer]] internal slot"); // 5. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
(0, _invariant.default)(buffer); // 6. If IsDetachedBuffer(buffer) is true, return 0.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) return realm.intrinsics.zero; // 7. Let size be O.[[ByteLength]].
let size = O.$ByteLength;
(0, _invariant.default)(typeof size === "number"); // 8. Return size.
return new _index.NumberValue(realm, size);
}); // ECMA262 22.2.3.3
obj.defineNativeGetter("byteOffset", context => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. If Type(O) is not Object, throw a TypeError exception.
if (!(O instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
} // 3. If O does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (!("$TypedArrayName" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have a [[TypedArrayName]] internal slot");
} // 4. Assert: O has [[ViewedArrayBuffer]] and [[ArrayLength]] internal slots.
(0, _invariant.default)(O.$ViewedArrayBuffer, "O has a [[ViewedArrayBuffer]] internal slot"); // 5. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
(0, _invariant.default)(buffer); // 6. If IsDetachedBuffer(buffer) is true, return 0.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) return realm.intrinsics.zero; // 7. Let offset be O.[[ByteOffset]].
let offset = O.$ByteOffset;
(0, _invariant.default)(typeof offset === "number"); // 8. Return offset.
return new _index.NumberValue(realm, offset);
}); // ECMA262 22.2.3.5
obj.defineNativeMethod("copyWithin", 2, (context, [target, start, end]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. Let relativeTarget be ? ToInteger(target).
let relativeTarget = _singletons.To.ToInteger(realm, target); // 5. If relativeTarget < 0, let to be max((len + relativeTarget), 0); else let to be min(relativeTarget, len).
let to = relativeTarget < 0 ? Math.max(len + relativeTarget, 0) : Math.min(relativeTarget, len); // 6. Let relativeStart be ? ToInteger(start).
let relativeStart = _singletons.To.ToInteger(realm, start); // 7. If relativeStart < 0, let from be max((len + relativeStart), 0); else let from be min(relativeStart, len).
let from = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // 8. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
let relativeEnd = !end || end instanceof _index.UndefinedValue ? len : _singletons.To.ToInteger(realm, end.throwIfNotConcrete()); // 9. If relativeEnd < 0, let final be max((len + relativeEnd), 0); else let final be min(relativeEnd, len).
let final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // 10. Let count be min(final-from, len-to).
let count = Math.min(final - from, len - to);
let direction; // 11. If from<to and to<from+count, then
if (from < to && to < from + count) {
// a. Let direction be -1.
direction = -1; // b. Let from be from + count - 1.
from = from + count - 1; // c. Let to be to + count - 1.
to = to + count - 1;
} else {
// 12. Else,
// a. Let direction be 1.
direction = 1;
} // 13. Repeat, while count > 0
while (count > 0) {
// a. Let fromKey be ! ToString(from).
let fromKey = _singletons.To.ToString(realm, new _index.NumberValue(realm, from)); // b. Let toKey be ! ToString(to).
let toKey = _singletons.To.ToString(realm, new _index.NumberValue(realm, to)); // c. Let fromPresent be ? HasProperty(O, fromKey).
let fromPresent = (0, _has.HasProperty)(realm, O, fromKey); // d. If fromPresent is true, then
if (fromPresent === true) {
// i. Let fromVal be ? Get(O, fromKey).
let fromVal = (0, _get.Get)(realm, O, fromKey); // ii. Perform ? Set(O, toKey, fromVal, true).
_singletons.Properties.Set(realm, O, toKey, fromVal, true);
} else {
// e. Else fromPresent is false,
// i. Perform ? DeletePropertyOrThrow(O, toKey).
_singletons.Properties.DeletePropertyOrThrow(realm, O.throwIfNotConcreteObject(), toKey);
} // f. Let from be from + direction.
from = from + direction; // g. Let to be to + direction.
to = to + direction; // h. Let count be count - 1.
count = count - 1;
} // 14. Return O.
return O;
}); // ECMA262 22.2.3.6
obj.defineNativeMethod("entries", 0, context => {
// 1. Let O be the this value.
let O = context; // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O);
(0, _invariant.default)(O instanceof _index.ObjectValue); // 3. Return CreateArrayIterator(O, "key+value").
return _singletons.Create.CreateArrayIterator(realm, O, "key+value");
}); // ECMA262 22.2.3.7
obj.defineNativeMethod("every", 1, (context, [callbackfn, thisArg]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if (!(0, _is.IsCallable)(realm, callbackfn)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg || realm.intrinsics.undefined; // 6. Let k be 0.
let k = 0; // 7. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk).
let kPresent = (0, _has.HasProperty)(realm, O, Pk); // c. If kPresent is true, then
if (kPresent) {
// i. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // ii. Let testResult be ToBoolean(? Call(callbackfn, T, « kValue, k, O »)).
let testResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O])); // iii. If testResult is false, return false.
if (!testResult) return realm.intrinsics.false;
} // d. Increase k by 1.
k++;
} // 8. Return true.
return realm.intrinsics.true;
}); // ECMA262 22.2.3.8
obj.defineNativeMethod("fill", 1, (context, [value, start, end]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. Let relativeStart be ? ToInteger(start).
let relativeStart = _singletons.To.ToInteger(realm, start || realm.intrinsics.undefined); // 5. If relativeStart < 0, let k be max((len + relativeStart), 0); else let k be min(relativeStart, len).
let k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // 6. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
let relativeEnd = !end || end instanceof _index.UndefinedValue ? len : _singletons.To.ToInteger(realm, end.throwIfNotConcrete()); // 7. If relativeEnd < 0, let final be max((len + relativeEnd), 0); else let final be min(relativeEnd, len).
let final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // 8. Repeat, while k < final
while (k < final) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Perform ? Set(O, Pk, value, true).
_singletons.Properties.Set(realm, O, Pk, value, true); // c. Increase k by 1.
k++;
} // 9. Return O.
return O;
}); // ECMA262 22.2.3.9
obj.defineNativeMethod("filter", 1, (context, [callbackfn, thisArg]) => {
// 1. Let O be the this value.
let O = context; // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O);
(0, _invariant.default)(O instanceof _index.ObjectValue); // 3. Let len be O.[[ArrayLength]].
let len = O.$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if ((0, _is.IsCallable)(realm, callbackfn) === false) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsCallable(callbackfn) is false");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg ? thisArg : realm.intrinsics.undefined; // 6. Let kept be a new empty List.
let kept = []; // 7. Let k be 0.
let k = 0; // 8. Let captured be 0.
let captured = 0; // 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = _singletons.To.ToString(realm, new _index.NumberValue(realm, k)); // b. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // c. Let selected be ToBoolean(? Call(callbackfn, T, « kValue, k, O »)).
let selected = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O])); // d. If selected is true, then
if (selected === true) {
// i. Append kValue to the end of kept.
kept.push(kValue); // ii. Increase captured by 1.
captured += 1;
} // e. Increase k by 1.
k += 1;
} // 10. Let A be ? TypedArraySpeciesCreate(O, « captured »).
let A = (0, _typedarray.TypedArraySpeciesCreate)(realm, O, [new _index.NumberValue(realm, captured)]); // 11. Let n be 0.
let n = 0; // 12. For each element e of kept
for (let e of kept) {
// a. Perform ! Set(A, ! ToString(n), e, true).
_singletons.Properties.Set(realm, A, new _index.StringValue(realm, _singletons.To.ToString(realm, new _index.NumberValue(realm, n))), e, true); // b. Increment n by 1.
n = n + 1;
} // 13. Return A.
return A;
}); // ECMA262 22.2.3.10
obj.defineNativeMethod("find", 1, (context, [predicate, thisArg]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(predicate) is false, throw a TypeError exception.
if (!(0, _is.IsCallable)(realm, predicate)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg || realm.intrinsics.undefined; // 6. Let k be 0.
let k = 0; // 7. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
let testResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, predicate, T, [kValue, new _index.NumberValue(realm, k), O])); // d. If testResult is true, return kValue.
if (testResult) return kValue; // e. Increase k by 1.
k++;
} // 8. Return undefined.
return realm.intrinsics.undefined;
}); // ECMA262 22.2.3.11
obj.defineNativeMethod("findIndex", 1, (context, [predicate, thisArg]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(predicate) is false, throw a TypeError exception.
if ((0, _is.IsCallable)(realm, predicate) === false) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg ? thisArg : realm.intrinsics.undefined; // 6. Let k be 0.
let k = 0; // 7. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = _singletons.To.ToString(realm, new _index.NumberValue(realm, k)); // b. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, new _index.StringValue(realm, Pk)); // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
let testResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, predicate, T, [kValue, new _index.NumberValue(realm, k), O])); // d. If testResult is true, return k.
if (testResult === true) return new _index.NumberValue(realm, k); // e. Increase k by 1.
k = k + 1;
} // 8. Return -1.
return new _index.NumberValue(realm, -1);
}); // ECMA262 22.2.3.12
obj.defineNativeMethod("forEach", 1, (context, [callbackfn, thisArg]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if (!(0, _is.IsCallable)(realm, callbackfn)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg || realm.intrinsics.undefined; // 6. Let k be 0.
let k = 0; // 7. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk).
let kPresent = (0, _has.HasProperty)(realm, O, Pk); // c. If kPresent is true, then
if (kPresent) {
// i. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // ii. Perform ? Call(callbackfn, T, « kValue, k, O »).
(0, _call.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O]);
} // d. Increase k by 1.
k++;
} // 8. Return undefined.
return realm.intrinsics.undefined;
}); // ECMA262 22.2.3.14
obj.defineNativeMethod("includes", 1, (context, [searchElement, fromIndex]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If len is 0, return false.
if (len === 0) return realm.intrinsics.false; // 5. Let n be ? ToInteger(fromIndex). (If fromIndex is undefined, this step produces the value 0.)
let n = _singletons.To.ToInteger(realm, fromIndex || realm.intrinsics.undefined);
let k; // 6. If n ≥ 0, then
if (n >= 0) {
// a. Let k be n.
k = n;
} else {
// 7. Else n < 0,
// a. Let k be len + n.
k = len + n; // b. If k < 0, let k be 0.
if (k < 0) k = 0;
} // 8. Repeat, while k < len
while (k < len) {
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
let elementK = (0, _get.Get)(realm, O, _singletons.To.ToString(realm, new _index.NumberValue(realm, k))); // b. If SameValueZero(searchElement, elementK) is true, return true.
if ((0, _abstract.SameValueZeroPartial)(realm, searchElement, elementK) === true) return realm.intrinsics.true; // c. Increase k by 1.
k = k + 1;
} // 9. Return false.
return realm.intrinsics.false;
}); // ECMA262 22.2.3.14
obj.defineNativeMethod("indexOf", 1, (context, [searchElement, fromIndex]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If len is 0, return -1.
if (len === 0) return new _index.NumberValue(realm, -1); // 5. Let n be ? ToInteger(fromIndex). (If fromIndex is undefined, this step produces the value 0.)
let n = fromIndex ? _singletons.To.ToInteger(realm, fromIndex) : 0; // 6. If n ≥ len, return -1.
if (n >= len) return new _index.NumberValue(realm, -1); // 7. If n ≥ 0, then
let k;
if (n >= 0) {
// a. If n is -0, let k be +0; else let k be n.
k = Object.is(n, -0) ? +0 : n;
} else {
// 8. Else n < 0,
// a. Let k be len + n.
k = len + n; // b. If k < 0, let k be 0.
if (k < 0) k = 0;
} // 9. Repeat, while k < len
while (k < len) {
// a. Let kPresent be ? HasProperty(O, ! ToString(k)).
let kPresent = (0, _has.HasProperty)(realm, O, k + ""); // b. If kPresent is true, then
if (kPresent === true) {
// i. Let elementK be ? Get(O, ! ToString(k)).
let elementK = (0, _get.Get)(realm, O, k + ""); // ii. Let same be the result of performing Strict Equality Comparison searchElement === elementK.
let same = (0, _abstract.StrictEqualityComparisonPartial)(realm, searchElement, elementK); // iii. If same is true, return k.
if (same) return new _index.NumberValue(realm, k);
} // c. Increase k by 1.
k++;
} // 10. Return -1.
return new _index.NumberValue(realm, -1);
}); // ECMA262 22.2.3.15
obj.defineNativeMethod("join", 1, (context, [_separator]) => {
let separator = _separator; // 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If separator is undefined, let separator be the single-element String ",".
if (!separator || separator instanceof _index.UndefinedValue) separator = new _index.StringValue(realm, ","); // 5. Let sep be ? ToString(separator).
let sep = _singletons.To.ToStringPartial(realm, separator); // 6. If len is zero, return the empty String.
if (len === 0) return realm.intrinsics.emptyString; // 7. Let element0 be Get(O, "0").
let element0 = (0, _get.Get)(realm, O, "0"); // 8. If element0 is undefined or null, let R be the empty String; otherwise, let R be ? ToString(element0).
let R;
if ((0, _has.HasSomeCompatibleType)(element0, _index.UndefinedValue, _index.NullValue)) {
R = "";
} else {
R = _singletons.To.ToStringPartial(realm, element0);
} // 9. Let k be 1.
let k = 1; // 10. Repeat, while k < len
while (k < len) {
// a. Let S be the String value produced by concatenating R and sep.
let S = R + sep; // b. Let element be ? Get(O, ! ToString(k)).
let element = (0, _get.Get)(realm, O, new _index.StringValue(realm, k + "")); // c. If element is undefined or null, let next be the empty String; otherwise, let next be ? ToString(element).
let next;
if ((0, _has.HasSomeCompatibleType)(element, _index.UndefinedValue, _index.NullValue)) {
next = "";
} else {
next = _singletons.To.ToStringPartial(realm, element);
} // d. Let R be a String value produced by concatenating S and next.
R = S + next; // e. Increase k by 1.
k++;
} // 11. Return R.
return new _index.StringValue(realm, R + "");
}); // ECMA262 22.2.3.16
obj.defineNativeMethod("keys", 0, context => {
// 1. Let O be the this value.
let O = context; // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O);
(0, _invariant.default)(O instanceof _index.ObjectValue); // 3. Return CreateArrayIterator(O, "key").
return _singletons.Create.CreateArrayIterator(realm, O, "key");
}); // ECMA262 22.2.3.17
obj.defineNativeMethod("lastIndexOf", 1, (context, [searchElement, fromIndex]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If len is 0, return -1.
if (len === 0) return new _index.NumberValue(realm, -1); // 5. If argument fromIndex was passed, let n be ? ToInteger(fromIndex); else let n be len-1.
let n = fromIndex ? _singletons.To.ToInteger(realm, fromIndex) : len - 1; // 6. If n ≥ 0, then
let k;
if (n >= 0) {
// a. If n is -0, let k be +0; else let k be min(n, len - 1).
k = Object.is(n, -0) ? +0 : Math.min(n, len - 1);
} else {
// 7. Else n < 0,
// a. Let k be len + n.
k = len + n;
} // 8. Repeat, while k ≥ 0
while (k >= 0) {
// a. Let kPresent be ? HasProperty(O, ! ToString(k)).
let kPresent = (0, _has.HasProperty)(realm, O, new _index.StringValue(realm, k + "")); // b. If kPresent is true, then
if (kPresent) {
// i. Let elementK be ? Get(O, ! ToString(k)).
let elementK = (0, _get.Get)(realm, O, new _index.StringValue(realm, k + "")); // ii. Let same be the result of performing Strict Equality Comparison searchElement === elementK.
let same = (0, _abstract.StrictEqualityComparisonPartial)(realm, searchElement, elementK); // iii. If same is true, return k.
if (same) return new _index.NumberValue(realm, k);
} // c. Decrease k by 1.
k--;
} // 9. Return -1.
return new _index.NumberValue(realm, -1);
}); // ECMA262 22.2.3.18
obj.defineNativeGetter("length", context => {
// 1. Let O be the this value.
let O = context.throwIfNotConcrete(); // 2. If Type(O) is not Object, throw a TypeError exception.
if (!(O instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(O) is not Object");
} // 3. If O does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (!("$TypedArrayName" in O)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "O does not have a [[TypedArrayName]] internal slot");
} // 4. Assert: O has [[ViewedArrayBuffer]] and [[ArrayLength]] internal slots.
(0, _invariant.default)(O.$ViewedArrayBuffer, "O has a [[ViewedArrayBuffer]] internal slot"); // 5. Let buffer be O.[[ViewedArrayBuffer]].
let buffer = O.$ViewedArrayBuffer;
(0, _invariant.default)(buffer); // 6. If IsDetachedBuffer(buffer) is true, return 0.
if ((0, _is.IsDetachedBuffer)(realm, buffer) === true) return realm.intrinsics.zero; // 7. Let length be O.[[ArrayLength]].
let length = O.$ArrayLength;
(0, _invariant.default)(typeof length === "number"); // 8. Return length.
return new _index.NumberValue(realm, length);
}); // ECMA262 22.2.3.19
obj.defineNativeMethod("map", 1, (context, [callbackfn, thisArg]) => {
// 1. Let O be the this value.
let O = context; // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O);
(0, _invariant.default)(O instanceof _index.ObjectValue); // 3. Let len be O.[[ArrayLength]].
let len = O.$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if ((0, _is.IsCallable)(realm, callbackfn) === false) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsCallable(callbackfn) is false");
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg ? thisArg : realm.intrinsics.undefined; // 6. Let A be ? TypedArraySpeciesCreate(O, « len »).
let A = (0, _typedarray.TypedArraySpeciesCreate)(realm, O, [new _index.NumberValue(realm, len)]); // 7. Let k be 0.
let k = 0; // 8. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = _singletons.To.ToString(realm, new _index.NumberValue(realm, k)); // b. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // c. Let mappedValue be ? Call(callbackfn, T, « kValue, k, O »).
let mappedValue = (0, _call.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O]); // d. Perform ? Set(A, Pk, mappedValue, true).
_singletons.Properties.Set(realm, A, Pk, mappedValue, true); // e. Increase k by 1.
k = k + 1;
} // 9. Return A.
return A;
}); // ECMA262 22.2.3.20
obj.defineNativeMethod("reduce", 1, (context, [callbackfn, initialValue]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if (!(0, _is.IsCallable)(realm, callbackfn)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If len is 0 and initialValue is not present, throw a TypeError exception.
if (len === 0 && !initialValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Array.prototype");
} // 6. Let k be 0.
let k = 0; // 7. If initialValue is present, then
let accumulator;
if (initialValue) {
// a. Set accumulator to initialValue.
accumulator = initialValue;
} else {
// 8. Else initialValue is not present,
// a. Let kPresent be false.
let kPresent = false; // b. Repeat, while kPresent is false and k < len
while (kPresent === false && k < len) {
// i. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // ii. Let kPresent be ? HasProperty(O, Pk).
kPresent = (0, _has.HasProperty)(realm, O, Pk); // iv. If kPresent is true, then
if (kPresent) {
// 1. Let accumulator be ? Get(O, Pk).
accumulator = (0, _get.Get)(realm, O, Pk);
} // v. Increase k by 1.
k++;
} // c. If kPresent is false, throw a TypeError exception.
if (!kPresent) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "kPresent is false");
}
(0, _invariant.default)(accumulator);
} // 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk).
let kPresent = (0, _has.HasProperty)(realm, O, Pk); // c. If kPresent is true, then
if (kPresent) {
// i. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // ii. Let accumulator be ? Call(callbackfn, undefined, « accumulator, kValue, k, O »).
accumulator = (0, _call.Call)(realm, callbackfn, realm.intrinsics.undefined, [accumulator, kValue, new _index.NumberValue(realm, k), O]);
} // d. Increase k by 1.
k++;
} // 10. Return accumulator.
return accumulator;
}); // ECMA262 22.2.3.21
obj.defineNativeMethod("reduceRight", 1, (context, [callbackfn, initialValue]) => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if (!(0, _is.IsCallable)(realm, callbackfn)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function");
} // 5. If len is 0 and initialValue is not present, throw a TypeError exception.
if (len === 0 && !initialValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Array.prototype");
} // 6. Let k be len-1.
let k = len - 1; // 7. If initialValue is present, then
let accumulator;
if (initialValue) {
// 1. Set accumulator to initialValue.
accumulator = initialValue;
} else {
// 8. Else initialValue is not present,
// a. Let kPresent be false.
let kPresent = false; // b. Repeat, while kPresent is false and k ≥ 0
while (!kPresent && k >= 0) {
// i. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // ii. Let kPresent be ? HasProperty(O, Pk).
kPresent = (0, _has.HasProperty)(realm, O, Pk); // iii. If kPresent is true, then
if (kPresent) {
// 1. Let accumulator be ? Get(O, Pk).
accumulator = (0, _get.Get)(realm, O, Pk);
} // iv. Decrease k by 1.
k--;
} // c. If kPresent is false, throw a TypeError exception.
if (!kPresent || !accumulator) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Array.prototype");
}
} // 9. Repeat, while k ≥ 0
while (k >= 0) {
// a. Let Pk be ! ToString(k).
let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk).
let kPresent = (0, _has.HasProperty)(realm, O, Pk); // c. If kPresent is true, then
if (kPresent) {
// i. Let kValue be ? Get(O, Pk).
let kValue = (0, _get.Get)(realm, O, Pk); // ii. Let accumulator be ? Call(callbackfn, undefined, « accumulator, kValue, k, O »).
accumulator = (0, _call.Call)(realm, callbackfn, realm.intrinsics.undefined, [accumulator, kValue, new _index.NumberValue(realm, k), O]);
} // d. Decrease k by 1.
k--;
} // 10. Return accumulator.
return accumulator;
}); // ECMA262 22.2.3.21
obj.defineNativeMethod("reverse", 0, context => {
// 1. Let O be ? ToObject(this value).
let O = _singletons.To.ToObject(realm, context); // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O); // 3. Let len be O.[[ArrayLength]].
let len = O.throwIfNotConcreteObject().$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. Let middle be floor(len/2).
let middle = Math.floor(len / 2); // 5. Let lower be 0.
let lower = 0; // 6. Repeat, while lower ≠ middle
while (lower !== middle) {
// a. Let upper be len - lower - 1.
let upper = len - lower - 1; // b. Let upperP be ! ToString(upper).
let upperP = new _index.StringValue(realm, upper + ""); // c. Let lowerP be ! ToString(lower).
let lowerP = new _index.StringValue(realm, lower + ""); // d. Let lowerExists be ? HasProperty(O, lowerP).
let lowerExists = (0, _has.HasProperty)(realm, O, lowerP); // e. If lowerExists is true, then
let lowerValue;
if (lowerExists) {
// i. Let lowerValue be ? Get(O, lowerP).
lowerValue = (0, _get.Get)(realm, O, lowerP);
} // f. Let upperExists be ? HasProperty(O, upperP).
let upperExists = (0, _has.HasProperty)(realm, O, upperP); // g. If upperExists is true, then
let upperValue;
if (upperExists) {
// i. Let upperValue be ? Get(O, upperP).
upperValue = (0, _get.Get)(realm, O, upperP);
} // h. If lowerExists is true and upperExists is true, then
if (lowerExists && upperExists) {
(0, _invariant.default)(lowerValue, "expected lower value to exist");
(0, _invariant.default)(upperValue, "expected upper value to exist"); // i. Perform ? Set(O, lowerP, upperValue, true).
_singletons.Properties.Set(realm, O, lowerP, upperValue, true); // ii. Perform ? Set(O, upperP, lowerValue, true).
_singletons.Properties.Set(realm, O, upperP, lowerValue, true);
} else if (!lowerExists && upperExists) {
// i. Else if lowerExists is false and upperExists is true, then
(0, _invariant.default)(upperValue, "expected upper value to exist"); // i. Perform ? Set(O, lowerP, upperValue, true).
_singletons.Properties.Set(realm, O, lowerP, upperValue, true); // ii. Perform ? DeletePropertyOrThrow(O, upperP).
_singletons.Properties.DeletePropertyOrThrow(realm, O.throwIfNotConcreteObject(), upperP);
} else if (lowerExists && !upperExists) {
// j. Else if lowerExists is true and upperExists is false, then
(0, _invariant.default)(lowerValue, "expected lower value to exist"); // i. Perform ? DeletePropertyOrThrow(O, lowerP).
_singletons.Properties.DeletePropertyOrThrow(realm, O.throwIfNotConcreteObject(), lowerP); // ii. Perform ? Set(O, upperP, lowerValue, true).
_singletons.Properties.Set(realm, O, upperP, lowerValue, true);
} else {} // k. Else both lowerExists and upperExists are false,
// i. No action is required.
// l. Increase lower by 1.
lower++;
} // 7. Return O.
return O;
}); // ECMA262 22.2.3.23
obj.defineNativeMethod("set", 1, (context, [overloaded, offset]) => {
if (overloaded.$TypedArrayName === undefined) {
let array = overloaded; // 1. Assert: array is any ECMAScript language value other than an Object with a [[TypedArrayName]] internal slot. If it is such an Object, the definition in 22.2.3.23.2 applies.
(0, _invariant.default)(!(overloaded instanceof _index.ObjectValue && overloaded.$TypedArrayName)); // 2. Let target be the this value.
let target = context.throwIfNotConcrete(); // 3. If Type(target) is not Object, throw a TypeError exception.
if (!(target instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(target) is not Object");
} // 4. If target does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (typeof target.$TypedArrayName !== "string") {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "target does not have a [[TypedArrayName]] internal slot");
} // 5. Assert: target has a [[ViewedArrayBuffer]] internal slot.
(0, _invariant.default)(target.$ViewedArrayBuffer, "target has a [[ViewedArrayBuffer]] internal slot"); // 6. Let targetOffset be ? ToInteger(offset).
let targetOffset = _singletons.To.ToInteger(realm, offset || realm.intrinsics.undefined); // 7. If targetOffset < 0, throw a RangeError exception.
if (targetOffset < 0) {
throw realm.createErrorThrowCompletion(realm.intrinsics.RangeError, "targetOffset < 0");
} // 8. Let targetBuffer be target.[[ViewedArrayBuffer]].
let targetBuffer = target.$ViewedArrayBuffer;
(0, _invariant.default)(targetBuffer instanceof _index.ObjectValue); // 9. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, targetBuffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(targetBuffer) is true");
} // 10. Let targetLength be target.[[ArrayLength]].
let targetLength = target.$ArrayLength;
(0, _invariant.default)(typeof targetLength === "number"); // 11. Let targetName be the String value of target.[[TypedArrayName]].
let targetName = target.$TypedArrayName;
(0, _invariant.default)(typeof targetName === "string"); // 12. Let targetElementSize be the Number value of the Element Size value specified in Table 50 for targetName.
let targetElementSize = _typedarray.ArrayElementSize[targetName]; // 13. Let targetType be the String value of the Element Type value in Table 50 for targetName.
let targetType = _typedarray.ArrayElementType[targetName]; // 14. Let targetByteOffset be target.[[ByteOffset]].
let targetByteOffset = target.$ByteOffset;
(0, _invariant.default)(typeof targetByteOffset === "number"); // 15. Let src be ? ToObject(array).
let src = _singletons.To.ToObject(realm, array); // 16. Let srcLength be ? ToLength(? Get(src, "length")).
let srcLength = _singletons.To.ToLength(realm, (0, _get.Get)(realm, src, "length")); // 17. If srcLength + targetOffset > targetLength, throw a RangeError exception.
if (srcLength + targetOffset > targetLength) {
throw realm.createErrorThrowCompletion(realm.intrinsics.RangeError, "srcLength + targetOffset > targetLength");
} // 18. Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
let targetByteIndex = targetOffset * targetElementSize + targetByteOffset; // 19. Let k be 0.
let k = 0; // 20. Let limit be targetByteIndex + targetElementSize × srcLength.
let limit = targetByteIndex + targetElementSize * srcLength; // 21. Repeat, while targetByteIndex < limit
while (targetByteIndex < limit) {
// a. Let Pk be ! ToString(k).
let Pk = _singletons.To.ToString(realm, new _index.NumberValue(realm, k)); // b. Let kNumber be ? ToNumber(? Get(src, Pk)).
let kNumber = _singletons.To.ToNumber(realm, (0, _get.Get)(realm, src, Pk)); // c. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, targetBuffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(targetBuffer) is true");
} // d. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, kNumber).
(0, _arraybuffer.SetValueInBuffer)(realm, targetBuffer, targetByteIndex, targetType, kNumber); // e. Set k to k + 1.
k = k + 1; // f. Set targetByteIndex to targetByteIndex + targetElementSize.
targetByteIndex = targetByteIndex + targetElementSize;
} // 22. Return undefined.
return realm.intrinsics.undefined;
} else {
let typedArray = overloaded; // 1. Assert: typedArray has a [[TypedArrayName]] internal slot. If it does not, the definition in 22.2.3.23.1 applies.
(0, _invariant.default)(typedArray instanceof _index.ObjectValue && typedArray.$TypedArrayName); // 2. Let target be the this value.
let target = context.throwIfNotConcrete(); // 3. If Type(target) is not Object, throw a TypeError exception.
if (!(target instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(target) is not Object");
} // 4. If target does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
if (typeof target.$TypedArrayName !== "string") {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "target does not have a [[TypedArrayName]] internal slot");
} // 5. Assert: target has a [[ViewedArrayBuffer]] internal slot.
(0, _invariant.default)(target.$ViewedArrayBuffer); // 6. Let targetOffset be ? ToInteger(offset).
let targetOffset = _singletons.To.ToInteger(realm, offset || realm.intrinsics.undefined); // 7. If targetOffset < 0, throw a RangeError exception.
if (targetOffset < 0) {
throw realm.createErrorThrowCompletion(realm.intrinsics.RangeError, "targetOffset < 0");
} // 8. Let targetBuffer be target.[[ViewedArrayBuffer]].
let targetBuffer = target.$ViewedArrayBuffer;
(0, _invariant.default)(targetBuffer instanceof _index.ObjectValue); // 9. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, targetBuffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(targetBuffer) is true");
} // 10. Let targetLength be target.[[ArrayLength]].
let targetLength = target.$ArrayLength;
(0, _invariant.default)(typeof targetLength === "number"); // 11. Let srcBuffer be typedArray.[[ViewedArrayBuffer]].
let srcBuffer = typedArray.$ViewedArrayBuffer;
(0, _invariant.default)(srcBuffer); // 12. If IsDetachedBuffer(srcBuffer) is true, throw a TypeError exception.
if ((0, _is.IsDetachedBuffer)(realm, srcBuffer) === true) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "IsDetachedBuffer(srcBuffer) is true");
} // 13. Let targetName be the String value of target.[[TypedArrayName]].
let targetName = target.$TypedArrayName;
(0, _invariant.default)(typeof targetName === "string"); // 14. Let targetType be the String value of the Element Type value in Table 50 for targetName.
let targetType = _typedarray.ArrayElementType[targetName]; // 15. Let targetElementSize be the Number value of the Element Size value specified in Table 50 for targetName.
let targetElementSize = _typedarray.ArrayElementSize[targetName]; // 16. Let targetByteOffset be target.[[ByteOffset]].
let targetByteOffset = target.$ByteOffset;
(0, _invariant.default)(typeof targetByteOffset === "number"); // 17. Let srcName be the String value of typedArray.[[TypedArrayName]].
let srcName = typedArray.$TypedArrayName;
(0, _invariant.default)(typeof srcName === "string"); // 18. Let srcType be the String value of the Element Type value in Table 50 for srcName.
let srcType = _typedarray.ArrayElementType[srcName]; // 19. Let srcElementSize be the Number value of the Element Size value specified in Table 50 for srcName.
let srcElementSize = _typedarray.ArrayElementSize[srcName]; // 20. Let srcLength be typedArray.[[ArrayLength]].
let srcLength = typedArray.$ArrayLength;
(0, _invariant.default)(typeof srcLength === "number"); // 21. Let srcByteOffset be typedArray.[[ByteOffset]].
let srcByteOffset = typedArray.$ByteOffset;
(0, _invariant.default)(typeof srcByteOffset === "number"); // 22. If srcLength + targetOffset > targetLength, throw a RangeError exception.
if (srcLength + targetOffset > targetLength) {
throw realm.createErrorThrowCompletion(realm.intrinsics.RangeError, "srcLength + targetOffset > targetLength");
}
let srcByteIndex; // 23. If SameValue(srcBuffer, targetBuffer) is true, then
if ((0, _abstract.SameValue)(realm, srcBuffer, targetBuffer) === true) {
// a. Let srcBuffer be ? CloneArrayBuffer(targetBuffer, srcByteOffset, %ArrayBuffer%).
srcBuffer = (0, _arraybuffer.CloneArrayBuffer)(realm, targetBuffer, srcByteOffset, realm.intrinsics.ArrayBuffer); // b. NOTE: %ArrayBuffer% is used to clone srcBuffer because is it known to not have any observable side-effects.
// c. Let srcByteIndex be 0.
srcByteIndex = 0;
} else {
// 24. Else, let srcByteIndex be srcByteOffset.
srcByteIndex = srcByteOffset;
} // 25. Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
let targetByteIndex = targetOffset * targetElementSize + targetByteOffset; // 26. Let limit be targetByteIndex + targetElementSize × srcLength.
let limit = targetByteIndex + targetElementSize * srcLength; // 27. If SameValue(srcType, targetType) is true, then
if (srcType === targetType) {
// a. NOTE: If srcType and targetType are the same, the transfer must be performed in a manner that preserves the bit-level encoding of the source data.
// b. Repeat, while targetByteIndex < limit
while (targetByteIndex < limit) {
// i. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, "Uint8").
let value = (0, _arraybuffer.GetValueFromBuffer)(realm, srcBuffer, srcByteIndex, "Uint8"); // ii. Perform SetValueInBuffer(targetBuffer, targetByteIndex, "Uint8", value).
(0, _arraybuffer.SetValueInBuffer)(realm, targetBuffer, targetByteIndex, "Uint8", value.value); // iii. Set srcByteIndex to srcByteIndex + 1.
srcByteIndex += 1; // iv. Set targetByteIndex to targetByteIndex + 1.
targetByteIndex += 1;
}
} else {
// 28. Else,
// a. Repeat, while targetByteIndex < limit
while (targetByteIndex < limit) {
// i. Let value be GetValueFromBuffer(srcBuffer, srcByteIndex, srcType).
let value = (0, _arraybuffer.GetValueFromBuffer)(realm, srcBuffer, srcByteIndex, srcType); // ii. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value).
(0, _arraybuffer.SetValueInBuffer)(realm, targetBuffer, targetByteIndex, targetType, value.value); // iii. Set srcByteIndex to srcByteIndex + srcElementSize.
srcByteIndex = srcByteIndex + srcElementSize; // iv. Set targetByteIndex to targetByteIndex + targetElementSize.
targetByteIndex = targetByteIndex + targetElementSize;
}
} // 29. Return undefined.
return realm.intrinsics.undefined;
}
}); // ECMA262 22.2.3.24
obj.defineNativeMethod("slice", 2, (context, [start, end]) => {
// 1. Let O be the this value.
let O = context; // 2. Perform ? ValidateTypedArray(O).
(0, _typedarray.ValidateTypedArray)(realm, O);
(0, _invariant.default)(O instanceof _index.ObjectValue); // 3. Let len be O.[[ArrayLength]].
let len = O.$ArrayLength;
(0, _invariant.default)(typeof len === "number"); // 4. Let relativeStart be ? ToInteger(start).
let relativeStart = _singletons.To.ToInteger(realm, start); // 5. If relativeStart < 0, let k be max((len + relativeStart), 0); else let k be min(relativeStart, len).
let k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // 6. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
let relativeEnd = !end || end instanceof _index.UndefinedValue ? len : _singletons.To.ToInteger(realm, end.throwIfNotConcrete()); // 7. If relativeEnd < 0, let final be max((len + relativeEnd), 0); else let final be min(relativeEnd, len).
let final = relativeEnd < 0 ? Math.max(len + relati