OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 'use strict'; | 5 'use strict'; |
6 | 6 |
7 | 7 |
8 // This file relies on the fact that the following declaration has been made | 8 // This file relies on the fact that the following declaration has been made |
9 // in runtime.js: | 9 // in runtime.js: |
10 // var $Array = global.Array; | 10 // var $Array = global.Array; |
11 | 11 |
12 | 12 |
13 var arrayIteratorObjectSymbol = GLOBAL_PRIVATE("ArrayIterator#object"); | 13 var arrayIteratorObjectSymbol = GLOBAL_PRIVATE("ArrayIterator#object"); |
14 var arrayIteratorNextIndexSymbol = GLOBAL_PRIVATE("ArrayIterator#next"); | 14 var arrayIteratorNextIndexSymbol = GLOBAL_PRIVATE("ArrayIterator#next"); |
15 var arrayIterationKindSymbol = GLOBAL_PRIVATE("ArrayIterator#kind"); | 15 var arrayIterationKindSymbol = GLOBAL_PRIVATE("ArrayIterator#kind"); |
16 | 16 |
17 | 17 |
18 function ArrayIterator() {} | 18 function ArrayIterator() {} |
19 | 19 |
20 | 20 |
| 21 // TODO(wingo): Update section numbers when ES6 has stabilized. The |
| 22 // section numbers below are already out of date as of the May 2014 |
| 23 // draft. |
| 24 |
| 25 |
21 // 15.4.5.1 CreateArrayIterator Abstract Operation | 26 // 15.4.5.1 CreateArrayIterator Abstract Operation |
22 function CreateArrayIterator(array, kind) { | 27 function CreateArrayIterator(array, kind) { |
23 var object = ToObject(array); | 28 var object = ToObject(array); |
24 var iterator = new ArrayIterator; | 29 var iterator = new ArrayIterator; |
25 SET_PRIVATE(iterator, arrayIteratorObjectSymbol, object); | 30 SET_PRIVATE(iterator, arrayIteratorObjectSymbol, object); |
26 SET_PRIVATE(iterator, arrayIteratorNextIndexSymbol, 0); | 31 SET_PRIVATE(iterator, arrayIteratorNextIndexSymbol, 0); |
27 SET_PRIVATE(iterator, arrayIterationKindSymbol, kind); | 32 SET_PRIVATE(iterator, arrayIterationKindSymbol, kind); |
28 return iterator; | 33 return iterator; |
29 } | 34 } |
30 | 35 |
31 | 36 |
32 // 15.19.4.3.4 CreateItrResultObject | 37 // 15.19.4.3.4 CreateItrResultObject |
33 function CreateIteratorResultObject(value, done) { | 38 function CreateIteratorResultObject(value, done) { |
34 return {value: value, done: done}; | 39 return {value: value, done: done}; |
35 } | 40 } |
36 | 41 |
37 | 42 |
| 43 // 22.1.5.2.2 %ArrayIteratorPrototype%[@@iterator] |
| 44 function ArrayIteratorIterator() { |
| 45 return this; |
| 46 } |
| 47 |
| 48 |
38 // 15.4.5.2.2 ArrayIterator.prototype.next( ) | 49 // 15.4.5.2.2 ArrayIterator.prototype.next( ) |
39 function ArrayIteratorNext() { | 50 function ArrayIteratorNext() { |
40 var iterator = ToObject(this); | 51 var iterator = ToObject(this); |
41 | 52 |
42 if (!HAS_PRIVATE(iterator, arrayIteratorObjectSymbol)) { | 53 if (!HAS_PRIVATE(iterator, arrayIteratorObjectSymbol)) { |
43 throw MakeTypeError('incompatible_method_receiver', | 54 throw MakeTypeError('incompatible_method_receiver', |
44 ['Array Iterator.prototype.next']); | 55 ['Array Iterator.prototype.next']); |
45 } | 56 } |
46 | 57 |
47 var array = GET_PRIVATE(iterator, arrayIteratorObjectSymbol); | 58 var array = GET_PRIVATE(iterator, arrayIteratorObjectSymbol); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 102 |
92 function SetUpArrayIterator() { | 103 function SetUpArrayIterator() { |
93 %CheckIsBootstrapping(); | 104 %CheckIsBootstrapping(); |
94 | 105 |
95 %FunctionSetPrototype(ArrayIterator, new $Object()); | 106 %FunctionSetPrototype(ArrayIterator, new $Object()); |
96 %FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator'); | 107 %FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator'); |
97 | 108 |
98 InstallFunctions(ArrayIterator.prototype, DONT_ENUM, $Array( | 109 InstallFunctions(ArrayIterator.prototype, DONT_ENUM, $Array( |
99 'next', ArrayIteratorNext | 110 'next', ArrayIteratorNext |
100 )); | 111 )); |
| 112 %FunctionSetName(ArrayIteratorIterator, '[Symbol.iterator]'); |
| 113 %SetProperty(ArrayIterator.prototype, symbolIterator, ArrayIteratorIterator, |
| 114 DONT_ENUM | DONT_DELETE | READ_ONLY); |
101 } | 115 } |
102 SetUpArrayIterator(); | 116 SetUpArrayIterator(); |
103 | 117 |
104 | 118 |
105 function ExtendArrayPrototype() { | 119 function ExtendArrayPrototype() { |
106 %CheckIsBootstrapping(); | 120 %CheckIsBootstrapping(); |
107 | 121 |
108 InstallFunctions($Array.prototype, DONT_ENUM, $Array( | 122 InstallFunctions($Array.prototype, DONT_ENUM, $Array( |
109 'entries', ArrayEntries, | 123 'entries', ArrayEntries, |
110 'values', ArrayValues, | 124 'values', ArrayValues, |
111 'keys', ArrayKeys | 125 'keys', ArrayKeys |
112 )); | 126 )); |
113 } | 127 } |
114 ExtendArrayPrototype(); | 128 ExtendArrayPrototype(); |
OLD | NEW |