UNPKG

prepack

Version:

Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.

1,356 lines (1,042 loc) 64.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (realm, obj) { // ECMA262 22.1.3.31 obj.defineNativeProperty(realm.intrinsics.SymbolIterator, realm.intrinsics.ArrayProto_values); // ECMA262 22.1.3 obj.defineNativeProperty("length", realm.intrinsics.zero); // ECMA262 22.1.3.1 obj.defineNativeMethod("concat", 1, (context, args, argCount) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let A be ? ArraySpeciesCreate(O, 0). let A = _singletons.Create.ArraySpeciesCreate(realm, O, 0); // 3. Let n be 0. let n = 0; // 4. Let items be a List whose first element is O and whose subsequent elements are, in left to right // order, the arguments that were passed to this function invocation. let items = argCount === 0 ? [O] : [O, ...args]; // 5. Repeat, while items is not empty while (items.length) { // a. Remove the first element from items and let E be the value of the element. let E = items.shift(); // b. Let spreadable be ? IsConcatSpreadable(E). let spreadable = (0, _index2.IsConcatSpreadable)(realm, E); // c. If spreadable is true, then if (spreadable) { E = E.throwIfNotConcreteObject(); // i. Let k be 0. let k = 0; // ii. Let len be ? ToLength(? Get(E, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, E, "length")); // ii. If n + len > 2^53-1, throw a TypeError exception. if (n + len > Math.pow(2, 53) - 1) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "too damn high"); } // iv. Repeat, while k < len while (k < len) { // 1. Let P be ! ToString(k). let P = new _index.StringValue(realm, k + ""); // 2. Let exists be ? HasProperty(E, P). let exists = (0, _index2.HasProperty)(realm, E, P); // 3. If exists is true, then if (exists) { // a. Let subElement be ? Get(E, P). let subElement = (0, _index2.Get)(realm, E, P); // b. Perform ? CreateDataPropertyOrThrow(A, ! ToString(n), subElement). _singletons.Create.CreateDataPropertyOrThrow(realm, A, new _index.StringValue(realm, n + ""), subElement); } // 4. Increase n by 1. n++; // 5. Increase k by 1. k++; } } else { // d. Else E is added as a single item rather than spread, // i. If n≥2^53-1, throw a TypeError exception. if (n > Math.pow(2, 53) - 1) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "too damn high"); } // ii. Perform ? CreateDataPropertyOrThrow(A, ! ToString(n), E). _singletons.Create.CreateDataPropertyOrThrow(realm, A, new _index.StringValue(realm, n + ""), E); // iii. Increase n by 1. n++; } } // 6. Perform ? Set(A, "length", n, true). _singletons.Properties.Set(realm, A, "length", new _index.NumberValue(realm, n), true); // 7. Return A. return A; }); // ECMA262 22.1.3.3 if (!realm.isCompatibleWith(realm.MOBILE_JSC_VERSION) && !realm.isCompatibleWith("mobile")) obj.defineNativeMethod("copyWithin", 2, (context, [target, start, end]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. Let relativeTarget be ? ToInteger(target). let relativeTarget = _singletons.To.ToInteger(realm, target); // 4. 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); // 5. Let relativeStart be ? ToInteger(start). let relativeStart = _singletons.To.ToInteger(realm, start); // 6. 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); // 7. 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()); // 8. 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); // 9. Let count be min(final-from, len-to). let count = Math.min(final - from, len - to); let direction; // 10. 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 { // 11. Else, // a. Let direction be 1. direction = 1; } // 12. 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, _index2.HasProperty)(realm, O, fromKey); // d. If fromPresent is true, then if (fromPresent === true) { // i. Let fromVal be ? Get(O, fromKey). let fromVal = (0, _index2.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, 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; } // 13. Return O. return O; }); // ECMA262 22.1.3.4 obj.defineNativeMethod("entries", 0, context => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Return CreateArrayIterator(O, "key+value"). return _singletons.Create.CreateArrayIterator(realm, O, "key+value"); }); // ECMA262 22.1.3.5 obj.defineNativeMethod("every", 1, (context, [callbackfn, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let k be 0. let k = 0; // 6. 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, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let testResult be ToBoolean(? Call(callbackfn, T, « kValue, k, O »)). let testResult = _singletons.To.ToBooleanPartial(realm, (0, _index2.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++; } // 7. Return true. return realm.intrinsics.true; }); // ECMA262 22.1.3.6 obj.defineNativeMethod("fill", 1, (context, [value, start, end]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. Let relativeStart be ? ToInteger(start). let relativeStart = _singletons.To.ToInteger(realm, start || realm.intrinsics.undefined); // 4. 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); // 5. 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()); // 6. 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); // 7. 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++; } // 8. Return O. return O; }); // ECMA262 22.1.3.7 obj.defineNativeMethod("filter", 1, (context, [callbackfn, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let A be ? ArraySpeciesCreate(O, 0). let A = _singletons.Create.ArraySpeciesCreate(realm, O, 0); // 6. Let k be 0. let k = 0; // 7. Let to be 0. let to = 0; // 8. 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, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let selected be ToBoolean(? Call(callbackfn, T, « kValue, k, O »)). let selected = _singletons.To.ToBooleanPartial(realm, (0, _index2.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O])); // iii. If selected is true, then if (selected) { // 1. Perform ? CreateDataPropertyOrThrow(A, ! ToString(to), kValue). _singletons.Create.CreateDataPropertyOrThrow(realm, A, _singletons.To.ToString(realm, new _index.NumberValue(realm, to)), kValue); // 2. Increase to by 1. to++; } } // d. Increase k by 1. k++; } // 9. Return A. return A; }); // ECMA262 22.1.3.8 obj.defineNativeMethod("find", 1, (context, [predicate, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(predicate) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, predicate)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let k be 0. let k = 0; // 6. 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, _index2.Get)(realm, O, Pk); // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). let testResult = _singletons.To.ToBooleanPartial(realm, (0, _index2.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++; } // 7. Return undefined. return realm.intrinsics.undefined; }); // ECMA262 22.1.3.9 obj.defineNativeMethod("findIndex", 1, (context, [predicate, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(predicate) is false, throw a TypeError exception. if ((0, _index2.IsCallable)(realm, predicate) === false) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg ? thisArg : realm.intrinsics.undefined; // 5. Let k be 0. let k = 0; // 6. 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, _index2.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, _index2.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; } // 7. Return -1. return new _index.NumberValue(realm, -1); }); // ECMA262 22.1.3.10 obj.defineNativeMethod("forEach", 1, (context, [callbackfn, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let k be 0. let k = 0; // 6. Repeat, while k < len while (k < len) { // a. Let Pk be ! To.ToString(k). let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk). let kPresent = (0, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Perform ? Call(callbackfn, T, « kValue, k, O »). (0, _index2.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O]); } // d. Increase k by 1. k++; } // 7. Return undefined. return realm.intrinsics.undefined; }); // ECMA262 22.1.3.11 if (!realm.isCompatibleWith(realm.MOBILE_JSC_VERSION) && !realm.isCompatibleWith("mobile")) obj.defineNativeMethod("includes", 1, (context, [searchElement, fromIndex]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If len is 0, return false. if (len === 0) return realm.intrinsics.false; // 4. 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; // 5. If n ≥ 0, then if (n >= 0) { // a. Let k be n. k = n; } else { // 6. 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; } // 7. Repeat, while k < len while (k < len) { // a. Let elementK be the result of ? Get(O, ! ToString(k)). let elementK = (0, _index2.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; } // 8. Return false. return realm.intrinsics.false; }); // ECMA262 22.1.3.12 obj.defineNativeMethod("indexOf", 1, (context, [searchElement, fromIndex]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If len is 0, return -1. if (len === 0) return new _index.NumberValue(realm, -1); // 4. Let n be ? ToInteger(fromIndex). (If fromIndex is undefined, this step produces the value 0.) let n = fromIndex ? _singletons.To.ToInteger(realm, fromIndex) : 0; // 5. If n ≥ len, return -1. if (n >= len) return new _index.NumberValue(realm, -1); // 6. 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 { // 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 kPresent be ? HasProperty(O, ! ToString(k)). let kPresent = (0, _index2.HasProperty)(realm, O, k + ""); // b. If kPresent is true, then if (kPresent === true) { // i. Let elementK be ? Get(O, ! ToString(k)). let elementK = (0, _index2.Get)(realm, O, k + ""); // ii. Let same be the result of performing Strict Equality Comparison searchElement === elementK. let same = (0, _index2.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++; } // 9. Return -1. return new _index.NumberValue(realm, -1); }); // ECMA262 22.1.3.13 obj.defineNativeMethod("join", 1, (context, [separator]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If separator is undefined, let separator be the single-element String ",". if (!separator || separator instanceof _index.UndefinedValue) separator = new _index.StringValue(realm, ","); // 4. Let sep be ? ToString(separator). let sep = _singletons.To.ToStringPartial(realm, separator); // 5. If len is zero, return the empty String. if (len === 0) return realm.intrinsics.emptyString; // 6. Let element0 be Get(O, "0"). let element0 = (0, _index2.Get)(realm, O, "0"); // 7. If element0 is undefined or null, let R be the empty String; otherwise, let R be ? ToString(element0). let R; if ((0, _index2.HasSomeCompatibleType)(element0, _index.UndefinedValue, _index.NullValue)) { R = ""; } else { R = _singletons.To.ToStringPartial(realm, element0); } // 8. Let k be 1. let k = 1; // 9. 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, ! To.ToString(k)). let element = (0, _index2.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, _index2.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++; } // 10. Return R. return new _index.StringValue(realm, R + ""); }); // ECMA262 22.1.3.14 obj.defineNativeMethod("keys", 0, context => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Return CreateArrayIterator(O, "key"). return _singletons.Create.CreateArrayIterator(realm, O, "key"); }); // ECMA262 22.1.3.15 obj.defineNativeMethod("lastIndexOf", 1, (context, [searchElement, fromIndex]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If len is 0, return -1. if (len === 0) return new _index.NumberValue(realm, -1); // 4. 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; // 5. 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 { // 6. Else n < 0, // a. Let k be len + n. k = len + n; } // 7. Repeat, while k ≥ 0 while (k >= 0) { // a. Let kPresent be ? HasProperty(O, ! ToString(k)). let kPresent = (0, _index2.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, _index2.Get)(realm, O, new _index.StringValue(realm, k + "")); // ii. Let same be the result of performing Strict Equality Comparison searchElement === elementK. let same = (0, _index2.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--; } // 8. Return -1. return new _index.NumberValue(realm, -1); }); // ECMA262 22.1.3.16 obj.defineNativeMethod("map", 1, (context, [callbackfn, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let A be ? ArraySpeciesCreate(O, len). let A = _singletons.Create.ArraySpeciesCreate(realm, O, len); // 6. Let k be 0. let k = 0; // 7. Repeat, while k < len while (k < len) { // a. Let Pk be ! To.ToString(k). let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk). let kPresent = (0, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let mappedValue be ? Call(callbackfn, T, « kValue, k, O »). let mappedValue = (0, _index2.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O]); // iii. Perform ? CreateDataPropertyOrThrow(A, Pk, mappedValue). _singletons.Create.CreateDataPropertyOrThrow(realm, A, Pk, mappedValue); } // d. Increase k by 1. k++; } // 8. Return A. return A; }); // ECMA262 22.1.3.17 obj.defineNativeMethod("pop", 0, context => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If len is zero, then if (len === 0) { // a. Perform ? Set(O, "length", 0, true). _singletons.Properties.Set(realm, O, "length", realm.intrinsics.zero, true); // b. Return undefined. return realm.intrinsics.undefined; } else { // 4. Else len > 0, // a. Let newLen be len-1. let newLen = len - 1; // b. Let indx be ! ToString(newLen). let indx = new _index.StringValue(realm, newLen + ""); // c. Let element be ? Get(O, indx). let element = (0, _index2.Get)(realm, O, indx); // d. Perform ? DeletePropertyOrThrow(O, indx). _singletons.Properties.DeletePropertyOrThrow(realm, O, indx); // e. Perform ? Set(O, "length", newLen, true). _singletons.Properties.Set(realm, O, "length", new _index.NumberValue(realm, newLen), true); // f. Return element. return element; } }); // ECMA262 22.1.3.18 obj.defineNativeMethod("push", 1, (context, args, argCount) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, new _index.StringValue(realm, "length"))); // 3. Let items be a List whose elements are, in left to right order, the arguments that were passed to realm function invocation. let items = argCount > 0 ? args : []; // 4. Let argCount be the number of elements in items. argCount; // 5. If len + argCount > 2^53-1, throw a TypeError exception. if (len + argCount > Math.pow(2, 53) - 1) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Array.prototype"); } // 6. Repeat, while items is not empty while (items.length) { // a. Remove the first element from items and let E be the value of the element. let E = items.shift(); // b. Perform ? Set(O, ! ToString(len), E, true). _singletons.Properties.Set(realm, O, new _index.StringValue(realm, len + ""), E, true); // c. Let len be len+1. len++; } // 7. Perform ? Set(O, "length", len, true). _singletons.Properties.Set(realm, O, new _index.StringValue(realm, "length"), new _index.NumberValue(realm, len), true); // 8. Return len. return new _index.NumberValue(realm, len); }); // ECMA262 22.1.3.19 obj.defineNativeMethod("reduce", 1, (context, [callbackfn, initialValue]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. 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"); } // 5. Let k be 0. let k = 0; // 6. If initialValue is present, then let accumulator; if (initialValue) { // a. Set accumulator to initialValue. accumulator = initialValue; } else { // 7. 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, _index2.HasProperty)(realm, O, Pk); // iv. If kPresent is true, then if (kPresent) { // 1. Let accumulator be ? Get(O, Pk). accumulator = (0, _index2.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, _invariant2.default)(accumulator); } // 8. 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, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let accumulator be ? Call(callbackfn, undefined, « accumulator, kValue, k, O »). accumulator = (0, _index2.Call)(realm, callbackfn, realm.intrinsics.undefined, [accumulator, kValue, new _index.NumberValue(realm, k), O]); } // d. Increase k by 1. k++; } // 9. Return accumulator. return accumulator; }); // ECMA262 22.1.3.20 obj.defineNativeMethod("reduceRight", 1, (context, [callbackfn, initialValue]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "not a function"); } // 4. 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"); } // 5. Let k be len-1. let k = len - 1; // 6. If initialValue is present, then let accumulator; if (initialValue) { // 1. Set accumulator to initialValue. accumulator = initialValue; } else { // 7. 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, _index2.HasProperty)(realm, O, Pk); // iii. If kPresent is true, then if (kPresent) { // 1. Let accumulator be ? Get(O, Pk). accumulator = (0, _index2.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"); } } // 8. 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, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let accumulator be ? Call(callbackfn, undefined, « accumulator, kValue, k, O »). accumulator = (0, _index2.Call)(realm, callbackfn, realm.intrinsics.undefined, [accumulator, kValue, new _index.NumberValue(realm, k), O]); } // d. Decrease k by 1. k--; } // 9. Return accumulator. return accumulator; }); // ECMA262 22.1.3.21 obj.defineNativeMethod("reverse", 0, context => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. Let middle be floor(len/2). let middle = Math.floor(len / 2); // 4. Let lower be 0. let lower = 0; // 5. 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, _index2.HasProperty)(realm, O, lowerP); // e. If lowerExists is true, then let lowerValue; if (lowerExists) { // i. Let lowerValue be ? Get(O, lowerP). lowerValue = (0, _index2.Get)(realm, O, lowerP); } // f. Let upperExists be ? HasProperty(O, upperP). let upperExists = (0, _index2.HasProperty)(realm, O, upperP); // g. If upperExists is true, then let upperValue; if (upperExists) { // i. Let upperValue be ? Get(O, upperP). upperValue = (0, _index2.Get)(realm, O, upperP); } // h. If lowerExists is true and upperExists is true, then if (lowerExists && upperExists) { (0, _invariant2.default)(lowerValue, "expected lower value to exist"); (0, _invariant2.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, _invariant2.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, upperP); } else if (lowerExists && !upperExists) { // j. Else if lowerExists is true and upperExists is false, then (0, _invariant2.default)(lowerValue, "expected lower value to exist"); // i. Perform ? DeletePropertyOrThrow(O, lowerP). _singletons.Properties.DeletePropertyOrThrow(realm, O, 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++; } // 6. Return O. return O; }); // ECMA262 22.1.3.22 obj.defineNativeMethod("shift", 0, context => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If len is zero, then if (len === 0) { // a. Perform ? Set(O, "length", 0, true). _singletons.Properties.Set(realm, O, "length", realm.intrinsics.zero, true); // b. Return undefined. return realm.intrinsics.undefined; } // 4. Let first be ? Get(O, "0"). let first = (0, _index2.Get)(realm, O, "0"); // 5. Let k be 1. let k = 0; // 6. Repeat, while k < len while (k < len) { // a. Let from be ! ToString(k). let frm = new _index.StringValue(realm, k + ""); // b. Let to be ! ToString(k-1). let to = new _index.StringValue(realm, k - 1 + ""); // c. Let fromPresent be ? HasProperty(O, from). let fromPresent = (0, _index2.HasProperty)(realm, O, frm); // d. If fromPresent is true, then if (fromPresent) { // i. Let fromVal be ? Get(O, from). let fromVal = (0, _index2.Get)(realm, O, frm); // ii. Perform ? Set(O, to, fromVal, true). _singletons.Properties.Set(realm, O, to, fromVal, true); } else { // d. Else fromPresent is false, // i. Perform ? DeletePropertyOrThrow(O, to). _singletons.Properties.DeletePropertyOrThrow(realm, O, to); } // e. Increase k by 1. k++; } // 7. Perform ? DeletePropertyOrThrow(O, ! ToString(len-1)). _singletons.Properties.DeletePropertyOrThrow(realm, O, new _index.StringValue(realm, len - 1 + "")); // 8. Perform ? Set(O, "length", len-1, true). _singletons.Properties.Set(realm, O, "length", new _index.NumberValue(realm, len - 1), true); // 9. Return first. return first; }); // ECMA262 22.1.3.23 obj.defineNativeMethod("slice", 2, (context, [start, end]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. Let relativeStart be ? ToInteger(start). let relativeStart = _singletons.To.ToInteger(realm, start); // 4. 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); // 5. 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()); // 6. 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); // 7. Let count be max(final - k, 0). let count = Math.max(final - k, 0); // 8. Let A be ? ArraySpeciesCreate(O, count). let A = _singletons.Create.ArraySpeciesCreate(realm, O, count); // 9. Let n be 0. let n = 0; // 10. Repeat, while k < final while (k < final) { // a. Let Pk be ! ToString(k). let Pk = new _index.StringValue(realm, k + ""); // b. Let kPresent be ? HasProperty(O, Pk). let kPresent = (0, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Perform ? CreateDataPropertyOrThrow(A, ! ToString(n), kValue). _singletons.Create.CreateDataPropertyOrThrow(realm, A, new _index.StringValue(realm, n + ""), kValue); } // d. Increase k by 1. k++; // e. Increase n by 1. n++; } // 11. Perform ? Set(A, "length", n, true). _singletons.Properties.Set(realm, A, "length", new _index.NumberValue(realm, n), true); // 12. Return A. return A; }); // ECMA262 22.1.3.24 obj.defineNativeMethod("some", 1, (context, [callbackfn, thisArg]) => { // 1. Let O be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(O, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // 3. If IsCallable(callbackfn) is false, throw a TypeError exception. if (!(0, _index2.IsCallable)(realm, callbackfn)) { throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "callback passed to Array.prototype.some isn't callable"); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. let T = thisArg || realm.intrinsics.undefined; // 5. Let k be 0. let k = 0; // 6. 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, _index2.HasProperty)(realm, O, Pk); // c. If kPresent is true, then if (kPresent) { // i. Let kValue be ? Get(O, Pk). let kValue = (0, _index2.Get)(realm, O, Pk); // ii. Let testResult be ToBoolean(? Call(callbackfn, T, « kValue, k, O »)). let testResult = _singletons.To.ToBooleanPartial(realm, (0, _index2.Call)(realm, callbackfn, T, [kValue, new _index.NumberValue(realm, k), O])); // iii. If testResult is true, return true. if (testResult) return realm.intrinsics.true; } // d. Increase k by 1. k++; } // 7. Return false. return realm.intrinsics.false; }); // ECMA262 22.1.3.25 obj.defineNativeMethod("sort", 1, (context, [comparefn]) => { // 1. Let obj be ? ToObject(this value). let O = _singletons.To.ToObject(realm, context.throwIfNotConcrete()); // 2. Let len be ? ToLength(? Get(obj, "length")). let len = _singletons.To.ToLength(realm, (0, _index2.Get)(realm, O, "length")); // Within this specification of the sort method, an object, obj, is said to be sparse if the following algorithm returns true: let isSparse = () => { // 1.For each integer i in the range 0≤i< len for (let i = 0; i < len; i++) { // a.Let elem be obj.[[GetOwnProperty]](! ToString(i)). let elem = O.$GetOwnProperty(i.toString()); // b.If elem is undefined, return true. if (elem === undefined) return true; _singletons.Properties.ThrowIfMightHaveBeenDeleted(elem.value); } // 2.Return false. return false; }; let sparse = isSparse(); // Let proto be obj.[[GetPrototypeOf]](). let proto = O.$GetPrototypeOf(); // If proto is not null if (!(proto instanceof _index.NullValue)) { // and there exists an integer j such that all of the conditions below are satisfied then the sort order is implementation-defined: for (let j = 0; j < len; j++) { // HasProperty(proto, ToString(j)) is true. if ((0, _index2.HasProperty)(realm, proto, j.toString()) && // obj is sparse sparse) // We abord when the result of the sort is implementation defined. throw Error("Implentation defined behavior detected"); } } // The sort order is also implementation defined if obj is sparse and any of the following conditions are true: if (sparse) { // IsExtensible(obj) is false. if (!(0, _index2.IsExtensible)(realm, O)) throw Error("Implementation defined behavior, Array is both sparse and extensible"); // Any integer index property of obj whose name is a nonnegative integer less than len for (let j = 0; j < len; j++) { // is a data property whose [[Configurable]] attribute is false. let prop = O.$GetOwnProperty(j.toString()); if (prop !== undefined && !prop.configurable) { _singletons.Properties.ThrowIfMightHaveBeenDeleted(prop.value); throw Error("Implementation defined behavior : Array is sparse and it's prototype has some numbered properties"); } } } // Any integer index property of obj whose name is a nonnegative integer less than len for (let j = 0; j < len; j++) { //is a data property whose [[writable]] attribute is false. let prop = O.$GetOwnProperty(j.toString()); if (prop !== undefined && !prop.writable) { _singletons.Properties.ThrowIfMightHaveBeenDeleted(prop.value); throw Error("Implementation defined behavior : property " + j.toString() + "is non writable : "); } } // The SortCompare abstract operation is called with two arguments x and y. It also has access to the comparefn // argument passed to the current invocation of the sort method. The following steps are taken: // 22.1.3.25.1 Runtime Semantics: SortCompare( x, y )# let SortCompare = (x, y) => { x = x.throwIfNotConcrete(); y = y.throwIfNotConcrete(); // 1. If x and y are both undefined, return +0. if (x instanceof _index.UndefinedValue && y instanceof _index.UndefinedValue) { return realm.intrinsics.zero; } // 2. If x is undefined, return 1. if (x instanceof _index.UndefinedValue) { return new _index.NumberValue(realm, 1); } // 3. If y is undefined, return -1. if (y instanceof _index.UndefinedValue) { return new _index.NumberValue(realm, -1); } // 4. If the argument comparefn is not undefined, then if (!comparefn.mightBeUndefined()) { // a. Let v be ? ToNumber(? Call(comparefn, undefined, « x, y »)). let v = _singletons.To.ToNumber(realm, (0, _index2.Call)(realm, comparefn, new _index.UndefinedValue(realm), [x, y])); // b. If v is NaN, return +0. if (isNaN(v)) return new _index.NumberValue(realm, +0); // c. Return v. return new _index.NumberValue(realm, v); } else { comparefn.throwIfNotConcrete(); } // 5. Let xString be ? ToString(x). let xString = new _index.StringValue(realm, _singletons.To.ToString(realm, x)); // 6. Let yString be ? ToString(y). let yString = new _index.StringValue(realm, _singletons.To.ToString(realm, y)); // 7. Let xSmaller be the result of performing Abstract Relational Comparison xString < yString. let xSmaller = (0, _abstract.AbstractRelationalComparison)(realm, xString, yString, true, "<"); // 8. If xSmaller is true, return -1. if (xSmaller.value) return new _index.NumberValue(realm, -1); // 9. Let ySmaller be the result of performing Abstract Relational Comparison yString < xString. let ySmaller = (0, _abstract.AbstractRelationalComparison)(realm, yString, xString, true, "<"); // 10. If ySmaller is true, return 1. if (ySmaller.value) return new _index.NumberValue(realm, 1); // 11. Return +0. return realm.intrinsics.zero; }; //1. Perform an implementation-dependent sequence of calls to the [[Get]] and [[Set]] internal methods of obj, to the DeletePropertyOrThrow and HasOwnProperty abstract operation with obj as the first argument, and to SortCompare (described below), such that: // The property key argument for each call to [[Get]], [[Set]], HasOwnProperty, or DeletePropertyOrThrow is the string representation of a nonnegative integer less than len. // We leverage the underlying implementation sort by copying the element in a temp. array, sorting it, and // transfering back the value inside the our array. let arr = []; // We need to adapt the comparefn function to match the expected types let comparefn_ = (x, y) => { (0, _invariant2.default)(x instanceof _index.Value, "Unexpected type"); (0, _invariant2.default)(y instanceof _index.Value, "Unexpected type"); let result_ = SortCompare(x, y); let numb = _singletons.To.ToNumber(realm, result_); return numb; }; for (let j = 0; j < len; j++) { // The property key argument for each call to [[Get]], [[Set]], HasOwnProperty, or DeletePropertyOrThrow is the string representation of a nonnegative integer less than len. if (!(0, _index2.HasOwnProperty)(realm, O, j.toString())) continue; // The arguments for calls to SortCompare are values returned by a previous call to the [[Get]] internal method, // unless the properties accessed by those previous calls did not exist according to HasOwnProperty. // -- Important : We rely on the fact that the underlying sort implementation respect the standard for the following 3 properties // If both perspective arguments to SortCompare correspond to non-existent properties, // use +0 instead of calling SortCompare. If only the first perspective argument is non-existent use +1. // If only the second perspective argument is non-existent use -1. let val = O.$Get(j.toString(), O); arr[j] = val; }