| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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(global, utils, extrasUtils) { | 5 (function(global, utils, extrasUtils) { |
| 6 | 6 |
| 7 "use strict"; | 7 "use strict"; |
| 8 | 8 |
| 9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
| 10 | 10 |
| 11 // ------------------------------------------------------------------- | 11 // ------------------------------------------------------------------- |
| 12 // Imports | 12 // Imports |
| 13 | 13 |
| 14 var GetIterator; | 14 var GetIterator; |
| 15 var GetMethod; | 15 var GetMethod; |
| 16 var GlobalArray = global.Array; | 16 var GlobalArray = global.Array; |
| 17 var InternalArray = utils.InternalArray; | 17 var InternalArray = utils.InternalArray; |
| 18 var InternalPackedArray = utils.InternalPackedArray; | 18 var InternalPackedArray = utils.InternalPackedArray; |
| 19 var MakeTypeError; | |
| 20 var MaxSimple; | 19 var MaxSimple; |
| 21 var MinSimple; | 20 var MinSimple; |
| 22 var ObjectHasOwnProperty; | 21 var ObjectHasOwnProperty; |
| 23 var ObjectToString = utils.ImportNow("object_to_string"); | 22 var ObjectToString = utils.ImportNow("object_to_string"); |
| 24 var iteratorSymbol = utils.ImportNow("iterator_symbol"); | 23 var iteratorSymbol = utils.ImportNow("iterator_symbol"); |
| 25 var speciesSymbol = utils.ImportNow("species_symbol"); | 24 var speciesSymbol = utils.ImportNow("species_symbol"); |
| 26 var unscopablesSymbol = utils.ImportNow("unscopables_symbol"); | 25 var unscopablesSymbol = utils.ImportNow("unscopables_symbol"); |
| 27 | 26 |
| 28 utils.Import(function(from) { | 27 utils.Import(function(from) { |
| 29 GetIterator = from.GetIterator; | 28 GetIterator = from.GetIterator; |
| 30 GetMethod = from.GetMethod; | 29 GetMethod = from.GetMethod; |
| 31 MakeTypeError = from.MakeTypeError; | |
| 32 MaxSimple = from.MaxSimple; | 30 MaxSimple = from.MaxSimple; |
| 33 MinSimple = from.MinSimple; | 31 MinSimple = from.MinSimple; |
| 34 ObjectHasOwnProperty = from.ObjectHasOwnProperty; | 32 ObjectHasOwnProperty = from.ObjectHasOwnProperty; |
| 35 }); | 33 }); |
| 36 | 34 |
| 37 // ------------------------------------------------------------------- | 35 // ------------------------------------------------------------------- |
| 38 | 36 |
| 39 | 37 |
| 40 function ArraySpeciesCreate(array, length) { | 38 function ArraySpeciesCreate(array, length) { |
| 41 length = INVERT_NEG_ZERO(length); | 39 length = INVERT_NEG_ZERO(length); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 function ArrayPush() { | 415 function ArrayPush() { |
| 418 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push"); | 416 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push"); |
| 419 | 417 |
| 420 var array = TO_OBJECT(this); | 418 var array = TO_OBJECT(this); |
| 421 var n = TO_LENGTH(array.length); | 419 var n = TO_LENGTH(array.length); |
| 422 var m = arguments.length; | 420 var m = arguments.length; |
| 423 | 421 |
| 424 // Subtract n from kMaxSafeInteger rather than testing m + n > | 422 // Subtract n from kMaxSafeInteger rather than testing m + n > |
| 425 // kMaxSafeInteger. n may already be kMaxSafeInteger. In that case adding | 423 // kMaxSafeInteger. n may already be kMaxSafeInteger. In that case adding |
| 426 // e.g., 1 would not be safe. | 424 // e.g., 1 would not be safe. |
| 427 if (m > kMaxSafeInteger - n) throw MakeTypeError(kPushPastSafeLength, m, n); | 425 if (m > kMaxSafeInteger - n) throw %make_type_error(kPushPastSafeLength, m, n)
; |
| 428 | 426 |
| 429 for (var i = 0; i < m; i++) { | 427 for (var i = 0; i < m; i++) { |
| 430 array[i+n] = arguments[i]; | 428 array[i+n] = arguments[i]; |
| 431 } | 429 } |
| 432 | 430 |
| 433 var new_length = n + m; | 431 var new_length = n + m; |
| 434 array.length = new_length; | 432 array.length = new_length; |
| 435 return new_length; | 433 return new_length; |
| 436 } | 434 } |
| 437 | 435 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); | 537 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); |
| 540 | 538 |
| 541 var array = TO_OBJECT(this); | 539 var array = TO_OBJECT(this); |
| 542 var len = TO_LENGTH(array.length); | 540 var len = TO_LENGTH(array.length); |
| 543 | 541 |
| 544 if (len === 0) { | 542 if (len === 0) { |
| 545 array.length = 0; | 543 array.length = 0; |
| 546 return; | 544 return; |
| 547 } | 545 } |
| 548 | 546 |
| 549 if (%object_is_sealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); | 547 if (%object_is_sealed(array)) throw %make_type_error(kArrayFunctionsOnSealed); |
| 550 | 548 |
| 551 var first = array[0]; | 549 var first = array[0]; |
| 552 | 550 |
| 553 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { | 551 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { |
| 554 SparseMove(array, 0, 1, len, 0); | 552 SparseMove(array, 0, 1, len, 0); |
| 555 } else { | 553 } else { |
| 556 SimpleMove(array, 0, 1, len, 0); | 554 SimpleMove(array, 0, 1, len, 0); |
| 557 } | 555 } |
| 558 | 556 |
| 559 array.length = len - 1; | 557 array.length = len - 1; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 var array = TO_OBJECT(this); | 664 var array = TO_OBJECT(this); |
| 667 var len = TO_LENGTH(array.length); | 665 var len = TO_LENGTH(array.length); |
| 668 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); | 666 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); |
| 669 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, | 667 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, |
| 670 start_i); | 668 start_i); |
| 671 var deleted_elements = ArraySpeciesCreate(array, del_count); | 669 var deleted_elements = ArraySpeciesCreate(array, del_count); |
| 672 deleted_elements.length = del_count; | 670 deleted_elements.length = del_count; |
| 673 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; | 671 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; |
| 674 | 672 |
| 675 if (del_count != num_elements_to_add && %object_is_sealed(array)) { | 673 if (del_count != num_elements_to_add && %object_is_sealed(array)) { |
| 676 throw MakeTypeError(kArrayFunctionsOnSealed); | 674 throw %make_type_error(kArrayFunctionsOnSealed); |
| 677 } else if (del_count > 0 && %object_is_frozen(array)) { | 675 } else if (del_count > 0 && %object_is_frozen(array)) { |
| 678 throw MakeTypeError(kArrayFunctionsOnFrozen); | 676 throw %make_type_error(kArrayFunctionsOnFrozen); |
| 679 } | 677 } |
| 680 | 678 |
| 681 var changed_elements = del_count; | 679 var changed_elements = del_count; |
| 682 if (num_elements_to_add != del_count) { | 680 if (num_elements_to_add != del_count) { |
| 683 // If the slice needs to do a actually move elements after the insertion | 681 // If the slice needs to do a actually move elements after the insertion |
| 684 // point, then include those in the estimate of changed elements. | 682 // point, then include those in the estimate of changed elements. |
| 685 changed_elements += len - start_i - del_count; | 683 changed_elements += len - start_i - del_count; |
| 686 } | 684 } |
| 687 if (UseSparseVariant(array, len, IS_ARRAY(array), changed_elements)) { | 685 if (UseSparseVariant(array, len, IS_ARRAY(array), changed_elements)) { |
| 688 %NormalizeElements(array); | 686 %NormalizeElements(array); |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 | 1022 |
| 1025 | 1023 |
| 1026 | 1024 |
| 1027 function ArrayFilter(f, receiver) { | 1025 function ArrayFilter(f, receiver) { |
| 1028 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); | 1026 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.filter"); |
| 1029 | 1027 |
| 1030 // Pull out the length so that modifications to the length in the | 1028 // Pull out the length so that modifications to the length in the |
| 1031 // loop will not affect the looping and side effects are visible. | 1029 // loop will not affect the looping and side effects are visible. |
| 1032 var array = TO_OBJECT(this); | 1030 var array = TO_OBJECT(this); |
| 1033 var length = TO_LENGTH(array.length); | 1031 var length = TO_LENGTH(array.length); |
| 1034 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); | 1032 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); |
| 1035 var result = ArraySpeciesCreate(array, 0); | 1033 var result = ArraySpeciesCreate(array, 0); |
| 1036 return InnerArrayFilter(f, receiver, array, length, result); | 1034 return InnerArrayFilter(f, receiver, array, length, result); |
| 1037 } | 1035 } |
| 1038 | 1036 |
| 1039 | 1037 |
| 1040 function InnerArrayForEach(f, receiver, array, length) { | 1038 function InnerArrayForEach(f, receiver, array, length) { |
| 1041 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); | 1039 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); |
| 1042 | 1040 |
| 1043 if (IS_UNDEFINED(receiver)) { | 1041 if (IS_UNDEFINED(receiver)) { |
| 1044 for (var i = 0; i < length; i++) { | 1042 for (var i = 0; i < length; i++) { |
| 1045 if (i in array) { | 1043 if (i in array) { |
| 1046 var element = array[i]; | 1044 var element = array[i]; |
| 1047 f(element, i, array); | 1045 f(element, i, array); |
| 1048 } | 1046 } |
| 1049 } | 1047 } |
| 1050 } else { | 1048 } else { |
| 1051 for (var i = 0; i < length; i++) { | 1049 for (var i = 0; i < length; i++) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1063 | 1061 |
| 1064 // Pull out the length so that modifications to the length in the | 1062 // Pull out the length so that modifications to the length in the |
| 1065 // loop will not affect the looping and side effects are visible. | 1063 // loop will not affect the looping and side effects are visible. |
| 1066 var array = TO_OBJECT(this); | 1064 var array = TO_OBJECT(this); |
| 1067 var length = TO_LENGTH(array.length); | 1065 var length = TO_LENGTH(array.length); |
| 1068 InnerArrayForEach(f, receiver, array, length); | 1066 InnerArrayForEach(f, receiver, array, length); |
| 1069 } | 1067 } |
| 1070 | 1068 |
| 1071 | 1069 |
| 1072 function InnerArraySome(f, receiver, array, length) { | 1070 function InnerArraySome(f, receiver, array, length) { |
| 1073 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); | 1071 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); |
| 1074 | 1072 |
| 1075 for (var i = 0; i < length; i++) { | 1073 for (var i = 0; i < length; i++) { |
| 1076 if (i in array) { | 1074 if (i in array) { |
| 1077 var element = array[i]; | 1075 var element = array[i]; |
| 1078 if (%_Call(f, receiver, element, i, array)) return true; | 1076 if (%_Call(f, receiver, element, i, array)) return true; |
| 1079 } | 1077 } |
| 1080 } | 1078 } |
| 1081 return false; | 1079 return false; |
| 1082 } | 1080 } |
| 1083 | 1081 |
| 1084 | 1082 |
| 1085 // Executes the function once for each element present in the | 1083 // Executes the function once for each element present in the |
| 1086 // array until it finds one where callback returns true. | 1084 // array until it finds one where callback returns true. |
| 1087 function ArraySome(f, receiver) { | 1085 function ArraySome(f, receiver) { |
| 1088 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); | 1086 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.some"); |
| 1089 | 1087 |
| 1090 // Pull out the length so that modifications to the length in the | 1088 // Pull out the length so that modifications to the length in the |
| 1091 // loop will not affect the looping and side effects are visible. | 1089 // loop will not affect the looping and side effects are visible. |
| 1092 var array = TO_OBJECT(this); | 1090 var array = TO_OBJECT(this); |
| 1093 var length = TO_LENGTH(array.length); | 1091 var length = TO_LENGTH(array.length); |
| 1094 return InnerArraySome(f, receiver, array, length); | 1092 return InnerArraySome(f, receiver, array, length); |
| 1095 } | 1093 } |
| 1096 | 1094 |
| 1097 | 1095 |
| 1098 function InnerArrayEvery(f, receiver, array, length) { | 1096 function InnerArrayEvery(f, receiver, array, length) { |
| 1099 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); | 1097 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); |
| 1100 | 1098 |
| 1101 for (var i = 0; i < length; i++) { | 1099 for (var i = 0; i < length; i++) { |
| 1102 if (i in array) { | 1100 if (i in array) { |
| 1103 var element = array[i]; | 1101 var element = array[i]; |
| 1104 if (!%_Call(f, receiver, element, i, array)) return false; | 1102 if (!%_Call(f, receiver, element, i, array)) return false; |
| 1105 } | 1103 } |
| 1106 } | 1104 } |
| 1107 return true; | 1105 return true; |
| 1108 } | 1106 } |
| 1109 | 1107 |
| 1110 function ArrayEvery(f, receiver) { | 1108 function ArrayEvery(f, receiver) { |
| 1111 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); | 1109 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.every"); |
| 1112 | 1110 |
| 1113 // Pull out the length so that modifications to the length in the | 1111 // Pull out the length so that modifications to the length in the |
| 1114 // loop will not affect the looping and side effects are visible. | 1112 // loop will not affect the looping and side effects are visible. |
| 1115 var array = TO_OBJECT(this); | 1113 var array = TO_OBJECT(this); |
| 1116 var length = TO_LENGTH(array.length); | 1114 var length = TO_LENGTH(array.length); |
| 1117 return InnerArrayEvery(f, receiver, array, length); | 1115 return InnerArrayEvery(f, receiver, array, length); |
| 1118 } | 1116 } |
| 1119 | 1117 |
| 1120 | 1118 |
| 1121 function ArrayMap(f, receiver) { | 1119 function ArrayMap(f, receiver) { |
| 1122 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); | 1120 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map"); |
| 1123 | 1121 |
| 1124 // Pull out the length so that modifications to the length in the | 1122 // Pull out the length so that modifications to the length in the |
| 1125 // loop will not affect the looping and side effects are visible. | 1123 // loop will not affect the looping and side effects are visible. |
| 1126 var array = TO_OBJECT(this); | 1124 var array = TO_OBJECT(this); |
| 1127 var length = TO_LENGTH(array.length); | 1125 var length = TO_LENGTH(array.length); |
| 1128 if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); | 1126 if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f); |
| 1129 var result = ArraySpeciesCreate(array, length); | 1127 var result = ArraySpeciesCreate(array, length); |
| 1130 for (var i = 0; i < length; i++) { | 1128 for (var i = 0; i < length; i++) { |
| 1131 if (i in array) { | 1129 if (i in array) { |
| 1132 var element = array[i]; | 1130 var element = array[i]; |
| 1133 %CreateDataProperty(result, i, %_Call(f, receiver, element, i, array)); | 1131 %CreateDataProperty(result, i, %_Call(f, receiver, element, i, array)); |
| 1134 } | 1132 } |
| 1135 } | 1133 } |
| 1136 return result; | 1134 return result; |
| 1137 } | 1135 } |
| 1138 | 1136 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); | 1255 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); |
| 1258 | 1256 |
| 1259 var length = TO_LENGTH(this.length); | 1257 var length = TO_LENGTH(this.length); |
| 1260 return InnerArrayLastIndexOf(this, element, index, length, | 1258 return InnerArrayLastIndexOf(this, element, index, length, |
| 1261 arguments.length); | 1259 arguments.length); |
| 1262 } | 1260 } |
| 1263 | 1261 |
| 1264 | 1262 |
| 1265 function InnerArrayReduce(callback, current, array, length, argumentsLength) { | 1263 function InnerArrayReduce(callback, current, array, length, argumentsLength) { |
| 1266 if (!IS_CALLABLE(callback)) { | 1264 if (!IS_CALLABLE(callback)) { |
| 1267 throw MakeTypeError(kCalledNonCallable, callback); | 1265 throw %make_type_error(kCalledNonCallable, callback); |
| 1268 } | 1266 } |
| 1269 | 1267 |
| 1270 var i = 0; | 1268 var i = 0; |
| 1271 find_initial: if (argumentsLength < 2) { | 1269 find_initial: if (argumentsLength < 2) { |
| 1272 for (; i < length; i++) { | 1270 for (; i < length; i++) { |
| 1273 if (i in array) { | 1271 if (i in array) { |
| 1274 current = array[i++]; | 1272 current = array[i++]; |
| 1275 break find_initial; | 1273 break find_initial; |
| 1276 } | 1274 } |
| 1277 } | 1275 } |
| 1278 throw MakeTypeError(kReduceNoInitial); | 1276 throw %make_type_error(kReduceNoInitial); |
| 1279 } | 1277 } |
| 1280 | 1278 |
| 1281 for (; i < length; i++) { | 1279 for (; i < length; i++) { |
| 1282 if (i in array) { | 1280 if (i in array) { |
| 1283 var element = array[i]; | 1281 var element = array[i]; |
| 1284 current = callback(current, element, i, array); | 1282 current = callback(current, element, i, array); |
| 1285 } | 1283 } |
| 1286 } | 1284 } |
| 1287 return current; | 1285 return current; |
| 1288 } | 1286 } |
| 1289 | 1287 |
| 1290 | 1288 |
| 1291 function ArrayReduce(callback, current) { | 1289 function ArrayReduce(callback, current) { |
| 1292 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); | 1290 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); |
| 1293 | 1291 |
| 1294 // Pull out the length so that modifications to the length in the | 1292 // Pull out the length so that modifications to the length in the |
| 1295 // loop will not affect the looping and side effects are visible. | 1293 // loop will not affect the looping and side effects are visible. |
| 1296 var array = TO_OBJECT(this); | 1294 var array = TO_OBJECT(this); |
| 1297 var length = TO_LENGTH(array.length); | 1295 var length = TO_LENGTH(array.length); |
| 1298 return InnerArrayReduce(callback, current, array, length, | 1296 return InnerArrayReduce(callback, current, array, length, |
| 1299 arguments.length); | 1297 arguments.length); |
| 1300 } | 1298 } |
| 1301 | 1299 |
| 1302 | 1300 |
| 1303 function InnerArrayReduceRight(callback, current, array, length, | 1301 function InnerArrayReduceRight(callback, current, array, length, |
| 1304 argumentsLength) { | 1302 argumentsLength) { |
| 1305 if (!IS_CALLABLE(callback)) { | 1303 if (!IS_CALLABLE(callback)) { |
| 1306 throw MakeTypeError(kCalledNonCallable, callback); | 1304 throw %make_type_error(kCalledNonCallable, callback); |
| 1307 } | 1305 } |
| 1308 | 1306 |
| 1309 var i = length - 1; | 1307 var i = length - 1; |
| 1310 find_initial: if (argumentsLength < 2) { | 1308 find_initial: if (argumentsLength < 2) { |
| 1311 for (; i >= 0; i--) { | 1309 for (; i >= 0; i--) { |
| 1312 if (i in array) { | 1310 if (i in array) { |
| 1313 current = array[i--]; | 1311 current = array[i--]; |
| 1314 break find_initial; | 1312 break find_initial; |
| 1315 } | 1313 } |
| 1316 } | 1314 } |
| 1317 throw MakeTypeError(kReduceNoInitial); | 1315 throw %make_type_error(kReduceNoInitial); |
| 1318 } | 1316 } |
| 1319 | 1317 |
| 1320 for (; i >= 0; i--) { | 1318 for (; i >= 0; i--) { |
| 1321 if (i in array) { | 1319 if (i in array) { |
| 1322 var element = array[i]; | 1320 var element = array[i]; |
| 1323 current = callback(current, element, i, array); | 1321 current = callback(current, element, i, array); |
| 1324 } | 1322 } |
| 1325 } | 1323 } |
| 1326 return current; | 1324 return current; |
| 1327 } | 1325 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1393 | 1391 |
| 1394 var array = TO_OBJECT(this); | 1392 var array = TO_OBJECT(this); |
| 1395 var length = TO_LENGTH(array.length); | 1393 var length = TO_LENGTH(array.length); |
| 1396 | 1394 |
| 1397 return InnerArrayCopyWithin(target, start, end, array, length); | 1395 return InnerArrayCopyWithin(target, start, end, array, length); |
| 1398 } | 1396 } |
| 1399 | 1397 |
| 1400 | 1398 |
| 1401 function InnerArrayFind(predicate, thisArg, array, length) { | 1399 function InnerArrayFind(predicate, thisArg, array, length) { |
| 1402 if (!IS_CALLABLE(predicate)) { | 1400 if (!IS_CALLABLE(predicate)) { |
| 1403 throw MakeTypeError(kCalledNonCallable, predicate); | 1401 throw %make_type_error(kCalledNonCallable, predicate); |
| 1404 } | 1402 } |
| 1405 | 1403 |
| 1406 for (var i = 0; i < length; i++) { | 1404 for (var i = 0; i < length; i++) { |
| 1407 var element = array[i]; | 1405 var element = array[i]; |
| 1408 if (%_Call(predicate, thisArg, element, i, array)) { | 1406 if (%_Call(predicate, thisArg, element, i, array)) { |
| 1409 return element; | 1407 return element; |
| 1410 } | 1408 } |
| 1411 } | 1409 } |
| 1412 | 1410 |
| 1413 return; | 1411 return; |
| 1414 } | 1412 } |
| 1415 | 1413 |
| 1416 | 1414 |
| 1417 // ES6 draft 07-15-13, section 15.4.3.23 | 1415 // ES6 draft 07-15-13, section 15.4.3.23 |
| 1418 function ArrayFind(predicate, thisArg) { | 1416 function ArrayFind(predicate, thisArg) { |
| 1419 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); | 1417 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.find"); |
| 1420 | 1418 |
| 1421 var array = TO_OBJECT(this); | 1419 var array = TO_OBJECT(this); |
| 1422 var length = TO_INTEGER(array.length); | 1420 var length = TO_INTEGER(array.length); |
| 1423 | 1421 |
| 1424 return InnerArrayFind(predicate, thisArg, array, length); | 1422 return InnerArrayFind(predicate, thisArg, array, length); |
| 1425 } | 1423 } |
| 1426 | 1424 |
| 1427 | 1425 |
| 1428 function InnerArrayFindIndex(predicate, thisArg, array, length) { | 1426 function InnerArrayFindIndex(predicate, thisArg, array, length) { |
| 1429 if (!IS_CALLABLE(predicate)) { | 1427 if (!IS_CALLABLE(predicate)) { |
| 1430 throw MakeTypeError(kCalledNonCallable, predicate); | 1428 throw %make_type_error(kCalledNonCallable, predicate); |
| 1431 } | 1429 } |
| 1432 | 1430 |
| 1433 for (var i = 0; i < length; i++) { | 1431 for (var i = 0; i < length; i++) { |
| 1434 var element = array[i]; | 1432 var element = array[i]; |
| 1435 if (%_Call(predicate, thisArg, element, i, array)) { | 1433 if (%_Call(predicate, thisArg, element, i, array)) { |
| 1436 return i; | 1434 return i; |
| 1437 } | 1435 } |
| 1438 } | 1436 } |
| 1439 | 1437 |
| 1440 return -1; | 1438 return -1; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1465 } | 1463 } |
| 1466 | 1464 |
| 1467 if (end < 0) { | 1465 if (end < 0) { |
| 1468 end += length; | 1466 end += length; |
| 1469 if (end < 0) end = 0; | 1467 if (end < 0) end = 0; |
| 1470 } else { | 1468 } else { |
| 1471 if (end > length) end = length; | 1469 if (end > length) end = length; |
| 1472 } | 1470 } |
| 1473 | 1471 |
| 1474 if ((end - i) > 0 && %object_is_frozen(array)) { | 1472 if ((end - i) > 0 && %object_is_frozen(array)) { |
| 1475 throw MakeTypeError(kArrayFunctionsOnFrozen); | 1473 throw %make_type_error(kArrayFunctionsOnFrozen); |
| 1476 } | 1474 } |
| 1477 | 1475 |
| 1478 for (; i < end; i++) | 1476 for (; i < end; i++) |
| 1479 array[i] = value; | 1477 array[i] = value; |
| 1480 return array; | 1478 return array; |
| 1481 } | 1479 } |
| 1482 | 1480 |
| 1483 | 1481 |
| 1484 // ES6, draft 04-05-14, section 22.1.3.6 | 1482 // ES6, draft 04-05-14, section 22.1.3.6 |
| 1485 function ArrayFill(value, start, end) { | 1483 function ArrayFill(value, start, end) { |
| 1486 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); | 1484 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.fill"); |
| 1487 | 1485 |
| 1488 var array = TO_OBJECT(this); | 1486 var array = TO_OBJECT(this); |
| 1489 var length = TO_LENGTH(array.length); | 1487 var length = TO_LENGTH(array.length); |
| 1490 | 1488 |
| 1491 return InnerArrayFill(value, start, end, array, length); | 1489 return InnerArrayFill(value, start, end, array, length); |
| 1492 } | 1490 } |
| 1493 | 1491 |
| 1494 | 1492 |
| 1495 // ES6, draft 10-14-14, section 22.1.2.1 | 1493 // ES6, draft 10-14-14, section 22.1.2.1 |
| 1496 function ArrayFrom(arrayLike, mapfn, receiver) { | 1494 function ArrayFrom(arrayLike, mapfn, receiver) { |
| 1497 var items = TO_OBJECT(arrayLike); | 1495 var items = TO_OBJECT(arrayLike); |
| 1498 var mapping = !IS_UNDEFINED(mapfn); | 1496 var mapping = !IS_UNDEFINED(mapfn); |
| 1499 | 1497 |
| 1500 if (mapping) { | 1498 if (mapping) { |
| 1501 if (!IS_CALLABLE(mapfn)) { | 1499 if (!IS_CALLABLE(mapfn)) { |
| 1502 throw MakeTypeError(kCalledNonCallable, mapfn); | 1500 throw %make_type_error(kCalledNonCallable, mapfn); |
| 1503 } | 1501 } |
| 1504 } | 1502 } |
| 1505 | 1503 |
| 1506 var iterable = GetMethod(items, iteratorSymbol); | 1504 var iterable = GetMethod(items, iteratorSymbol); |
| 1507 var k; | 1505 var k; |
| 1508 var result; | 1506 var result; |
| 1509 var mappedValue; | 1507 var mappedValue; |
| 1510 var nextValue; | 1508 var nextValue; |
| 1511 | 1509 |
| 1512 if (!IS_UNDEFINED(iterable)) { | 1510 if (!IS_UNDEFINED(iterable)) { |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1704 %InstallToContext([ | 1702 %InstallToContext([ |
| 1705 "array_pop", ArrayPop, | 1703 "array_pop", ArrayPop, |
| 1706 "array_push", ArrayPush, | 1704 "array_push", ArrayPush, |
| 1707 "array_shift", ArrayShift, | 1705 "array_shift", ArrayShift, |
| 1708 "array_splice", ArraySplice, | 1706 "array_splice", ArraySplice, |
| 1709 "array_slice", ArraySlice, | 1707 "array_slice", ArraySlice, |
| 1710 "array_unshift", ArrayUnshift, | 1708 "array_unshift", ArrayUnshift, |
| 1711 ]); | 1709 ]); |
| 1712 | 1710 |
| 1713 }); | 1711 }); |
| OLD | NEW |