Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1517)

Side by Side Diff: src/objects.h

Issue 7089002: Implement core support for FixedDoubleArrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: final version before commit Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698