| 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 (function() { | 5 (function() { |
| 6 | 6 |
| 7 'use strict'; | 7 'use strict'; |
| 8 | 8 |
| 9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
| 10 | 10 |
| 11 var GlobalArray = global.Array; | 11 var GlobalArray = global.Array; |
| 12 var GlobalSymbol = global.Symbol; | 12 var GlobalSymbol = global.Symbol; |
| 13 | 13 |
| 14 // ------------------------------------------------------------------- | 14 // ------------------------------------------------------------------- |
| 15 | 15 |
| 16 // ES6 draft 03-17-15, section 22.1.3.3 | 16 // ES6 draft 03-17-15, section 22.1.3.3 |
| 17 function ArrayCopyWithin(target, start, end) { | 17 function ArrayCopyWithin(target, start, end) { |
| 18 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.copyWithin"); | 18 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.copyWithin"); |
| 19 | 19 |
| 20 var array = TO_OBJECT_INLINE(this); | 20 var array = TO_OBJECT_INLINE(this); |
| 21 var length = ToLength(array.length); | 21 var length = $toLength(array.length); |
| 22 | 22 |
| 23 target = TO_INTEGER(target); | 23 target = TO_INTEGER(target); |
| 24 var to; | 24 var to; |
| 25 if (target < 0) { | 25 if (target < 0) { |
| 26 to = $max(length + target, 0); | 26 to = $max(length + target, 0); |
| 27 } else { | 27 } else { |
| 28 to = $min(target, length); | 28 to = $min(target, length); |
| 29 } | 29 } |
| 30 | 30 |
| 31 start = TO_INTEGER(start); | 31 start = TO_INTEGER(start); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 count--; | 63 count--; |
| 64 } | 64 } |
| 65 | 65 |
| 66 return array; | 66 return array; |
| 67 } | 67 } |
| 68 | 68 |
| 69 // ES6 draft 07-15-13, section 15.4.3.23 | 69 // ES6 draft 07-15-13, section 15.4.3.23 |
| 70 function ArrayFind(predicate /* thisArg */) { // length == 1 | 70 function ArrayFind(predicate /* thisArg */) { // length == 1 |
| 71 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); | 71 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); |
| 72 | 72 |
| 73 var array = ToObject(this); | 73 var array = $toObject(this); |
| 74 var length = ToInteger(array.length); | 74 var length = $toInteger(array.length); |
| 75 | 75 |
| 76 if (!IS_SPEC_FUNCTION(predicate)) { | 76 if (!IS_SPEC_FUNCTION(predicate)) { |
| 77 throw MakeTypeError(kCalledNonCallable, predicate); | 77 throw MakeTypeError(kCalledNonCallable, predicate); |
| 78 } | 78 } |
| 79 | 79 |
| 80 var thisArg; | 80 var thisArg; |
| 81 if (%_ArgumentsLength() > 1) { | 81 if (%_ArgumentsLength() > 1) { |
| 82 thisArg = %_Arguments(1); | 82 thisArg = %_Arguments(1); |
| 83 } | 83 } |
| 84 | 84 |
| 85 var needs_wrapper = false; | 85 var needs_wrapper = false; |
| 86 if (IS_NULL(thisArg)) { | 86 if (IS_NULL(thisArg)) { |
| 87 if (%IsSloppyModeFunction(predicate)) thisArg = UNDEFINED; | 87 if (%IsSloppyModeFunction(predicate)) thisArg = UNDEFINED; |
| 88 } else if (!IS_UNDEFINED(thisArg)) { | 88 } else if (!IS_UNDEFINED(thisArg)) { |
| 89 needs_wrapper = SHOULD_CREATE_WRAPPER(predicate, thisArg); | 89 needs_wrapper = SHOULD_CREATE_WRAPPER(predicate, thisArg); |
| 90 } | 90 } |
| 91 | 91 |
| 92 for (var i = 0; i < length; i++) { | 92 for (var i = 0; i < length; i++) { |
| 93 if (i in array) { | 93 if (i in array) { |
| 94 var element = array[i]; | 94 var element = array[i]; |
| 95 var newThisArg = needs_wrapper ? ToObject(thisArg) : thisArg; | 95 var newThisArg = needs_wrapper ? $toObject(thisArg) : thisArg; |
| 96 if (%_CallFunction(newThisArg, element, i, array, predicate)) { | 96 if (%_CallFunction(newThisArg, element, i, array, predicate)) { |
| 97 return element; | 97 return element; |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 | 101 |
| 102 return; | 102 return; |
| 103 } | 103 } |
| 104 | 104 |
| 105 | 105 |
| 106 // ES6 draft 07-15-13, section 15.4.3.24 | 106 // ES6 draft 07-15-13, section 15.4.3.24 |
| 107 function ArrayFindIndex(predicate /* thisArg */) { // length == 1 | 107 function ArrayFindIndex(predicate /* thisArg */) { // length == 1 |
| 108 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.findIndex"); | 108 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.findIndex"); |
| 109 | 109 |
| 110 var array = ToObject(this); | 110 var array = $toObject(this); |
| 111 var length = ToInteger(array.length); | 111 var length = $toInteger(array.length); |
| 112 | 112 |
| 113 if (!IS_SPEC_FUNCTION(predicate)) { | 113 if (!IS_SPEC_FUNCTION(predicate)) { |
| 114 throw MakeTypeError(kCalledNonCallable, predicate); | 114 throw MakeTypeError(kCalledNonCallable, predicate); |
| 115 } | 115 } |
| 116 | 116 |
| 117 var thisArg; | 117 var thisArg; |
| 118 if (%_ArgumentsLength() > 1) { | 118 if (%_ArgumentsLength() > 1) { |
| 119 thisArg = %_Arguments(1); | 119 thisArg = %_Arguments(1); |
| 120 } | 120 } |
| 121 | 121 |
| 122 var needs_wrapper = false; | 122 var needs_wrapper = false; |
| 123 if (IS_NULL(thisArg)) { | 123 if (IS_NULL(thisArg)) { |
| 124 if (%IsSloppyModeFunction(predicate)) thisArg = UNDEFINED; | 124 if (%IsSloppyModeFunction(predicate)) thisArg = UNDEFINED; |
| 125 } else if (!IS_UNDEFINED(thisArg)) { | 125 } else if (!IS_UNDEFINED(thisArg)) { |
| 126 needs_wrapper = SHOULD_CREATE_WRAPPER(predicate, thisArg); | 126 needs_wrapper = SHOULD_CREATE_WRAPPER(predicate, thisArg); |
| 127 } | 127 } |
| 128 | 128 |
| 129 for (var i = 0; i < length; i++) { | 129 for (var i = 0; i < length; i++) { |
| 130 if (i in array) { | 130 if (i in array) { |
| 131 var element = array[i]; | 131 var element = array[i]; |
| 132 var newThisArg = needs_wrapper ? ToObject(thisArg) : thisArg; | 132 var newThisArg = needs_wrapper ? $toObject(thisArg) : thisArg; |
| 133 if (%_CallFunction(newThisArg, element, i, array, predicate)) { | 133 if (%_CallFunction(newThisArg, element, i, array, predicate)) { |
| 134 return i; | 134 return i; |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 | 138 |
| 139 return -1; | 139 return -1; |
| 140 } | 140 } |
| 141 | 141 |
| 142 | 142 |
| 143 // ES6, draft 04-05-14, section 22.1.3.6 | 143 // ES6, draft 04-05-14, section 22.1.3.6 |
| 144 function ArrayFill(value /* [, start [, end ] ] */) { // length == 1 | 144 function ArrayFill(value /* [, start [, end ] ] */) { // length == 1 |
| 145 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); | 145 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); |
| 146 | 146 |
| 147 var array = ToObject(this); | 147 var array = $toObject(this); |
| 148 var length = TO_UINT32(array.length); | 148 var length = TO_UINT32(array.length); |
| 149 | 149 |
| 150 var i = 0; | 150 var i = 0; |
| 151 var end = length; | 151 var end = length; |
| 152 | 152 |
| 153 if (%_ArgumentsLength() > 1) { | 153 if (%_ArgumentsLength() > 1) { |
| 154 i = %_Arguments(1); | 154 i = %_Arguments(1); |
| 155 i = IS_UNDEFINED(i) ? 0 : TO_INTEGER(i); | 155 i = IS_UNDEFINED(i) ? 0 : TO_INTEGER(i); |
| 156 if (%_ArgumentsLength() > 2) { | 156 if (%_ArgumentsLength() > 2) { |
| 157 end = %_Arguments(2); | 157 end = %_Arguments(2); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 177 throw MakeTypeError(kArrayFunctionsOnFrozen); | 177 throw MakeTypeError(kArrayFunctionsOnFrozen); |
| 178 } | 178 } |
| 179 | 179 |
| 180 for (; i < end; i++) | 180 for (; i < end; i++) |
| 181 array[i] = value; | 181 array[i] = value; |
| 182 return array; | 182 return array; |
| 183 } | 183 } |
| 184 | 184 |
| 185 // ES6, draft 10-14-14, section 22.1.2.1 | 185 // ES6, draft 10-14-14, section 22.1.2.1 |
| 186 function ArrayFrom(arrayLike, mapfn, receiver) { | 186 function ArrayFrom(arrayLike, mapfn, receiver) { |
| 187 var items = ToObject(arrayLike); | 187 var items = $toObject(arrayLike); |
| 188 var mapping = !IS_UNDEFINED(mapfn); | 188 var mapping = !IS_UNDEFINED(mapfn); |
| 189 | 189 |
| 190 if (mapping) { | 190 if (mapping) { |
| 191 if (!IS_SPEC_FUNCTION(mapfn)) { | 191 if (!IS_SPEC_FUNCTION(mapfn)) { |
| 192 throw MakeTypeError(kCalledNonCallable, mapfn); | 192 throw MakeTypeError(kCalledNonCallable, mapfn); |
| 193 } else if (%IsSloppyModeFunction(mapfn)) { | 193 } else if (%IsSloppyModeFunction(mapfn)) { |
| 194 if (IS_NULL(receiver)) { | 194 if (IS_NULL(receiver)) { |
| 195 receiver = UNDEFINED; | 195 receiver = UNDEFINED; |
| 196 } else if (!IS_UNDEFINED(receiver)) { | 196 } else if (!IS_UNDEFINED(receiver)) { |
| 197 receiver = TO_OBJECT_INLINE(receiver); | 197 receiver = TO_OBJECT_INLINE(receiver); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 225 | 225 |
| 226 nextValue = next.value; | 226 nextValue = next.value; |
| 227 if (mapping) { | 227 if (mapping) { |
| 228 mappedValue = %_CallFunction(receiver, nextValue, k, mapfn); | 228 mappedValue = %_CallFunction(receiver, nextValue, k, mapfn); |
| 229 } else { | 229 } else { |
| 230 mappedValue = nextValue; | 230 mappedValue = nextValue; |
| 231 } | 231 } |
| 232 %AddElement(result, k++, mappedValue, NONE); | 232 %AddElement(result, k++, mappedValue, NONE); |
| 233 } | 233 } |
| 234 } else { | 234 } else { |
| 235 var len = ToLength(items.length); | 235 var len = $toLength(items.length); |
| 236 result = %IsConstructor(this) ? new this(len) : new $Array(len); | 236 result = %IsConstructor(this) ? new this(len) : new GlobalArray(len); |
| 237 | 237 |
| 238 for (k = 0; k < len; ++k) { | 238 for (k = 0; k < len; ++k) { |
| 239 nextValue = items[k]; | 239 nextValue = items[k]; |
| 240 if (mapping) { | 240 if (mapping) { |
| 241 mappedValue = %_CallFunction(receiver, nextValue, k, mapfn); | 241 mappedValue = %_CallFunction(receiver, nextValue, k, mapfn); |
| 242 } else { | 242 } else { |
| 243 mappedValue = nextValue; | 243 mappedValue = nextValue; |
| 244 } | 244 } |
| 245 %AddElement(result, k, mappedValue, NONE); | 245 %AddElement(result, k, mappedValue, NONE); |
| 246 } | 246 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 281 |
| 282 // Set up the non-enumerable functions on the Array prototype object. | 282 // Set up the non-enumerable functions on the Array prototype object. |
| 283 $installFunctions(GlobalArray.prototype, DONT_ENUM, [ | 283 $installFunctions(GlobalArray.prototype, DONT_ENUM, [ |
| 284 "copyWithin", ArrayCopyWithin, | 284 "copyWithin", ArrayCopyWithin, |
| 285 "find", ArrayFind, | 285 "find", ArrayFind, |
| 286 "findIndex", ArrayFindIndex, | 286 "findIndex", ArrayFindIndex, |
| 287 "fill", ArrayFill | 287 "fill", ArrayFill |
| 288 ]); | 288 ]); |
| 289 | 289 |
| 290 })(); | 290 })(); |
| OLD | NEW |