| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| /* ES5 15.4.4.14. */ |
| function ArrayIndexOf(searchElement/*, fromIndex*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (len === 0) |
| return -1; |
| |
| /* Step 5. */ |
| var n = arguments.length > 1 ? ToInteger(arguments[1]) : 0; |
| |
| /* Step 6. */ |
| if (n >= len) |
| return -1; |
| |
| var k; |
| /* Step 7. */ |
| if (n >= 0) |
| k = n; |
| /* Step 8. */ |
| else { |
| /* Step a. */ |
| k = len + n; |
| /* Step b. */ |
| if (k < 0) |
| k = 0; |
| } |
| |
| /* Step 9. */ |
| if (IsPackedArray(O)) { |
| for (; k < len; k++) { |
| if (O[k] === searchElement) |
| return k; |
| } |
| } else { |
| for (; k < len; k++) { |
| if (k in O && O[k] === searchElement) |
| return k; |
| } |
| } |
| |
| /* Step 10. */ |
| return -1; |
| } |
| |
| function ArrayStaticIndexOf(list, searchElement/*, fromIndex*/) { |
| if (arguments.length < 1) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.indexOf'); |
| var fromIndex = arguments.length > 2 ? arguments[2] : 0; |
| return callFunction(ArrayIndexOf, list, searchElement, fromIndex); |
| } |
| |
| /* ES5 15.4.4.15. */ |
| function ArrayLastIndexOf(searchElement/*, fromIndex*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (len === 0) |
| return -1; |
| |
| /* Step 5. */ |
| var n = arguments.length > 1 ? ToInteger(arguments[1]) : len - 1; |
| |
| /* Steps 6-7. */ |
| var k; |
| if (n > len - 1) |
| k = len - 1; |
| else if (n < 0) |
| k = len + n; |
| else |
| k = n; |
| |
| /* Step 8. */ |
| if (IsPackedArray(O)) { |
| for (; k >= 0; k--) { |
| if (O[k] === searchElement) |
| return k; |
| } |
| } else { |
| for (; k >= 0; k--) { |
| if (k in O && O[k] === searchElement) |
| return k; |
| } |
| } |
| |
| /* Step 9. */ |
| return -1; |
| } |
| |
| function ArrayStaticLastIndexOf(list, searchElement/*, fromIndex*/) { |
| if (arguments.length < 1) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.lastIndexOf'); |
| var fromIndex; |
| if (arguments.length > 2) { |
| fromIndex = arguments[2]; |
| } else { |
| var O = ToObject(list); |
| var len = TO_UINT32(O.length); |
| fromIndex = len - 1; |
| } |
| return callFunction(ArrayLastIndexOf, list, searchElement, fromIndex); |
| } |
| |
| /* ES5 15.4.4.16. */ |
| function ArrayEvery(callbackfn/*, thisArg*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.every'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 5. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Steps 6-7. */ |
| /* Steps a (implicit), and d. */ |
| for (var k = 0; k < len; k++) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c. */ |
| if (!callFunction(callbackfn, T, O[k], k, O)) |
| return false; |
| } |
| } |
| |
| /* Step 8. */ |
| return true; |
| } |
| |
| function ArrayStaticEvery(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.every'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| return callFunction(ArrayEvery, list, callbackfn, T); |
| } |
| |
| /* ES5 15.4.4.17. */ |
| function ArraySome(callbackfn/*, thisArg*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.some'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 5. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Steps 6-7. */ |
| /* Steps a (implicit), and d. */ |
| for (var k = 0; k < len; k++) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c. */ |
| if (callFunction(callbackfn, T, O[k], k, O)) |
| return true; |
| } |
| } |
| |
| /* Step 8. */ |
| return false; |
| } |
| |
| function ArrayStaticSome(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.some'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| return callFunction(ArraySome, list, callbackfn, T); |
| } |
| |
| /* ES5 15.4.4.18. */ |
| function ArrayForEach(callbackfn/*, thisArg*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.forEach'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 5. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Steps 6-7. */ |
| /* Steps a (implicit), and d. */ |
| for (var k = 0; k < len; k++) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c. */ |
| callFunction(callbackfn, T, O[k], k, O); |
| } |
| } |
| |
| /* Step 8. */ |
| return void 0; |
| } |
| |
| function ArrayStaticForEach(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.forEach'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| callFunction(ArrayForEach, list, callbackfn, T); |
| } |
| |
| /* ES5 15.4.4.19. */ |
| function ArrayMap(callbackfn/*, thisArg*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Step 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 5. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Step 6. */ |
| var A = std_Array(len); |
| |
| /* Step 7-8. */ |
| /* Step a (implicit), and d. */ |
| for (var k = 0; k < len; k++) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c.i-iii. */ |
| var mappedValue = callFunction(callbackfn, T, O[k], k, O); |
| _DefineDataProperty(A, k, mappedValue); |
| } |
| } |
| |
| /* Step 9. */ |
| return A; |
| } |
| |
| function ArrayStaticMap(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.map'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| return callFunction(ArrayMap, list, callbackfn, T); |
| } |
| |
| /* ES2015 22.1.3.7 Array.prototype.filter. */ |
| function ArrayFilter(callbackfn/*, thisArg*/) { |
| /* Steps 1-2. */ |
| var O = ToObject(this); |
| |
| /* Steps 3-4. */ |
| var len = ToInteger(O.length); |
| |
| /* Step 5. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.filter'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 6. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Step 7. */ |
| var A = []; |
| |
| /* Steps 8-11. */ |
| /* Steps 11.a (implicit), and 11.e. */ |
| for (var k = 0, to = 0; k < len; k++) { |
| /* Steps 11.b-c. */ |
| if (k in O) { |
| /* Steps 11.c.i-ii. */ |
| var kValue = O[k]; |
| /* Steps 11.c.iii-iv. */ |
| var selected = callFunction(callbackfn, T, kValue, k, O); |
| /* Step 11.c.v. */ |
| if (selected) |
| _DefineDataProperty(A, to++, kValue); |
| } |
| } |
| |
| /* Step 12. */ |
| return A; |
| } |
| |
| function ArrayStaticFilter(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.filter'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| return callFunction(ArrayFilter, list, callbackfn, T); |
| } |
| |
| /* ES5 15.4.4.21. */ |
| function ArrayReduce(callbackfn/*, initialValue*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 6. */ |
| var k = 0; |
| |
| /* Steps 5, 7-8. */ |
| var accumulator; |
| if (arguments.length > 1) { |
| accumulator = arguments[1]; |
| } else { |
| /* Step 5. */ |
| if (len === 0) |
| ThrowTypeError(JSMSG_EMPTY_ARRAY_REDUCE); |
| if (IsPackedArray(O)) { |
| accumulator = O[k++]; |
| } else { |
| var kPresent = false; |
| for (; k < len; k++) { |
| if (k in O) { |
| accumulator = O[k]; |
| kPresent = true; |
| k++; |
| break; |
| } |
| } |
| if (!kPresent) |
| ThrowTypeError(JSMSG_EMPTY_ARRAY_REDUCE); |
| } |
| } |
| |
| /* Step 9. */ |
| /* Steps a (implicit), and d. */ |
| for (; k < len; k++) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c. */ |
| accumulator = callbackfn(accumulator, O[k], k, O); |
| } |
| } |
| |
| /* Step 10. */ |
| return accumulator; |
| } |
| |
| function ArrayStaticReduce(list, callbackfn) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| if (arguments.length > 2) |
| return callFunction(ArrayReduce, list, callbackfn, arguments[2]); |
| else |
| return callFunction(ArrayReduce, list, callbackfn); |
| } |
| |
| /* ES5 15.4.4.22. */ |
| function ArrayReduceRight(callbackfn/*, initialValue*/) { |
| /* Step 1. */ |
| var O = ToObject(this); |
| |
| /* Steps 2-3. */ |
| var len = TO_UINT32(O.length); |
| |
| /* Step 4. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 6. */ |
| var k = len - 1; |
| |
| /* Steps 5, 7-8. */ |
| var accumulator; |
| if (arguments.length > 1) { |
| accumulator = arguments[1]; |
| } else { |
| /* Step 5. */ |
| if (len === 0) |
| ThrowTypeError(JSMSG_EMPTY_ARRAY_REDUCE); |
| if (IsPackedArray(O)) { |
| accumulator = O[k--]; |
| } else { |
| var kPresent = false; |
| for (; k >= 0; k--) { |
| if (k in O) { |
| accumulator = O[k]; |
| kPresent = true; |
| k--; |
| break; |
| } |
| } |
| if (!kPresent) |
| ThrowTypeError(JSMSG_EMPTY_ARRAY_REDUCE); |
| } |
| } |
| |
| /* Step 9. */ |
| /* Steps a (implicit), and d. */ |
| for (; k >= 0; k--) { |
| /* Step b */ |
| if (k in O) { |
| /* Step c. */ |
| accumulator = callbackfn(accumulator, O[k], k, O); |
| } |
| } |
| |
| /* Step 10. */ |
| return accumulator; |
| } |
| |
| function ArrayStaticReduceRight(list, callbackfn) { |
| if (arguments.length < 2) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduceRight'); |
| if (!IsCallable(callbackfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| if (arguments.length > 2) |
| return callFunction(ArrayReduceRight, list, callbackfn, arguments[2]); |
| else |
| return callFunction(ArrayReduceRight, list, callbackfn); |
| } |
| |
| /* ES6 draft 2013-05-14 15.4.3.23. */ |
| function ArrayFind(predicate/*, thisArg*/) { |
| /* Steps 1-2. */ |
| var O = ToObject(this); |
| |
| /* Steps 3-5. */ |
| var len = ToInteger(O.length); |
| |
| /* Step 6. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.find'); |
| if (!IsCallable(predicate)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate)); |
| |
| /* Step 7. */ |
| var T = arguments.length > 1 ? arguments[1] : undefined; |
| |
| /* Steps 8-9. */ |
| /* Steps a (implicit), and g. */ |
| /* Note: this will hang in some corner-case situations, because of IEEE-754 numbers' |
| * imprecision for large values. Example: |
| * var obj = { 18014398509481984: true, length: 18014398509481988 }; |
| * Array.prototype.find.call(obj, () => true); |
| */ |
| for (var k = 0; k < len; k++) { |
| /* Steps a-c. */ |
| var kValue = O[k]; |
| /* Steps d-f. */ |
| if (callFunction(predicate, T, kValue, k, O)) |
| return kValue; |
| } |
| |
| /* Step 10. */ |
| return undefined; |
| } |
| |
| /* ES6 draft 2013-05-14 15.4.3.23. */ |
| function ArrayFindIndex(predicate/*, thisArg*/) { |
| /* Steps 1-2. */ |
| var O = ToObject(this); |
| |
| /* Steps 3-5. */ |
| var len = ToInteger(O.length); |
| |
| /* Step 6. */ |
| if (arguments.length === 0) |
| ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.find'); |
| if (!IsCallable(predicate)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate)); |
| |
| /* Step 7. */ |
| var T = arguments.length > 1 ? arguments[1] : undefined; |
| |
| /* Steps 8-9. */ |
| /* Steps a (implicit), and g. */ |
| /* Note: this will hang in some corner-case situations, because of IEEE-754 numbers' |
| * imprecision for large values. Example: |
| * var obj = { 18014398509481984: true, length: 18014398509481988 }; |
| * Array.prototype.find.call(obj, () => true); |
| */ |
| for (var k = 0; k < len; k++) { |
| /* Steps a-f. */ |
| if (callFunction(predicate, T, O[k], k, O)) |
| return k; |
| } |
| |
| /* Step 10. */ |
| return -1; |
| } |
| |
| /* ES6 draft 2013-09-27 22.1.3.3. */ |
| function ArrayCopyWithin(target, start, end = undefined) { |
| /* Steps 1-2. */ |
| var O = ToObject(this); |
| |
| /* Steps 3-5. */ |
| var len = ToInteger(O.length); |
| |
| /* Steps 6-8. */ |
| var relativeTarget = ToInteger(target); |
| |
| var to = relativeTarget < 0 ? std_Math_max(len + relativeTarget, 0) |
| : std_Math_min(relativeTarget, len); |
| |
| /* Steps 9-11. */ |
| var relativeStart = ToInteger(start); |
| |
| var from = relativeStart < 0 ? std_Math_max(len + relativeStart, 0) |
| : std_Math_min(relativeStart, len); |
| |
| /* Steps 12-14. */ |
| var relativeEnd = end === undefined ? len |
| : ToInteger(end); |
| |
| var final = relativeEnd < 0 ? std_Math_max(len + relativeEnd, 0) |
| : std_Math_min(relativeEnd, len); |
| |
| /* Step 15. */ |
| var count = std_Math_min(final - from, len - to); |
| |
| /* Steps 16-17. */ |
| if (from < to && to < (from + count)) { |
| from = from + count - 1; |
| to = to + count - 1; |
| /* Step 18. */ |
| while (count > 0) { |
| if (from in O) |
| O[to] = O[from]; |
| else |
| delete O[to]; |
| |
| from--; |
| to--; |
| count--; |
| } |
| } else { |
| /* Step 18. */ |
| while (count > 0) { |
| if (from in O) |
| O[to] = O[from]; |
| else |
| delete O[to]; |
| |
| from++; |
| to++; |
| count--; |
| } |
| } |
| |
| /* Step 19. */ |
| return O; |
| } |
| |
| // ES6 draft 2014-04-05 22.1.3.6 |
| function ArrayFill(value, start = 0, end = undefined) { |
| // Steps 1-2. |
| var O = ToObject(this); |
| |
| // Steps 3-5. |
| // FIXME: Array operations should use ToLength (bug 924058). |
| var len = ToInteger(O.length); |
| |
| // Steps 6-7. |
| var relativeStart = ToInteger(start); |
| |
| // Step 8. |
| var k = relativeStart < 0 |
| ? std_Math_max(len + relativeStart, 0) |
| : std_Math_min(relativeStart, len); |
| |
| // Steps 9-10. |
| var relativeEnd = end === undefined ? len : ToInteger(end); |
| |
| // Step 11. |
| var final = relativeEnd < 0 |
| ? std_Math_max(len + relativeEnd, 0) |
| : std_Math_min(relativeEnd, len); |
| |
| // Step 12. |
| for (; k < final; k++) { |
| O[k] = value; |
| } |
| |
| // Step 13. |
| return O; |
| } |
| |
| // Proposed for ES7: |
| // https://github.com/tc39/Array.prototype.includes/blob/7c023c19a0/spec.md |
| function ArrayIncludes(searchElement, fromIndex = 0) { |
| // Steps 1-2. |
| var O = ToObject(this); |
| |
| // Steps 3-4. |
| var len = ToLength(O.length); |
| |
| // Step 5. |
| if (len === 0) |
| return false; |
| |
| // Steps 6-7. |
| var n = ToInteger(fromIndex); |
| |
| // Step 8. |
| var k; |
| if (n >= 0) { |
| k = n; |
| } |
| // Step 9. |
| else { |
| // Step a. |
| k = len + n; |
| // Step b. |
| if (k < 0) |
| k = 0; |
| } |
| |
| // Step 10. |
| while (k < len) { |
| // Steps a-c. |
| if (SameValueZero(searchElement, O[k])) |
| return true; |
| |
| // Step d. |
| k++; |
| } |
| |
| // Step 11. |
| return false; |
| } |
| |
| // ES6 draft specification, section 22.1.5.1, version 2013-09-05. |
| function CreateArrayIteratorAt(obj, kind, n) { |
| var iteratedObject = ToObject(obj); |
| var iterator = NewArrayIterator(); |
| UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_TARGET, iteratedObject); |
| UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_NEXT_INDEX, n); |
| UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_ITEM_KIND, kind); |
| return iterator; |
| } |
| function CreateArrayIterator(obj, kind) { |
| return CreateArrayIteratorAt(obj, kind, 0); |
| } |
| |
| |
| function ArrayIteratorNext() { |
| if (!IsObject(this) || !IsArrayIterator(this)) { |
| return callFunction(CallArrayIteratorMethodIfWrapped, this, |
| "ArrayIteratorNext"); |
| } |
| |
| var a = UnsafeGetObjectFromReservedSlot(this, ITERATOR_SLOT_TARGET); |
| // The index might not be an integer, so we have to do a generic get here. |
| var index = UnsafeGetReservedSlot(this, ITERATOR_SLOT_NEXT_INDEX); |
| var itemKind = UnsafeGetInt32FromReservedSlot(this, ITERATOR_SLOT_ITEM_KIND); |
| var result = { value: undefined, done: false }; |
| |
| // FIXME: This should be ToLength, which clamps at 2**53. Bug 924058. |
| if (index >= TO_UINT32(a.length)) { |
| // When the above is changed to ToLength, use +1/0 here instead |
| // of MAX_UINT32. |
| UnsafeSetReservedSlot(this, ITERATOR_SLOT_NEXT_INDEX, 0xffffffff); |
| result.done = true; |
| return result; |
| } |
| |
| UnsafeSetReservedSlot(this, ITERATOR_SLOT_NEXT_INDEX, index + 1); |
| |
| if (itemKind === ITEM_KIND_VALUE) { |
| result.value = a[index]; |
| return result; |
| } |
| |
| if (itemKind === ITEM_KIND_KEY_AND_VALUE) { |
| var pair = [index, a[index]]; |
| result.value = pair; |
| return result; |
| } |
| |
| assert(itemKind === ITEM_KIND_KEY, itemKind); |
| result.value = index; |
| return result; |
| } |
| |
| function ArrayValuesAt(n) { |
| return CreateArrayIteratorAt(this, ITEM_KIND_VALUE, n); |
| } |
| |
| function ArrayValues() { |
| return CreateArrayIterator(this, ITEM_KIND_VALUE); |
| } |
| |
| function ArrayEntries() { |
| return CreateArrayIterator(this, ITEM_KIND_KEY_AND_VALUE); |
| } |
| |
| function ArrayKeys() { |
| return CreateArrayIterator(this, ITEM_KIND_KEY); |
| } |
| |
| // ES6 draft rev31 (2015/01/15) 22.1.2.1 Array.from(source[, mapfn[, thisArg]]). |
| function ArrayFrom(items, mapfn=undefined, thisArg=undefined) { |
| // Step 1. |
| var C = this; |
| |
| // Steps 2-3. |
| var mapping = mapfn !== undefined; |
| if (mapping && !IsCallable(mapfn)) |
| ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, mapfn)); |
| var T = thisArg; |
| |
| // Steps 4-5. |
| var usingIterator = GetMethod(items, std_iterator); |
| |
| // Step 6. |
| if (usingIterator !== undefined) { |
| // Steps 6.a-c. |
| var A = IsConstructor(C) ? new C() : []; |
| |
| // Steps 6.d-e. |
| var iterator = GetIterator(items, usingIterator); |
| |
| // Step 6.f. |
| var k = 0; |
| |
| // Step 6.g. |
| // These steps cannot be implemented using a for-of loop. |
| // See <https://bugs.ecmascript.org/show_bug.cgi?id=2883>. |
| while (true) { |
| // Steps 6.g.i-iii. |
| var next = callFunction(iterator.next, iterator); |
| if (!IsObject(next)) |
| ThrowTypeError(JSMSG_NEXT_RETURNED_PRIMITIVE); |
| |
| // Step 6.g.iv. |
| if (next.done) { |
| A.length = k; |
| return A; |
| } |
| |
| // Steps 6.g.v-vi. |
| var nextValue = next.value; |
| |
| // Steps 6.g.vii-viii. |
| var mappedValue = mapping ? callFunction(mapfn, thisArg, nextValue, k) : nextValue; |
| |
| // Steps 6.g.ix-xi. |
| _DefineDataProperty(A, k++, mappedValue); |
| } |
| } |
| |
| // Step 7. |
| assert(usingIterator === undefined, "`items` can't be an Iterable after step 6.g.iv"); |
| |
| // Steps 8-9. |
| var arrayLike = ToObject(items); |
| |
| // Steps 10-11. |
| var len = ToLength(arrayLike.length); |
| |
| // Steps 12-14. |
| var A = IsConstructor(C) ? new C(len) : std_Array(len); |
| |
| // Steps 15-16. |
| for (var k = 0; k < len; k++) { |
| // Steps 16.a-c. |
| var kValue = items[k]; |
| |
| // Steps 16.d-e. |
| var mappedValue = mapping ? callFunction(mapfn, thisArg, kValue, k) : kValue; |
| |
| // Steps 16.f-g. |
| _DefineDataProperty(A, k, mappedValue); |
| } |
| |
| // Steps 17-18. |
| A.length = len; |
| |
| // Step 19. |
| return A; |
| } |
| |
| // ES2015 22.1.3.27 Array.prototype.toString. |
| function ArrayToString() { |
| // Steps 1-2. |
| var array = ToObject(this); |
| |
| // Steps 3-4. |
| var func = array.join; |
| |
| // Steps 5-6. |
| if (!IsCallable(func)) |
| return callFunction(std_Object_toString, array); |
| return callFunction(func, array); |
| } |