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 var $arrayConcat; | 5 var $arrayConcat; |
6 var $arrayJoin; | 6 var $arrayJoin; |
7 var $arrayPush; | 7 var $arrayPush; |
8 var $arrayPop; | 8 var $arrayPop; |
9 var $arrayShift; | 9 var $arrayShift; |
10 var $arraySlice; | 10 var $arraySlice; |
11 var $arraySplice; | 11 var $arraySplice; |
12 var $arrayUnshift; | 12 var $arrayUnshift; |
13 var $innerArrayForEach; | 13 var $innerArrayForEach; |
14 var $innerArrayEvery; | 14 var $innerArrayEvery; |
| 15 var $innerArrayIndexOf; |
| 16 var $innerArrayLastIndexOf; |
15 var $innerArrayReverse; | 17 var $innerArrayReverse; |
16 var $innerArraySort; | 18 var $innerArraySort; |
17 | 19 |
18 (function(global, shared, exports) { | 20 (function(global, shared, exports) { |
19 | 21 |
20 "use strict"; | 22 "use strict"; |
21 | 23 |
22 %CheckIsBootstrapping(); | 24 %CheckIsBootstrapping(); |
23 | 25 |
24 // ------------------------------------------------------------------- | 26 // ------------------------------------------------------------------- |
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 if (stepping) %DebugPrepareStepInIfStepping(f); | 1327 if (stepping) %DebugPrepareStepInIfStepping(f); |
1326 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; | 1328 var new_receiver = needs_wrapper ? $toObject(receiver) : receiver; |
1327 accumulator[i] = %_CallFunction(new_receiver, element, i, array, f); | 1329 accumulator[i] = %_CallFunction(new_receiver, element, i, array, f); |
1328 } | 1330 } |
1329 } | 1331 } |
1330 %MoveArrayContents(accumulator, result); | 1332 %MoveArrayContents(accumulator, result); |
1331 return result; | 1333 return result; |
1332 } | 1334 } |
1333 | 1335 |
1334 | 1336 |
1335 function ArrayIndexOf(element, index) { | 1337 // For .indexOf, we don't need to pass in the number of arguments |
1336 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); | 1338 // at the callsite since ToInteger(undefined) == 0; however, for |
1337 | 1339 // .lastIndexOf, we need to pass it, since the behavior for passing |
1338 var length = TO_UINT32(this.length); | 1340 // undefined is 0 but for not including the argument is length-1. |
| 1341 function InnerArrayIndexOf(element, index, length) { |
1339 if (length == 0) return -1; | 1342 if (length == 0) return -1; |
1340 if (IS_UNDEFINED(index)) { | 1343 if (IS_UNDEFINED(index)) { |
1341 index = 0; | 1344 index = 0; |
1342 } else { | 1345 } else { |
1343 index = TO_INTEGER(index); | 1346 index = TO_INTEGER(index); |
1344 // If index is negative, index from the end of the array. | 1347 // If index is negative, index from the end of the array. |
1345 if (index < 0) { | 1348 if (index < 0) { |
1346 index = length + index; | 1349 index = length + index; |
1347 // If index is still negative, search the entire array. | 1350 // If index is still negative, search the entire array. |
1348 if (index < 0) index = 0; | 1351 if (index < 0) index = 0; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 // Lookup through the array. | 1385 // Lookup through the array. |
1383 for (var i = min; i < max; i++) { | 1386 for (var i = min; i < max; i++) { |
1384 if (IS_UNDEFINED(this[i]) && i in this) { | 1387 if (IS_UNDEFINED(this[i]) && i in this) { |
1385 return i; | 1388 return i; |
1386 } | 1389 } |
1387 } | 1390 } |
1388 return -1; | 1391 return -1; |
1389 } | 1392 } |
1390 | 1393 |
1391 | 1394 |
1392 function ArrayLastIndexOf(element, index) { | 1395 function ArrayIndexOf(element, index) { |
1393 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); | 1396 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.indexOf"); |
1394 | 1397 |
1395 var length = TO_UINT32(this.length); | 1398 var length = TO_UINT32(this.length); |
| 1399 return %_CallFunction(this, element, index, length, InnerArrayIndexOf); |
| 1400 } |
| 1401 |
| 1402 |
| 1403 function InnerArrayLastIndexOf(element, index, length, argumentsLength) { |
1396 if (length == 0) return -1; | 1404 if (length == 0) return -1; |
1397 if (%_ArgumentsLength() < 2) { | 1405 if (argumentsLength < 2) { |
1398 index = length - 1; | 1406 index = length - 1; |
1399 } else { | 1407 } else { |
1400 index = TO_INTEGER(index); | 1408 index = TO_INTEGER(index); |
1401 // If index is negative, index from end of the array. | 1409 // If index is negative, index from end of the array. |
1402 if (index < 0) index += length; | 1410 if (index < 0) index += length; |
1403 // If index is still negative, do not search the array. | 1411 // If index is still negative, do not search the array. |
1404 if (index < 0) return -1; | 1412 if (index < 0) return -1; |
1405 else if (index >= length) index = length - 1; | 1413 else if (index >= length) index = length - 1; |
1406 } | 1414 } |
1407 var min = 0; | 1415 var min = 0; |
(...skipping 27 matching lines...) Expand all Loading... |
1435 } | 1443 } |
1436 for (var i = max; i >= min; i--) { | 1444 for (var i = max; i >= min; i--) { |
1437 if (IS_UNDEFINED(this[i]) && i in this) { | 1445 if (IS_UNDEFINED(this[i]) && i in this) { |
1438 return i; | 1446 return i; |
1439 } | 1447 } |
1440 } | 1448 } |
1441 return -1; | 1449 return -1; |
1442 } | 1450 } |
1443 | 1451 |
1444 | 1452 |
| 1453 function ArrayLastIndexOf(element, index) { |
| 1454 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.lastIndexOf"); |
| 1455 |
| 1456 var length = TO_UINT32(this.length); |
| 1457 return %_CallFunction(this, element, index, length, |
| 1458 %_ArgumentsLength(), InnerArrayLastIndexOf); |
| 1459 } |
| 1460 |
| 1461 |
1445 function ArrayReduce(callback, current) { | 1462 function ArrayReduce(callback, current) { |
1446 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); | 1463 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.reduce"); |
1447 | 1464 |
1448 // Pull out the length so that modifications to the length in the | 1465 // Pull out the length so that modifications to the length in the |
1449 // loop will not affect the looping and side effects are visible. | 1466 // loop will not affect the looping and side effects are visible. |
1450 var array = $toObject(this); | 1467 var array = $toObject(this); |
1451 var length = $toUint32(array.length); | 1468 var length = $toUint32(array.length); |
1452 | 1469 |
1453 if (!IS_SPEC_FUNCTION(callback)) { | 1470 if (!IS_SPEC_FUNCTION(callback)) { |
1454 throw MakeTypeError(kCalledNonCallable, callback); | 1471 throw MakeTypeError(kCalledNonCallable, callback); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 $arrayJoin = ArrayJoin; | 1631 $arrayJoin = ArrayJoin; |
1615 $arrayPush = ArrayPush; | 1632 $arrayPush = ArrayPush; |
1616 $arrayPop = ArrayPop; | 1633 $arrayPop = ArrayPop; |
1617 $arrayShift = ArrayShift; | 1634 $arrayShift = ArrayShift; |
1618 $arraySlice = ArraySlice; | 1635 $arraySlice = ArraySlice; |
1619 $arraySplice = ArraySplice; | 1636 $arraySplice = ArraySplice; |
1620 $arrayUnshift = ArrayUnshift; | 1637 $arrayUnshift = ArrayUnshift; |
1621 | 1638 |
1622 $innerArrayForEach = InnerArrayForEach; | 1639 $innerArrayForEach = InnerArrayForEach; |
1623 $innerArrayEvery = InnerArrayEvery; | 1640 $innerArrayEvery = InnerArrayEvery; |
| 1641 $innerArrayIndexOf = InnerArrayIndexOf; |
| 1642 $innerArrayLastIndexOf = InnerArrayLastIndexOf; |
1624 $innerArrayReverse = InnerArrayReverse; | 1643 $innerArrayReverse = InnerArrayReverse; |
1625 $innerArraySort = InnerArraySort; | 1644 $innerArraySort = InnerArraySort; |
1626 | 1645 |
1627 }); | 1646 }); |
OLD | NEW |