Chromium Code Reviews| Index: src/harmony-array.js |
| diff --git a/src/harmony-array.js b/src/harmony-array.js |
| index 88b878f0a76ef594f64f7905d61459c05749724b..e3db8322252e39407bf3cec802911a5557498472 100644 |
| --- a/src/harmony-array.js |
| +++ b/src/harmony-array.js |
| @@ -123,6 +123,67 @@ function ArrayFill(value /* [, start [, end ] ] */) { // length == 1 |
| return array; |
| } |
| +// ES6, draft 08-24-14, section 22.1.2.1 |
| +function ArrayFrom(arrayLike, mapfn, receiver) { |
| + var C = this; |
|
rossberg
2014/09/10 07:23:55
Nit: drop this redundant variable.
|
| + var items = ToObject(arrayLike); |
| + var mapping; |
| + |
| + if (IS_UNDEFINED(mapfn)) { |
|
rossberg
2014/09/10 07:23:55
var mapping = !IS_UNDEFINED(mapfn)
But in fact, i
|
| + mapping = false; |
| + } else { |
| + mapping = true; |
| + if (!IS_SPEC_FUNCTION(mapfn)) { |
| + throw MakeTypeError('called_non_callable', [ mapfn ]); |
| + } |
| + |
| + if (IS_NULL_OR_UNDEFINED(receiver)) { |
| + receiver = %GetDefaultReceiver(mapfn) || receiver; |
| + } else if (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(mapfn)) { |
| + receiver = ToObject(receiver); |
|
rossberg
2014/09/10 07:23:55
Hm, is this actually necessary? Doesn't _CallFunct
caitp (gmail)
2014/09/10 14:26:04
Looks like Execution::Call() does this, yes --- ed
arv (Not doing code reviews)
2014/09/10 14:33:58
Yes. We don't want _CallFunction to have to do the
|
| + } |
| + } |
| + |
| + var usingIterator = ToIterable(items); |
|
rossberg
2014/09/10 07:23:55
Nit: rename to iterable?
|
| + var k; |
|
rossberg
2014/09/10 07:23:55
These can all be locally declared. Also, please us
caitp (gmail)
2014/09/10 14:26:04
More descriptive name is good --- I think declarin
|
| + var A; |
| + var mappedValue; |
| + var nextValue; |
| + |
| + if (!IS_UNDEFINED(usingIterator)) { |
| + // Step 8. |
| + A = IS_SPEC_FUNCTION(C) ? new C() : []; |
| + |
| + var iterator = GetIterator(items, usingIterator); |
| + var next; |
| + k = 0; |
| + |
| + while (!(next = iterator.next()).done) { |
|
rossberg
2014/09/10 07:23:55
I think
for (var next = iterator.next(); !next.
arv (Not doing code reviews)
2014/09/10 14:05:14
Using for-of is going to be an observable differen
|
| + if (!IS_SPEC_OBJECT(next)) { |
| + throw MakeTypeError('iterator_result_not_an_object', [next]); |
| + } |
| + nextValue = next.value; |
| + mappedValue = mapping ? %_CallFunction(receiver, nextValue, k, mapfn) : nextValue; |
|
rossberg
2014/09/10 07:23:55
Nit: line length
|
| + %AddElement(A, k++, mappedValue, NONE); |
| + } |
| + A.length = k; |
| + return A; |
| + } else { |
| + // Steps 9 .. 20 |
| + var len = TO_LENGTH(items.length); |
| + A = IS_SPEC_FUNCTION(C) ? new C(len) : new $Array(len); |
| + |
| + for (k = 0; k < len; ++k) { |
| + nextValue = items[k]; |
| + mappedValue = mapping ? %_CallFunction(receiver, nextValue, k, mapfn) : nextValue; |
|
rossberg
2014/09/10 07:23:55
Nit: line length
|
| + %AddElement(A, k, mappedValue, NONE); |
| + } |
| + |
| + A.length = k; |
| + return A; |
| + } |
| +} |
| + |
| // ES6, draft 05-22-14, section 22.1.2.3 |
| function ArrayOf() { |
| var length = %_ArgumentsLength(); |
| @@ -141,8 +202,11 @@ function ArrayOf() { |
| function HarmonyArrayExtendArrayPrototype() { |
| %CheckIsBootstrapping(); |
| + %FunctionSetLength(ArrayFrom, 1); |
| + |
| // Set up non-enumerable functions on the Array object. |
| InstallFunctions($Array, DONT_ENUM, $Array( |
| + "from", ArrayFrom, |
| "of", ArrayOf |
| )); |