UNPKG

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
"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