Bug 1165052 - Part 10: Use ArraySpeciesCreate in Array.prototype.map. r=efaust

This commit is contained in:
Tooru Fujisawa 2015-08-07 08:02:18 +09:00
parent 87d38c6060
commit d8a1a10ae2

View File

@ -265,38 +265,39 @@ function ArrayStaticForEach(list, callbackfn/*, thisArg*/) {
callFunction(ArrayForEach, list, callbackfn, T); callFunction(ArrayForEach, list, callbackfn, T);
} }
/* ES5 15.4.4.19. */ /* ES 2016 draft Mar 25, 2016 22.1.3.15. */
function ArrayMap(callbackfn/*, thisArg*/) { function ArrayMap(callbackfn/*, thisArg*/) {
/* Step 1. */ /* Step 1. */
var O = ToObject(this); var O = ToObject(this);
/* Step 2-3. */ /* Step 2. */
/* FIXME: Array operations should use ToLength (bug 924058). */
var len = TO_UINT32(O.length); var len = TO_UINT32(O.length);
/* Step 4. */ /* Step 3. */
if (arguments.length === 0) if (arguments.length === 0)
ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map'); ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map');
if (!IsCallable(callbackfn)) if (!IsCallable(callbackfn))
ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn)); ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
/* Step 5. */ /* Step 4. */
var T = arguments.length > 1 ? arguments[1] : void 0; var T = arguments.length > 1 ? arguments[1] : void 0;
/* Step 6. */ /* Steps 5. */
var A = std_Array(len); var A = ArraySpeciesCreate(O, len);
/* Step 7-8. */ /* Steps 6-7. */
/* Step a (implicit), and d. */ /* Steps 7.a (implicit), and 7.d. */
for (var k = 0; k < len; k++) { for (var k = 0; k < len; k++) {
/* Step b */ /* Steps 7.b-c. */
if (k in O) { if (k in O) {
/* Step c.i-iii. */ /* Steps 7.c.i-iii. */
var mappedValue = callContentFunction(callbackfn, T, O[k], k, O); var mappedValue = callContentFunction(callbackfn, T, O[k], k, O);
_DefineDataProperty(A, k, mappedValue); _DefineDataProperty(A, k, mappedValue);
} }
} }
/* Step 9. */ /* Step 8. */
return A; return A;
} }