array-iterator.js 4.29 KB
Newer Older
1
// Copyright 2013 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4

5 6 7 8 9
var $iteratorCreateResultObject;
var $arrayValues;

(function() {

10
"use strict";
11

12
%CheckIsBootstrapping();
13

14 15
var GlobalArray = global.Array;
var GlobalObject = global.Object;
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
macro TYPED_ARRAYS(FUNCTION)
  FUNCTION(Uint8Array)
  FUNCTION(Int8Array)
  FUNCTION(Uint16Array)
  FUNCTION(Int16Array)
  FUNCTION(Uint32Array)
  FUNCTION(Int32Array)
  FUNCTION(Float32Array)
  FUNCTION(Float64Array)
  FUNCTION(Uint8ClampedArray)
endmacro

macro COPY_FROM_GLOBAL(NAME)
  var GlobalNAME = global.NAME;
endmacro

TYPED_ARRAYS(COPY_FROM_GLOBAL)
34

35 36 37
var arrayIteratorObjectSymbol = GLOBAL_PRIVATE("ArrayIterator#object");
var arrayIteratorNextIndexSymbol = GLOBAL_PRIVATE("ArrayIterator#next");
var arrayIterationKindSymbol = GLOBAL_PRIVATE("ArrayIterator#kind");
38

39

40 41
function ArrayIterator() {}

42

43 44 45 46 47
// TODO(wingo): Update section numbers when ES6 has stabilized.  The
// section numbers below are already out of date as of the May 2014
// draft.


48 49 50 51
// 15.4.5.1 CreateArrayIterator Abstract Operation
function CreateArrayIterator(array, kind) {
  var object = ToObject(array);
  var iterator = new ArrayIterator;
52
  SET_PRIVATE(iterator, arrayIteratorObjectSymbol, object);
53 54
  SET_PRIVATE(iterator, arrayIteratorNextIndexSymbol, 0);
  SET_PRIVATE(iterator, arrayIterationKindSymbol, kind);
55 56 57
  return iterator;
}

58

59 60 61 62 63
// 15.19.4.3.4 CreateItrResultObject
function CreateIteratorResultObject(value, done) {
  return {value: value, done: done};
}

64

65 66 67 68 69 70
// 22.1.5.2.2 %ArrayIteratorPrototype%[@@iterator]
function ArrayIteratorIterator() {
    return this;
}


71 72 73
// 15.4.5.2.2 ArrayIterator.prototype.next( )
function ArrayIteratorNext() {
  var iterator = ToObject(this);
74

75
  if (!HAS_DEFINED_PRIVATE(iterator, arrayIteratorNextIndexSymbol)) {
76 77
    throw MakeTypeError(kIncompatibleMethodReceiver,
                        'Array Iterator.prototype.next', this);
78 79
  }

80 81 82 83 84
  var array = GET_PRIVATE(iterator, arrayIteratorObjectSymbol);
  if (IS_UNDEFINED(array)) {
    return CreateIteratorResultObject(UNDEFINED, true);
  }

85 86
  var index = GET_PRIVATE(iterator, arrayIteratorNextIndexSymbol);
  var itemKind = GET_PRIVATE(iterator, arrayIterationKindSymbol);
87 88 89 90 91
  var length = TO_UINT32(array.length);

  // "sparse" is never used.

  if (index >= length) {
92
    SET_PRIVATE(iterator, arrayIteratorObjectSymbol, UNDEFINED);
93
    return CreateIteratorResultObject(UNDEFINED, true);
94 95
  }

96
  SET_PRIVATE(iterator, arrayIteratorNextIndexSymbol, index + 1);
97

98
  if (itemKind == ITERATOR_KIND_VALUES) {
99
    return CreateIteratorResultObject(array[index], false);
100
  }
101

102
  if (itemKind == ITERATOR_KIND_ENTRIES) {
103
    return CreateIteratorResultObject([index, array[index]], false);
104
  }
105

106
  return CreateIteratorResultObject(index, false);
107 108
}

109

110
function ArrayEntries() {
111
  return CreateArrayIterator(this, ITERATOR_KIND_ENTRIES);
112 113
}

114

115
function ArrayValues() {
116
  return CreateArrayIterator(this, ITERATOR_KIND_VALUES);
117 118
}

119

120
function ArrayKeys() {
121
  return CreateArrayIterator(this, ITERATOR_KIND_KEYS);
122 123
}

124

125 126
%FunctionSetPrototype(ArrayIterator, new GlobalObject());
%FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator');
127

128 129 130 131 132 133 134 135
InstallFunctions(ArrayIterator.prototype, DONT_ENUM, [
  'next', ArrayIteratorNext
]);
%FunctionSetName(ArrayIteratorIterator, '[Symbol.iterator]');
%AddNamedProperty(ArrayIterator.prototype, symbolIterator,
                  ArrayIteratorIterator, DONT_ENUM);
%AddNamedProperty(ArrayIterator.prototype, symbolToStringTag,
                  "Array Iterator", READ_ONLY | DONT_ENUM);
136

137 138 139 140 141
InstallFunctions(GlobalArray.prototype, DONT_ENUM, [
  // No 'values' since it breaks webcompat: http://crbug.com/409858
  'entries', ArrayEntries,
  'keys', ArrayKeys
]);
142

143 144
%AddNamedProperty(GlobalArray.prototype, symbolIterator, ArrayValues,
                  DONT_ENUM);
145 146

macro EXTEND_TYPED_ARRAY(NAME)
147 148 149 150 151
  %AddNamedProperty(GlobalNAME.prototype, 'entries', ArrayEntries, DONT_ENUM);
  %AddNamedProperty(GlobalNAME.prototype, 'values', ArrayValues, DONT_ENUM);
  %AddNamedProperty(GlobalNAME.prototype, 'keys', ArrayKeys, DONT_ENUM);
  %AddNamedProperty(GlobalNAME.prototype, symbolIterator, ArrayValues,
                    DONT_ENUM);
152 153
endmacro

154 155 156 157 158 159
TYPED_ARRAYS(EXTEND_TYPED_ARRAY)

$iteratorCreateResultObject = CreateIteratorResultObject;
$arrayValues = ArrayValues;

})();