| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 BYTE_ARRAY_TYPE, | 526 BYTE_ARRAY_TYPE, |
| 527 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE | 527 EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE |
| 528 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, | 528 EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
| 529 EXTERNAL_SHORT_ARRAY_TYPE, | 529 EXTERNAL_SHORT_ARRAY_TYPE, |
| 530 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, | 530 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
| 531 EXTERNAL_INT_ARRAY_TYPE, | 531 EXTERNAL_INT_ARRAY_TYPE, |
| 532 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, | 532 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
| 533 EXTERNAL_FLOAT_ARRAY_TYPE, | 533 EXTERNAL_FLOAT_ARRAY_TYPE, |
| 534 EXTERNAL_DOUBLE_ARRAY_TYPE, | 534 EXTERNAL_DOUBLE_ARRAY_TYPE, |
| 535 EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE | 535 EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE |
| 536 FIXED_DOUBLE_ARRAY_TYPE, |
| 536 FILLER_TYPE, // LAST_DATA_TYPE | 537 FILLER_TYPE, // LAST_DATA_TYPE |
| 537 | 538 |
| 538 // Structs. | 539 // Structs. |
| 539 ACCESSOR_INFO_TYPE, | 540 ACCESSOR_INFO_TYPE, |
| 540 ACCESS_CHECK_INFO_TYPE, | 541 ACCESS_CHECK_INFO_TYPE, |
| 541 INTERCEPTOR_INFO_TYPE, | 542 INTERCEPTOR_INFO_TYPE, |
| 542 CALL_HANDLER_INFO_TYPE, | 543 CALL_HANDLER_INFO_TYPE, |
| 543 FUNCTION_TEMPLATE_INFO_TYPE, | 544 FUNCTION_TEMPLATE_INFO_TYPE, |
| 544 OBJECT_TEMPLATE_INFO_TYPE, | 545 OBJECT_TEMPLATE_INFO_TYPE, |
| 545 SIGNATURE_INFO_TYPE, | 546 SIGNATURE_INFO_TYPE, |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 V(ExternalPixelArray) \ | 726 V(ExternalPixelArray) \ |
| 726 V(ByteArray) \ | 727 V(ByteArray) \ |
| 727 V(JSReceiver) \ | 728 V(JSReceiver) \ |
| 728 V(JSObject) \ | 729 V(JSObject) \ |
| 729 V(JSContextExtensionObject) \ | 730 V(JSContextExtensionObject) \ |
| 730 V(Map) \ | 731 V(Map) \ |
| 731 V(DescriptorArray) \ | 732 V(DescriptorArray) \ |
| 732 V(DeoptimizationInputData) \ | 733 V(DeoptimizationInputData) \ |
| 733 V(DeoptimizationOutputData) \ | 734 V(DeoptimizationOutputData) \ |
| 734 V(FixedArray) \ | 735 V(FixedArray) \ |
| 736 V(FixedDoubleArray) \ |
| 735 V(Context) \ | 737 V(Context) \ |
| 736 V(CatchContext) \ | 738 V(CatchContext) \ |
| 737 V(GlobalContext) \ | 739 V(GlobalContext) \ |
| 738 V(JSFunction) \ | 740 V(JSFunction) \ |
| 739 V(Code) \ | 741 V(Code) \ |
| 740 V(Oddball) \ | 742 V(Oddball) \ |
| 741 V(SharedFunctionInfo) \ | 743 V(SharedFunctionInfo) \ |
| 742 V(JSValue) \ | 744 V(JSValue) \ |
| 743 V(JSMessageObject) \ | 745 V(JSMessageObject) \ |
| 744 V(StringWrapper) \ | 746 V(StringWrapper) \ |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 INLINE(bool IsUndefined()); | 795 INLINE(bool IsUndefined()); |
| 794 INLINE(bool IsNull()); | 796 INLINE(bool IsNull()); |
| 795 INLINE(bool IsTheHole()); // Shadows MaybeObject's implementation. | 797 INLINE(bool IsTheHole()); // Shadows MaybeObject's implementation. |
| 796 INLINE(bool IsTrue()); | 798 INLINE(bool IsTrue()); |
| 797 INLINE(bool IsFalse()); | 799 INLINE(bool IsFalse()); |
| 798 inline bool IsArgumentsMarker(); | 800 inline bool IsArgumentsMarker(); |
| 799 | 801 |
| 800 // Extract the number. | 802 // Extract the number. |
| 801 inline double Number(); | 803 inline double Number(); |
| 802 | 804 |
| 805 // Returns true if the object is of the correct type to be used as a |
| 806 // implementation of a JSObject's elements. |
| 807 inline bool HasValidElements(); |
| 808 |
| 803 inline bool HasSpecificClassOf(String* name); | 809 inline bool HasSpecificClassOf(String* name); |
| 804 | 810 |
| 805 MUST_USE_RESULT MaybeObject* ToObject(); // ECMA-262 9.9. | 811 MUST_USE_RESULT MaybeObject* ToObject(); // ECMA-262 9.9. |
| 806 Object* ToBoolean(); // ECMA-262 9.2. | 812 Object* ToBoolean(); // ECMA-262 9.2. |
| 807 | 813 |
| 808 // Convert to a JSObject if needed. | 814 // Convert to a JSObject if needed. |
| 809 // global_context is used when creating wrapper object. | 815 // global_context is used when creating wrapper object. |
| 810 MUST_USE_RESULT MaybeObject* ToObject(Context* global_context); | 816 MUST_USE_RESULT MaybeObject* ToObject(Context* global_context); |
| 811 | 817 |
| 812 // Converts this to a Smi if possible. | 818 // Converts this to a Smi if possible. |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 enum DeleteMode { | 1426 enum DeleteMode { |
| 1421 NORMAL_DELETION, | 1427 NORMAL_DELETION, |
| 1422 STRICT_DELETION, | 1428 STRICT_DELETION, |
| 1423 FORCE_DELETION | 1429 FORCE_DELETION |
| 1424 }; | 1430 }; |
| 1425 | 1431 |
| 1426 enum ElementsKind { | 1432 enum ElementsKind { |
| 1427 // The "fast" kind for tagged values. Must be first to make it possible | 1433 // The "fast" kind for tagged values. Must be first to make it possible |
| 1428 // to efficiently check maps if they have fast elements. | 1434 // to efficiently check maps if they have fast elements. |
| 1429 FAST_ELEMENTS, | 1435 FAST_ELEMENTS, |
| 1436 |
| 1437 // The "fast" kind for unwrapped, non-tagged double values. |
| 1438 FAST_DOUBLE_ELEMENTS, |
| 1439 |
| 1430 // The "slow" kind. | 1440 // The "slow" kind. |
| 1431 DICTIONARY_ELEMENTS, | 1441 DICTIONARY_ELEMENTS, |
| 1432 // The "fast" kind for external arrays | 1442 // The "fast" kind for external arrays |
| 1433 EXTERNAL_BYTE_ELEMENTS, | 1443 EXTERNAL_BYTE_ELEMENTS, |
| 1434 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, | 1444 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, |
| 1435 EXTERNAL_SHORT_ELEMENTS, | 1445 EXTERNAL_SHORT_ELEMENTS, |
| 1436 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, | 1446 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, |
| 1437 EXTERNAL_INT_ELEMENTS, | 1447 EXTERNAL_INT_ELEMENTS, |
| 1438 EXTERNAL_UNSIGNED_INT_ELEMENTS, | 1448 EXTERNAL_UNSIGNED_INT_ELEMENTS, |
| 1439 EXTERNAL_FLOAT_ELEMENTS, | 1449 EXTERNAL_FLOAT_ELEMENTS, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1471 // arrays). In the latter case the elements array may be shared by a | 1481 // arrays). In the latter case the elements array may be shared by a |
| 1472 // few objects and so before writing to any element the array must | 1482 // few objects and so before writing to any element the array must |
| 1473 // be copied. Use EnsureWritableFastElements in this case. | 1483 // be copied. Use EnsureWritableFastElements in this case. |
| 1474 // | 1484 // |
| 1475 // In the slow mode elements is either a NumberDictionary or an ExternalArray. | 1485 // In the slow mode elements is either a NumberDictionary or an ExternalArray. |
| 1476 DECL_ACCESSORS(elements, HeapObject) | 1486 DECL_ACCESSORS(elements, HeapObject) |
| 1477 inline void initialize_elements(); | 1487 inline void initialize_elements(); |
| 1478 MUST_USE_RESULT inline MaybeObject* ResetElements(); | 1488 MUST_USE_RESULT inline MaybeObject* ResetElements(); |
| 1479 inline ElementsKind GetElementsKind(); | 1489 inline ElementsKind GetElementsKind(); |
| 1480 inline bool HasFastElements(); | 1490 inline bool HasFastElements(); |
| 1491 inline bool HasFastDoubleElements(); |
| 1481 inline bool HasDictionaryElements(); | 1492 inline bool HasDictionaryElements(); |
| 1482 inline bool HasExternalPixelElements(); | 1493 inline bool HasExternalPixelElements(); |
| 1483 inline bool HasExternalArrayElements(); | 1494 inline bool HasExternalArrayElements(); |
| 1484 inline bool HasExternalByteElements(); | 1495 inline bool HasExternalByteElements(); |
| 1485 inline bool HasExternalUnsignedByteElements(); | 1496 inline bool HasExternalUnsignedByteElements(); |
| 1486 inline bool HasExternalShortElements(); | 1497 inline bool HasExternalShortElements(); |
| 1487 inline bool HasExternalUnsignedShortElements(); | 1498 inline bool HasExternalUnsignedShortElements(); |
| 1488 inline bool HasExternalIntElements(); | 1499 inline bool HasExternalIntElements(); |
| 1489 inline bool HasExternalUnsignedIntElements(); | 1500 inline bool HasExternalUnsignedIntElements(); |
| 1490 inline bool HasExternalFloatElements(); | 1501 inline bool HasExternalFloatElements(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1630 bool IsSimpleEnum(); | 1641 bool IsSimpleEnum(); |
| 1631 | 1642 |
| 1632 // Do we want to keep the elements in fast case when increasing the | 1643 // Do we want to keep the elements in fast case when increasing the |
| 1633 // capacity? | 1644 // capacity? |
| 1634 bool ShouldConvertToSlowElements(int new_capacity); | 1645 bool ShouldConvertToSlowElements(int new_capacity); |
| 1635 // Returns true if the backing storage for the slow-case elements of | 1646 // Returns true if the backing storage for the slow-case elements of |
| 1636 // this object takes up nearly as much space as a fast-case backing | 1647 // this object takes up nearly as much space as a fast-case backing |
| 1637 // storage would. In that case the JSObject should have fast | 1648 // storage would. In that case the JSObject should have fast |
| 1638 // elements. | 1649 // elements. |
| 1639 bool ShouldConvertToFastElements(); | 1650 bool ShouldConvertToFastElements(); |
| 1651 // Returns true if the elements of JSObject contains only values that can be |
| 1652 // represented in a FixedDoubleArray. |
| 1653 bool ShouldConvertToFastDoubleElements(); |
| 1640 | 1654 |
| 1641 // Tells whether the index'th element is present. | 1655 // Tells whether the index'th element is present. |
| 1642 inline bool HasElement(uint32_t index); | 1656 inline bool HasElement(uint32_t index); |
| 1643 bool HasElementWithReceiver(JSReceiver* receiver, uint32_t index); | 1657 bool HasElementWithReceiver(JSReceiver* receiver, uint32_t index); |
| 1644 | 1658 |
| 1645 // Computes the new capacity when expanding the elements of a JSObject. | 1659 // Computes the new capacity when expanding the elements of a JSObject. |
| 1646 static int NewElementsCapacity(int old_capacity) { | 1660 static int NewElementsCapacity(int old_capacity) { |
| 1647 // (old_capacity + 50%) + 16 | 1661 // (old_capacity + 50%) + 16 |
| 1648 return old_capacity + (old_capacity >> 1) + 16; | 1662 return old_capacity + (old_capacity >> 1) + 16; |
| 1649 } | 1663 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1669 LocalElementType HasLocalElement(uint32_t index); | 1683 LocalElementType HasLocalElement(uint32_t index); |
| 1670 | 1684 |
| 1671 bool HasElementWithInterceptor(JSReceiver* receiver, uint32_t index); | 1685 bool HasElementWithInterceptor(JSReceiver* receiver, uint32_t index); |
| 1672 bool HasElementPostInterceptor(JSReceiver* receiver, uint32_t index); | 1686 bool HasElementPostInterceptor(JSReceiver* receiver, uint32_t index); |
| 1673 | 1687 |
| 1674 MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index, | 1688 MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index, |
| 1675 Object* value, | 1689 Object* value, |
| 1676 StrictModeFlag strict_mode, | 1690 StrictModeFlag strict_mode, |
| 1677 bool check_prototype = true); | 1691 bool check_prototype = true); |
| 1678 | 1692 |
| 1693 MUST_USE_RESULT MaybeObject* SetFastDoubleElement( |
| 1694 uint32_t index, |
| 1695 Object* value, |
| 1696 StrictModeFlag strict_mode, |
| 1697 bool check_prototype = true); |
| 1698 |
| 1679 // Set the index'th array element. | 1699 // Set the index'th array element. |
| 1680 // A Failure object is returned if GC is needed. | 1700 // A Failure object is returned if GC is needed. |
| 1681 MUST_USE_RESULT MaybeObject* SetElement(uint32_t index, | 1701 MUST_USE_RESULT MaybeObject* SetElement(uint32_t index, |
| 1682 Object* value, | 1702 Object* value, |
| 1683 StrictModeFlag strict_mode, | 1703 StrictModeFlag strict_mode, |
| 1684 bool check_prototype = true); | 1704 bool check_prototype = true); |
| 1685 | 1705 |
| 1686 // Returns the index'th element. | 1706 // Returns the index'th element. |
| 1687 // The undefined object if index is out of bounds. | 1707 // The undefined object if index is out of bounds. |
| 1688 MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); | 1708 MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); |
| 1689 MaybeObject* GetElementWithInterceptor(Object* receiver, uint32_t index); | 1709 MaybeObject* GetElementWithInterceptor(Object* receiver, uint32_t index); |
| 1690 | 1710 |
| 1691 // Get external element value at index if there is one and undefined | 1711 // Get external element value at index if there is one and undefined |
| 1692 // otherwise. Can return a failure if allocation of a heap number | 1712 // otherwise. Can return a failure if allocation of a heap number |
| 1693 // failed. | 1713 // failed. |
| 1694 MaybeObject* GetExternalElement(uint32_t index); | 1714 MaybeObject* GetExternalElement(uint32_t index); |
| 1695 | 1715 |
| 1696 MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity, | 1716 MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity, |
| 1697 int length); | 1717 int length); |
| 1718 MUST_USE_RESULT MaybeObject* SetFastDoubleElementsCapacityAndLength( |
| 1719 int capacity, |
| 1720 int length); |
| 1698 MUST_USE_RESULT MaybeObject* SetSlowElements(Object* length); | 1721 MUST_USE_RESULT MaybeObject* SetSlowElements(Object* length); |
| 1699 | 1722 |
| 1700 // Lookup interceptors are used for handling properties controlled by host | 1723 // Lookup interceptors are used for handling properties controlled by host |
| 1701 // objects. | 1724 // objects. |
| 1702 inline bool HasNamedInterceptor(); | 1725 inline bool HasNamedInterceptor(); |
| 1703 inline bool HasIndexedInterceptor(); | 1726 inline bool HasIndexedInterceptor(); |
| 1704 | 1727 |
| 1705 // Support functions for v8 api (needed for correct interceptor behavior). | 1728 // Support functions for v8 api (needed for correct interceptor behavior). |
| 1706 bool HasRealNamedProperty(String* key); | 1729 bool HasRealNamedProperty(String* key); |
| 1707 bool HasRealElementProperty(uint32_t index); | 1730 bool HasRealElementProperty(uint32_t index); |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1979 MUST_USE_RESULT MaybeObject* DefineGetterSetter( | 2002 MUST_USE_RESULT MaybeObject* DefineGetterSetter( |
| 1980 String* name, | 2003 String* name, |
| 1981 PropertyAttributes attributes); | 2004 PropertyAttributes attributes); |
| 1982 | 2005 |
| 1983 void LookupInDescriptor(String* name, LookupResult* result); | 2006 void LookupInDescriptor(String* name, LookupResult* result); |
| 1984 | 2007 |
| 1985 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); | 2008 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); |
| 1986 }; | 2009 }; |
| 1987 | 2010 |
| 1988 | 2011 |
| 1989 // FixedArray describes fixed-sized arrays with element type Object*. | 2012 // Common superclass for FixedArrays that allow implementations to share |
| 1990 class FixedArray: public HeapObject { | 2013 // common accessors and some code paths. |
| 2014 class FixedArrayBase: public HeapObject { |
| 1991 public: | 2015 public: |
| 1992 // [length]: length of the array. | 2016 // [length]: length of the array. |
| 1993 inline int length(); | 2017 inline int length(); |
| 1994 inline void set_length(int value); | 2018 inline void set_length(int value); |
| 1995 | 2019 |
| 2020 inline static FixedArrayBase* cast(Object* object); |
| 2021 |
| 2022 // Layout description. |
| 2023 // Length is smi tagged when it is stored. |
| 2024 static const int kLengthOffset = HeapObject::kHeaderSize; |
| 2025 static const int kHeaderSize = kLengthOffset + kPointerSize; |
| 2026 }; |
| 2027 |
| 2028 |
| 2029 // FixedArray describes fixed-sized arrays with element type Object*. |
| 2030 class FixedArray: public FixedArrayBase { |
| 2031 public: |
| 1996 // Setter and getter for elements. | 2032 // Setter and getter for elements. |
| 1997 inline Object* get(int index); | 2033 inline Object* get(int index); |
| 1998 // Setter that uses write barrier. | 2034 // Setter that uses write barrier. |
| 1999 inline void set(int index, Object* value); | 2035 inline void set(int index, Object* value); |
| 2000 | 2036 |
| 2001 // Setter that doesn't need write barrier). | 2037 // Setter that doesn't need write barrier). |
| 2002 inline void set(int index, Smi* value); | 2038 inline void set(int index, Smi* value); |
| 2003 // Setter with explicit barrier mode. | 2039 // Setter with explicit barrier mode. |
| 2004 inline void set(int index, Object* value, WriteBarrierMode mode); | 2040 inline void set(int index, Object* value, WriteBarrierMode mode); |
| 2005 | 2041 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2036 | 2072 |
| 2037 // Garbage collection support. | 2073 // Garbage collection support. |
| 2038 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } | 2074 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } |
| 2039 | 2075 |
| 2040 // Code Generation support. | 2076 // Code Generation support. |
| 2041 static int OffsetOfElementAt(int index) { return SizeFor(index); } | 2077 static int OffsetOfElementAt(int index) { return SizeFor(index); } |
| 2042 | 2078 |
| 2043 // Casting. | 2079 // Casting. |
| 2044 static inline FixedArray* cast(Object* obj); | 2080 static inline FixedArray* cast(Object* obj); |
| 2045 | 2081 |
| 2046 // Layout description. | |
| 2047 // Length is smi tagged when it is stored. | |
| 2048 static const int kLengthOffset = HeapObject::kHeaderSize; | |
| 2049 static const int kHeaderSize = kLengthOffset + kPointerSize; | |
| 2050 | |
| 2051 // Maximal allowed size, in bytes, of a single FixedArray. | 2082 // Maximal allowed size, in bytes, of a single FixedArray. |
| 2052 // Prevents overflowing size computations, as well as extreme memory | 2083 // Prevents overflowing size computations, as well as extreme memory |
| 2053 // consumption. | 2084 // consumption. |
| 2054 static const int kMaxSize = 512 * MB; | 2085 static const int kMaxSize = 512 * MB; |
| 2055 // Maximally allowed length of a FixedArray. | 2086 // Maximally allowed length of a FixedArray. |
| 2056 static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; | 2087 static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; |
| 2057 | 2088 |
| 2058 // Dispatched behavior. | 2089 // Dispatched behavior. |
| 2059 #ifdef OBJECT_PRINT | 2090 #ifdef OBJECT_PRINT |
| 2060 inline void FixedArrayPrint() { | 2091 inline void FixedArrayPrint() { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2088 protected: | 2119 protected: |
| 2089 // Set operation on FixedArray without using write barriers. Can | 2120 // Set operation on FixedArray without using write barriers. Can |
| 2090 // only be used for storing old space objects or smis. | 2121 // only be used for storing old space objects or smis. |
| 2091 static inline void fast_set(FixedArray* array, int index, Object* value); | 2122 static inline void fast_set(FixedArray* array, int index, Object* value); |
| 2092 | 2123 |
| 2093 private: | 2124 private: |
| 2094 DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); | 2125 DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); |
| 2095 }; | 2126 }; |
| 2096 | 2127 |
| 2097 | 2128 |
| 2129 // FixedDoubleArray describes fixed-sized arrays with element type double. |
| 2130 class FixedDoubleArray: public FixedArrayBase { |
| 2131 public: |
| 2132 inline void Initialize(FixedArray* from); |
| 2133 inline void Initialize(FixedDoubleArray* from); |
| 2134 inline void Initialize(NumberDictionary* from); |
| 2135 |
| 2136 // Setter and getter for elements. |
| 2137 inline double get(int index); |
| 2138 inline void set(int index, double value); |
| 2139 inline void set_the_hole(int index); |
| 2140 |
| 2141 // Checking for the hole. |
| 2142 inline bool is_the_hole(int index); |
| 2143 |
| 2144 // Garbage collection support. |
| 2145 inline static int SizeFor(int length) { |
| 2146 return kHeaderSize + length * kDoubleSize; |
| 2147 } |
| 2148 |
| 2149 // The following can't be declared inline as const static |
| 2150 // because they're 64-bit. |
| 2151 static uint64_t kCanonicalNonHoleNanLower32; |
| 2152 static uint64_t kCanonicalNonHoleNanInt64; |
| 2153 static uint64_t kHoleNanInt64; |
| 2154 |
| 2155 inline static bool is_the_hole_nan(double value) { |
| 2156 return BitCast<uint64_t, double>(value) == kHoleNanInt64; |
| 2157 } |
| 2158 |
| 2159 inline static double hole_nan_as_double() { |
| 2160 return BitCast<double, uint64_t>(kHoleNanInt64); |
| 2161 } |
| 2162 |
| 2163 inline static double canonical_not_the_hole_nan_as_double() { |
| 2164 return BitCast<double, uint64_t>(kCanonicalNonHoleNanInt64); |
| 2165 } |
| 2166 |
| 2167 // Casting. |
| 2168 static inline FixedDoubleArray* cast(Object* obj); |
| 2169 |
| 2170 // Maximal allowed size, in bytes, of a single FixedDoubleArray. |
| 2171 // Prevents overflowing size computations, as well as extreme memory |
| 2172 // consumption. |
| 2173 static const int kMaxSize = 512 * MB; |
| 2174 // Maximally allowed length of a FixedArray. |
| 2175 static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; |
| 2176 |
| 2177 // Dispatched behavior. |
| 2178 #ifdef OBJECT_PRINT |
| 2179 inline void FixedDoubleArrayPrint() { |
| 2180 FixedDoubleArrayPrint(stdout); |
| 2181 } |
| 2182 void FixedDoubleArrayPrint(FILE* out); |
| 2183 #endif |
| 2184 |
| 2185 #ifdef DEBUG |
| 2186 void FixedDoubleArrayVerify(); |
| 2187 #endif |
| 2188 |
| 2189 private: |
| 2190 DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); |
| 2191 }; |
| 2192 |
| 2193 |
| 2098 // DescriptorArrays are fixed arrays used to hold instance descriptors. | 2194 // DescriptorArrays are fixed arrays used to hold instance descriptors. |
| 2099 // The format of the these objects is: | 2195 // The format of the these objects is: |
| 2100 // TODO(1399): It should be possible to make room for bit_field3 in the map | 2196 // TODO(1399): It should be possible to make room for bit_field3 in the map |
| 2101 // without overloading the instance descriptors field in the map | 2197 // without overloading the instance descriptors field in the map |
| 2102 // (and storing it in the DescriptorArray when the map has one). | 2198 // (and storing it in the DescriptorArray when the map has one). |
| 2103 // [0]: storage for bit_field3 for Map owning this object (Smi) | 2199 // [0]: storage for bit_field3 for Map owning this object (Smi) |
| 2104 // [1]: point to a fixed array with (value, detail) pairs. | 2200 // [1]: point to a fixed array with (value, detail) pairs. |
| 2105 // [2]: next enumeration index (Smi), or pointer to small fixed array: | 2201 // [2]: next enumeration index (Smi), or pointer to small fixed array: |
| 2106 // [0]: next enumeration index (Smi) | 2202 // [0]: next enumeration index (Smi) |
| 2107 // [1]: pointer to fixed array with enum cache | 2203 // [1]: pointer to fixed array with enum cache |
| (...skipping 1694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3802 | 3898 |
| 3803 inline JSObject::ElementsKind elements_kind() { | 3899 inline JSObject::ElementsKind elements_kind() { |
| 3804 return static_cast<JSObject::ElementsKind>( | 3900 return static_cast<JSObject::ElementsKind>( |
| 3805 (bit_field2() & kElementsKindMask) >> kElementsKindShift); | 3901 (bit_field2() & kElementsKindMask) >> kElementsKindShift); |
| 3806 } | 3902 } |
| 3807 | 3903 |
| 3808 inline bool has_fast_elements() { | 3904 inline bool has_fast_elements() { |
| 3809 return elements_kind() == JSObject::FAST_ELEMENTS; | 3905 return elements_kind() == JSObject::FAST_ELEMENTS; |
| 3810 } | 3906 } |
| 3811 | 3907 |
| 3908 inline bool has_fast_double_elements() { |
| 3909 return elements_kind() == JSObject::FAST_DOUBLE_ELEMENTS; |
| 3910 } |
| 3911 |
| 3812 inline bool has_external_array_elements() { | 3912 inline bool has_external_array_elements() { |
| 3813 JSObject::ElementsKind kind(elements_kind()); | 3913 JSObject::ElementsKind kind(elements_kind()); |
| 3814 return kind >= JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && | 3914 return kind >= JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && |
| 3815 kind <= JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND; | 3915 kind <= JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND; |
| 3816 } | 3916 } |
| 3817 | 3917 |
| 3818 // Tells whether the map is attached to SharedFunctionInfo | 3918 // Tells whether the map is attached to SharedFunctionInfo |
| 3819 // (for inobject slack tracking). | 3919 // (for inobject slack tracking). |
| 3820 inline void set_attached_to_shared_function_info(bool value); | 3920 inline void set_attached_to_shared_function_info(bool value); |
| 3821 | 3921 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3894 | 3994 |
| 3895 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); | 3995 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); |
| 3896 | 3996 |
| 3897 MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, | 3997 MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, |
| 3898 NormalizedMapSharingMode sharing); | 3998 NormalizedMapSharingMode sharing); |
| 3899 | 3999 |
| 3900 // Returns a copy of the map, with all transitions dropped from the | 4000 // Returns a copy of the map, with all transitions dropped from the |
| 3901 // instance descriptors. | 4001 // instance descriptors. |
| 3902 MUST_USE_RESULT MaybeObject* CopyDropTransitions(); | 4002 MUST_USE_RESULT MaybeObject* CopyDropTransitions(); |
| 3903 | 4003 |
| 3904 // Returns this map if it has the fast elements bit set, otherwise | 4004 // Returns this map if it already has elements that are fast, otherwise |
| 3905 // returns a copy of the map, with all transitions dropped from the | 4005 // returns a copy of the map, with all transitions dropped from the |
| 3906 // descriptors and the fast elements bit set. | 4006 // descriptors and the ElementsKind set to FAST_ELEMENTS. |
| 3907 MUST_USE_RESULT inline MaybeObject* GetFastElementsMap(); | 4007 MUST_USE_RESULT inline MaybeObject* GetFastElementsMap(); |
| 3908 | 4008 |
| 3909 // Returns this map if it has the fast elements bit cleared, | 4009 // Returns this map if it already has fast elements that are doubles, |
| 3910 // otherwise returns a copy of the map, with all transitions dropped | 4010 // otherwise returns a copy of the map, with all transitions dropped from the |
| 3911 // from the descriptors and the fast elements bit cleared. | 4011 // descriptors and the ElementsKind set to FAST_DOUBLE_ELEMENTS. |
| 4012 MUST_USE_RESULT inline MaybeObject* GetFastDoubleElementsMap(); |
| 4013 |
| 4014 // Returns this map if already has dictionary elements, otherwise returns a |
| 4015 // copy of the map, with all transitions dropped from the descriptors and the |
| 4016 // ElementsKind set to DICTIONARY_ELEMENTS. |
| 3912 MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap(); | 4017 MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap(); |
| 3913 | 4018 |
| 3914 // Returns a new map with all transitions dropped from the descriptors and the | 4019 // Returns a new map with all transitions dropped from the descriptors and the |
| 3915 // external array elements bit set. | 4020 // ElementsKind set to one of the value corresponding to array_type. |
| 3916 MUST_USE_RESULT MaybeObject* GetExternalArrayElementsMap( | 4021 MUST_USE_RESULT MaybeObject* GetExternalArrayElementsMap( |
| 3917 ExternalArrayType array_type, | 4022 ExternalArrayType array_type, |
| 3918 bool safe_to_add_transition); | 4023 bool safe_to_add_transition); |
| 3919 | 4024 |
| 3920 // Returns the property index for name (only valid for FAST MODE). | 4025 // Returns the property index for name (only valid for FAST MODE). |
| 3921 int PropertyIndexFor(String* name); | 4026 int PropertyIndexFor(String* name); |
| 3922 | 4027 |
| 3923 // Returns the next free property index (only valid for FAST MODE). | 4028 // Returns the next free property index (only valid for FAST MODE). |
| 3924 int NextFreePropertyIndex(); | 4029 int NextFreePropertyIndex(); |
| 3925 | 4030 |
| (...skipping 3055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6981 } else { | 7086 } else { |
| 6982 value &= ~(1 << bit_position); | 7087 value &= ~(1 << bit_position); |
| 6983 } | 7088 } |
| 6984 return value; | 7089 return value; |
| 6985 } | 7090 } |
| 6986 }; | 7091 }; |
| 6987 | 7092 |
| 6988 } } // namespace v8::internal | 7093 } } // namespace v8::internal |
| 6989 | 7094 |
| 6990 #endif // V8_OBJECTS_H_ | 7095 #endif // V8_OBJECTS_H_ |
| OLD | NEW |