| /* 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. */ |
| 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) |
| ThrowError(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. */ |
| 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) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.every'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.every'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.some'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.some'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.forEach'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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; |
| } |
| |
| /* 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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); |
| |
| /* Step 5. */ |
| var T = arguments.length > 1 ? arguments[1] : void 0; |
| |
| /* Step 6. */ |
| var A = NewDenseArray(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); |
| // UnsafeSetElement doesn't invoke setters, so we can use it here. |
| UnsafeSetElement(A, k, mappedValue); |
| } |
| } |
| |
| /* Step 9. */ |
| return A; |
| } |
| |
| function ArrayStaticMap(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.map'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| return callFunction(ArrayMap, list, callbackfn, T); |
| } |
| |
| function ArrayStaticForEach(list, callbackfn/*, thisArg*/) { |
| if (arguments.length < 2) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.forEach'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| var T = arguments.length > 2 ? arguments[2] : void 0; |
| callFunction(ArrayForEach, 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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_EMPTY_ARRAY_REDUCE); |
| var kPresent = false; |
| for (; k < len; k++) { |
| if (k in O) { |
| accumulator = O[k]; |
| kPresent = true; |
| k++; |
| break; |
| } |
| } |
| if (!kPresent) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(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) |
| ThrowError(JSMSG_EMPTY_ARRAY_REDUCE); |
| var kPresent = false; |
| for (; k >= 0; k--) { |
| if (k in O) { |
| accumulator = O[k]; |
| kPresent = true; |
| k--; |
| break; |
| } |
| } |
| if (!kPresent) |
| ThrowError(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) |
| ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduceRight'); |
| if (!IsCallable(callbackfn)) |
| ThrowError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn)); |
| if (arguments.length > 2) |
| return callFunction(ArrayReduceRight, list, callbackfn, arguments[2]); |
| else |
| return callFunction(ArrayReduceRight, list, callbackfn); |
| } |