| 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 $arrayPush; | 7 var $arrayPush; |
| 7 var $arrayPop; | 8 var $arrayPop; |
| 8 var $arrayShift; | 9 var $arrayShift; |
| 9 var $arraySlice; | 10 var $arraySlice; |
| 10 var $arraySplice; | 11 var $arraySplice; |
| 11 var $arrayUnshift; | 12 var $arrayUnshift; |
| 13 var $innerArrayForEach; |
| 14 var $innerArrayEvery; |
| 15 var $innerArrayFilter; |
| 16 var $innerArrayIndexOf; |
| 17 var $innerArrayLastIndexOf; |
| 18 var $innerArrayMap; |
| 19 var $innerArrayReverse; |
| 20 var $innerArraySome; |
| 21 var $innerArraySort; |
| 12 | 22 |
| 13 (function(global, utils) { | 23 (function(global, utils) { |
| 14 | 24 |
| 15 "use strict"; | 25 "use strict"; |
| 16 | 26 |
| 17 %CheckIsBootstrapping(); | 27 %CheckIsBootstrapping(); |
| 18 | 28 |
| 19 // ------------------------------------------------------------------- | 29 // ------------------------------------------------------------------- |
| 20 // Imports | 30 // Imports |
| 21 | 31 |
| 22 var GlobalArray = global.Array; | 32 var GlobalArray = global.Array; |
| 23 var InternalArray = utils.InternalArray; | 33 var InternalArray = utils.InternalArray; |
| 24 var InternalPackedArray = utils.InternalPackedArray; | 34 var InternalPackedArray = utils.InternalPackedArray; |
| 25 | 35 |
| 26 var Delete; | |
| 27 var MathMin; | 36 var MathMin; |
| 28 var ObjectHasOwnProperty; | |
| 29 var ObjectIsFrozen; | |
| 30 var ObjectIsSealed; | |
| 31 var ObjectToString; | |
| 32 | 37 |
| 33 utils.Import(function(from) { | 38 utils.Import(function(from) { |
| 34 Delete = from.Delete; | |
| 35 MathMin = from.MathMin; | 39 MathMin = from.MathMin; |
| 36 ObjectHasOwnProperty = from.ObjectHasOwnProperty; | |
| 37 ObjectIsFrozen = from.ObjectIsFrozen; | |
| 38 ObjectIsSealed = from.ObjectIsSealed; | |
| 39 ObjectToString = from.ObjectToString; | |
| 40 }); | 40 }); |
| 41 | 41 |
| 42 // ------------------------------------------------------------------- | 42 // ------------------------------------------------------------------- |
| 43 | 43 |
| 44 // Global list of arrays visited during toString, toLocaleString and | 44 // Global list of arrays visited during toString, toLocaleString and |
| 45 // join invocations. | 45 // join invocations. |
| 46 var visited_arrays = new InternalArray(); | 46 var visited_arrays = new InternalArray(); |
| 47 | 47 |
| 48 | 48 |
| 49 // Gets a sorted array of array keys. Useful for operations on sparse | 49 // Gets a sorted array of array keys. Useful for operations on sparse |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 func = this.join; | 385 func = this.join; |
| 386 if (func === ArrayJoin) { | 386 if (func === ArrayJoin) { |
| 387 return Join(this, this.length, ',', ConvertToString); | 387 return Join(this, this.length, ',', ConvertToString); |
| 388 } | 388 } |
| 389 array = this; | 389 array = this; |
| 390 } else { | 390 } else { |
| 391 array = $toObject(this); | 391 array = $toObject(this); |
| 392 func = array.join; | 392 func = array.join; |
| 393 } | 393 } |
| 394 if (!IS_SPEC_FUNCTION(func)) { | 394 if (!IS_SPEC_FUNCTION(func)) { |
| 395 return %_CallFunction(array, ObjectToString); | 395 return %_CallFunction(array, $objectToString); |
| 396 } | 396 } |
| 397 return %_CallFunction(array, func); | 397 return %_CallFunction(array, func); |
| 398 } | 398 } |
| 399 | 399 |
| 400 | 400 |
| 401 function ArrayToLocaleString() { | 401 function ArrayToLocaleString() { |
| 402 var array = $toObject(this); | 402 var array = $toObject(this); |
| 403 var arrayLen = array.length; | 403 var arrayLen = array.length; |
| 404 var len = TO_UINT32(arrayLen); | 404 var len = TO_UINT32(arrayLen); |
| 405 if (len === 0) return ""; | 405 if (len === 0) return ""; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 if (n == 0) { | 460 if (n == 0) { |
| 461 array.length = n; | 461 array.length = n; |
| 462 return; | 462 return; |
| 463 } | 463 } |
| 464 | 464 |
| 465 if (%IsObserved(array)) | 465 if (%IsObserved(array)) |
| 466 return ObservedArrayPop.call(array, n); | 466 return ObservedArrayPop.call(array, n); |
| 467 | 467 |
| 468 n--; | 468 n--; |
| 469 var value = array[n]; | 469 var value = array[n]; |
| 470 Delete(array, $toName(n), true); | 470 $delete(array, $toName(n), true); |
| 471 array.length = n; | 471 array.length = n; |
| 472 return value; | 472 return value; |
| 473 } | 473 } |
| 474 | 474 |
| 475 | 475 |
| 476 function ObservedArrayPush() { | 476 function ObservedArrayPush() { |
| 477 var n = TO_UINT32(this.length); | 477 var n = TO_UINT32(this.length); |
| 478 var m = %_ArgumentsLength(); | 478 var m = %_ArgumentsLength(); |
| 479 | 479 |
| 480 try { | 480 try { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); | 638 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.shift"); |
| 639 | 639 |
| 640 var array = TO_OBJECT_INLINE(this); | 640 var array = TO_OBJECT_INLINE(this); |
| 641 var len = TO_UINT32(array.length); | 641 var len = TO_UINT32(array.length); |
| 642 | 642 |
| 643 if (len === 0) { | 643 if (len === 0) { |
| 644 array.length = 0; | 644 array.length = 0; |
| 645 return; | 645 return; |
| 646 } | 646 } |
| 647 | 647 |
| 648 if (ObjectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); | 648 if ($objectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); |
| 649 | 649 |
| 650 if (%IsObserved(array)) | 650 if (%IsObserved(array)) |
| 651 return ObservedArrayShift.call(array, len); | 651 return ObservedArrayShift.call(array, len); |
| 652 | 652 |
| 653 var first = array[0]; | 653 var first = array[0]; |
| 654 | 654 |
| 655 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { | 655 if (UseSparseVariant(array, len, IS_ARRAY(array), len)) { |
| 656 SparseMove(array, 0, 1, len, 0); | 656 SparseMove(array, 0, 1, len, 0); |
| 657 } else { | 657 } else { |
| 658 SimpleMove(array, 0, 1, len, 0); | 658 SimpleMove(array, 0, 1, len, 0); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 689 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); | 689 CHECK_OBJECT_COERCIBLE(this, "Array.prototype.unshift"); |
| 690 | 690 |
| 691 if (%IsObserved(this)) | 691 if (%IsObserved(this)) |
| 692 return ObservedArrayUnshift.apply(this, arguments); | 692 return ObservedArrayUnshift.apply(this, arguments); |
| 693 | 693 |
| 694 var array = TO_OBJECT_INLINE(this); | 694 var array = TO_OBJECT_INLINE(this); |
| 695 var len = TO_UINT32(array.length); | 695 var len = TO_UINT32(array.length); |
| 696 var num_arguments = %_ArgumentsLength(); | 696 var num_arguments = %_ArgumentsLength(); |
| 697 | 697 |
| 698 if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) && | 698 if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) && |
| 699 !ObjectIsSealed(array)) { | 699 !$objectIsSealed(array)) { |
| 700 SparseMove(array, 0, 0, len, num_arguments); | 700 SparseMove(array, 0, 0, len, num_arguments); |
| 701 } else { | 701 } else { |
| 702 SimpleMove(array, 0, 0, len, num_arguments); | 702 SimpleMove(array, 0, 0, len, num_arguments); |
| 703 } | 703 } |
| 704 | 704 |
| 705 for (var i = 0; i < num_arguments; i++) { | 705 for (var i = 0; i < num_arguments; i++) { |
| 706 array[i] = %_Arguments(i); | 706 array[i] = %_Arguments(i); |
| 707 } | 707 } |
| 708 | 708 |
| 709 var new_length = len + num_arguments; | 709 var new_length = len + num_arguments; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 var num_arguments = %_ArgumentsLength(); | 835 var num_arguments = %_ArgumentsLength(); |
| 836 var array = TO_OBJECT_INLINE(this); | 836 var array = TO_OBJECT_INLINE(this); |
| 837 var len = TO_UINT32(array.length); | 837 var len = TO_UINT32(array.length); |
| 838 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); | 838 var start_i = ComputeSpliceStartIndex(TO_INTEGER(start), len); |
| 839 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, | 839 var del_count = ComputeSpliceDeleteCount(delete_count, num_arguments, len, |
| 840 start_i); | 840 start_i); |
| 841 var deleted_elements = []; | 841 var deleted_elements = []; |
| 842 deleted_elements.length = del_count; | 842 deleted_elements.length = del_count; |
| 843 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; | 843 var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; |
| 844 | 844 |
| 845 if (del_count != num_elements_to_add && ObjectIsSealed(array)) { | 845 if (del_count != num_elements_to_add && $objectIsSealed(array)) { |
| 846 throw MakeTypeError(kArrayFunctionsOnSealed); | 846 throw MakeTypeError(kArrayFunctionsOnSealed); |
| 847 } else if (del_count > 0 && ObjectIsFrozen(array)) { | 847 } else if (del_count > 0 && $objectIsFrozen(array)) { |
| 848 throw MakeTypeError(kArrayFunctionsOnFrozen); | 848 throw MakeTypeError(kArrayFunctionsOnFrozen); |
| 849 } | 849 } |
| 850 | 850 |
| 851 var changed_elements = del_count; | 851 var changed_elements = del_count; |
| 852 if (num_elements_to_add != del_count) { | 852 if (num_elements_to_add != del_count) { |
| 853 // If the slice needs to do a actually move elements after the insertion | 853 // If the slice needs to do a actually move elements after the insertion |
| 854 // point, then include those in the estimate of changed elements. | 854 // point, then include those in the estimate of changed elements. |
| 855 changed_elements += len - start_i - del_count; | 855 changed_elements += len - start_i - del_count; |
| 856 } | 856 } |
| 857 if (UseSparseVariant(array, len, IS_ARRAY(array), changed_elements)) { | 857 if (UseSparseVariant(array, len, IS_ARRAY(array), changed_elements)) { |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1575 fill: true, | 1575 fill: true, |
| 1576 find: true, | 1576 find: true, |
| 1577 findIndex: true, | 1577 findIndex: true, |
| 1578 keys: true, | 1578 keys: true, |
| 1579 }; | 1579 }; |
| 1580 | 1580 |
| 1581 %AddNamedProperty(GlobalArray.prototype, symbolUnscopables, unscopables, | 1581 %AddNamedProperty(GlobalArray.prototype, symbolUnscopables, unscopables, |
| 1582 DONT_ENUM | READ_ONLY); | 1582 DONT_ENUM | READ_ONLY); |
| 1583 | 1583 |
| 1584 // Set up non-enumerable functions on the Array object. | 1584 // Set up non-enumerable functions on the Array object. |
| 1585 utils.InstallFunctions(GlobalArray, DONT_ENUM, [ | 1585 $installFunctions(GlobalArray, DONT_ENUM, [ |
| 1586 "isArray", ArrayIsArray | 1586 "isArray", ArrayIsArray |
| 1587 ]); | 1587 ]); |
| 1588 | 1588 |
| 1589 var specialFunctions = %SpecialArrayFunctions(); | 1589 var specialFunctions = %SpecialArrayFunctions(); |
| 1590 | 1590 |
| 1591 var getFunction = function(name, jsBuiltin, len) { | 1591 var getFunction = function(name, jsBuiltin, len) { |
| 1592 var f = jsBuiltin; | 1592 var f = jsBuiltin; |
| 1593 if (specialFunctions.hasOwnProperty(name)) { | 1593 if (specialFunctions.hasOwnProperty(name)) { |
| 1594 f = specialFunctions[name]; | 1594 f = specialFunctions[name]; |
| 1595 } | 1595 } |
| 1596 if (!IS_UNDEFINED(len)) { | 1596 if (!IS_UNDEFINED(len)) { |
| 1597 %FunctionSetLength(f, len); | 1597 %FunctionSetLength(f, len); |
| 1598 } | 1598 } |
| 1599 return f; | 1599 return f; |
| 1600 }; | 1600 }; |
| 1601 | 1601 |
| 1602 // Set up non-enumerable functions of the Array.prototype object and | 1602 // Set up non-enumerable functions of the Array.prototype object and |
| 1603 // set their names. | 1603 // set their names. |
| 1604 // Manipulate the length of some of the functions to meet | 1604 // Manipulate the length of some of the functions to meet |
| 1605 // expectations set by ECMA-262 or Mozilla. | 1605 // expectations set by ECMA-262 or Mozilla. |
| 1606 utils.InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ | 1606 $installFunctions(GlobalArray.prototype, DONT_ENUM, [ |
| 1607 "toString", getFunction("toString", ArrayToString), | 1607 "toString", getFunction("toString", ArrayToString), |
| 1608 "toLocaleString", getFunction("toLocaleString", ArrayToLocaleString), | 1608 "toLocaleString", getFunction("toLocaleString", ArrayToLocaleString), |
| 1609 "join", getFunction("join", ArrayJoin), | 1609 "join", getFunction("join", ArrayJoin), |
| 1610 "pop", getFunction("pop", ArrayPop), | 1610 "pop", getFunction("pop", ArrayPop), |
| 1611 "push", getFunction("push", ArrayPush, 1), | 1611 "push", getFunction("push", ArrayPush, 1), |
| 1612 "concat", getFunction("concat", ArrayConcatJS, 1), | 1612 "concat", getFunction("concat", ArrayConcatJS, 1), |
| 1613 "reverse", getFunction("reverse", ArrayReverse), | 1613 "reverse", getFunction("reverse", ArrayReverse), |
| 1614 "shift", getFunction("shift", ArrayShift), | 1614 "shift", getFunction("shift", ArrayShift), |
| 1615 "unshift", getFunction("unshift", ArrayUnshift, 1), | 1615 "unshift", getFunction("unshift", ArrayUnshift, 1), |
| 1616 "slice", getFunction("slice", ArraySlice, 2), | 1616 "slice", getFunction("slice", ArraySlice, 2), |
| 1617 "splice", getFunction("splice", ArraySplice, 2), | 1617 "splice", getFunction("splice", ArraySplice, 2), |
| 1618 "sort", getFunction("sort", ArraySort), | 1618 "sort", getFunction("sort", ArraySort), |
| 1619 "filter", getFunction("filter", ArrayFilter, 1), | 1619 "filter", getFunction("filter", ArrayFilter, 1), |
| 1620 "forEach", getFunction("forEach", ArrayForEach, 1), | 1620 "forEach", getFunction("forEach", ArrayForEach, 1), |
| 1621 "some", getFunction("some", ArraySome, 1), | 1621 "some", getFunction("some", ArraySome, 1), |
| 1622 "every", getFunction("every", ArrayEvery, 1), | 1622 "every", getFunction("every", ArrayEvery, 1), |
| 1623 "map", getFunction("map", ArrayMap, 1), | 1623 "map", getFunction("map", ArrayMap, 1), |
| 1624 "indexOf", getFunction("indexOf", ArrayIndexOf, 1), | 1624 "indexOf", getFunction("indexOf", ArrayIndexOf, 1), |
| 1625 "lastIndexOf", getFunction("lastIndexOf", ArrayLastIndexOf, 1), | 1625 "lastIndexOf", getFunction("lastIndexOf", ArrayLastIndexOf, 1), |
| 1626 "reduce", getFunction("reduce", ArrayReduce, 1), | 1626 "reduce", getFunction("reduce", ArrayReduce, 1), |
| 1627 "reduceRight", getFunction("reduceRight", ArrayReduceRight, 1) | 1627 "reduceRight", getFunction("reduceRight", ArrayReduceRight, 1) |
| 1628 ]); | 1628 ]); |
| 1629 | 1629 |
| 1630 %FinishArrayPrototypeSetup(GlobalArray.prototype); | 1630 %FinishArrayPrototypeSetup(GlobalArray.prototype); |
| 1631 | 1631 |
| 1632 // The internal Array prototype doesn't need to be fancy, since it's never | 1632 // The internal Array prototype doesn't need to be fancy, since it's never |
| 1633 // exposed to user code. | 1633 // exposed to user code. |
| 1634 // Adding only the functions that are actually used. | 1634 // Adding only the functions that are actually used. |
| 1635 utils.SetUpLockedPrototype(InternalArray, GlobalArray(), [ | 1635 $setUpLockedPrototype(InternalArray, GlobalArray(), [ |
| 1636 "concat", getFunction("concat", ArrayConcatJS), | 1636 "concat", getFunction("concat", ArrayConcatJS), |
| 1637 "indexOf", getFunction("indexOf", ArrayIndexOf), | 1637 "indexOf", getFunction("indexOf", ArrayIndexOf), |
| 1638 "join", getFunction("join", ArrayJoin), | 1638 "join", getFunction("join", ArrayJoin), |
| 1639 "pop", getFunction("pop", ArrayPop), | 1639 "pop", getFunction("pop", ArrayPop), |
| 1640 "push", getFunction("push", ArrayPush), | 1640 "push", getFunction("push", ArrayPush), |
| 1641 "shift", getFunction("shift", ArrayShift), | 1641 "shift", getFunction("shift", ArrayShift), |
| 1642 "splice", getFunction("splice", ArraySplice) | 1642 "splice", getFunction("splice", ArraySplice) |
| 1643 ]); | 1643 ]); |
| 1644 | 1644 |
| 1645 utils.SetUpLockedPrototype(InternalPackedArray, GlobalArray(), [ | 1645 $setUpLockedPrototype(InternalPackedArray, GlobalArray(), [ |
| 1646 "join", getFunction("join", ArrayJoin), | 1646 "join", getFunction("join", ArrayJoin), |
| 1647 "pop", getFunction("pop", ArrayPop), | 1647 "pop", getFunction("pop", ArrayPop), |
| 1648 "push", getFunction("push", ArrayPush), | 1648 "push", getFunction("push", ArrayPush), |
| 1649 "shift", getFunction("shift", ArrayShift) | 1649 "shift", getFunction("shift", ArrayShift) |
| 1650 ]); | 1650 ]); |
| 1651 | 1651 |
| 1652 // ------------------------------------------------------------------- | |
| 1653 // Exports | |
| 1654 | |
| 1655 utils.Export(function(to) { | |
| 1656 to.ArrayJoin = ArrayJoin; | |
| 1657 to.InnerArrayEvery = InnerArrayEvery; | |
| 1658 to.InnerArrayFilter = InnerArrayFilter; | |
| 1659 to.InnerArrayForEach = InnerArrayForEach; | |
| 1660 to.InnerArrayIndexOf = InnerArrayIndexOf; | |
| 1661 to.InnerArrayLastIndexOf = InnerArrayLastIndexOf; | |
| 1662 to.InnerArrayMap = InnerArrayMap; | |
| 1663 to.InnerArrayReverse = InnerArrayReverse; | |
| 1664 to.InnerArraySome = InnerArraySome; | |
| 1665 to.InnerArraySort = InnerArraySort; | |
| 1666 }); | |
| 1667 | |
| 1668 $arrayConcat = ArrayConcatJS; | 1652 $arrayConcat = ArrayConcatJS; |
| 1653 $arrayJoin = ArrayJoin; |
| 1669 $arrayPush = ArrayPush; | 1654 $arrayPush = ArrayPush; |
| 1670 $arrayPop = ArrayPop; | 1655 $arrayPop = ArrayPop; |
| 1671 $arrayShift = ArrayShift; | 1656 $arrayShift = ArrayShift; |
| 1672 $arraySlice = ArraySlice; | 1657 $arraySlice = ArraySlice; |
| 1673 $arraySplice = ArraySplice; | 1658 $arraySplice = ArraySplice; |
| 1674 $arrayUnshift = ArrayUnshift; | 1659 $arrayUnshift = ArrayUnshift; |
| 1675 | 1660 |
| 1661 $innerArrayEvery = InnerArrayEvery; |
| 1662 $innerArrayFilter = InnerArrayFilter; |
| 1663 $innerArrayForEach = InnerArrayForEach; |
| 1664 $innerArrayIndexOf = InnerArrayIndexOf; |
| 1665 $innerArrayLastIndexOf = InnerArrayLastIndexOf; |
| 1666 $innerArrayMap = InnerArrayMap; |
| 1667 $innerArrayReverse = InnerArrayReverse; |
| 1668 $innerArraySome = InnerArraySome; |
| 1669 $innerArraySort = InnerArraySort; |
| 1670 |
| 1676 }); | 1671 }); |
| OLD | NEW |