Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index ea0ca9cc5bf61f20c157b8a1a6c2f94ce45a9e73..089a3f7ac3c03cdf7fe02c55745411bb9420e766 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -169,6 +169,14 @@ enum CreationFlag { |
| }; |
| +// Indicates whether the search function should expect a sorted or an unsorted |
| +// descriptor array as input. |
|
danno
2012/06/06 09:25:12
nit: remove the reference to descriptor if you wan
|
| +enum SearchMode { |
| + EXPECT_SORTED, |
| + EXPECT_UNSORTED |
| +}; |
| + |
| + |
| // Instance size sentinel for objects of variable size. |
| const int kVariableSizeSentinel = 0; |
| @@ -2398,10 +2406,15 @@ class DescriptorArray: public FixedArray { |
| // map uses to encode additional bit fields when the descriptor array is not |
| // yet used. |
| inline bool IsEmpty(); |
| + inline bool MayContainTransitions(); |
| + |
| + DECL_ACCESSORS(elements_transition_map, Map) |
| // Returns the number of descriptors in the array. |
| int number_of_descriptors() { |
| - ASSERT(length() > kFirstIndex || IsEmpty()); |
| + ASSERT(length() > kFirstIndex || |
| + length() == kTransitionsIndex || |
| + IsEmpty()); |
| int len = length(); |
| return len <= kFirstIndex ? 0 : (len - kFirstIndex) / kDescriptorSize; |
| } |
| @@ -2439,6 +2452,12 @@ class DescriptorArray: public FixedArray { |
| kEnumerationIndexOffset); |
| } |
| + Object** GetTransitionsSlot() { |
| + ASSERT(elements_transition_map() != NULL); |
| + return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), |
| + kTransitionsOffset); |
| + } |
| + |
| // TODO(1399): It should be possible to make room for bit_field3 in the map |
| // without overloading the instance descriptors field in the map |
| // (and storing it in the DescriptorArray when the map has one). |
| @@ -2515,9 +2534,16 @@ class DescriptorArray: public FixedArray { |
| MUST_USE_RESULT MaybeObject* CopyInsert(Descriptor* descriptor, |
| TransitionFlag transition_flag); |
| + // Indicates whether the search function should expect a sorted or an unsorted |
| + // descriptor array as input. |
| + enum SharedMode { |
| + MAY_BE_SHARED, |
| + CANNOT_BE_SHARED |
| + }; |
| + |
| // Return a copy of the array with all transitions and null descriptors |
| // removed. Return a Failure object in case of an allocation failure. |
| - MUST_USE_RESULT MaybeObject* RemoveTransitions(); |
| + MUST_USE_RESULT MaybeObject* RemoveTransitions(SharedMode shared_mode); |
| // Sort the instance descriptors by the hash codes of their keys. |
| // Does not check for duplicates. |
| @@ -2545,12 +2571,13 @@ class DescriptorArray: public FixedArray { |
| // Perform a linear search in the instance descriptors represented |
| // by this fixed array. len is the number of descriptor indices that are |
| - // valid. Does not require the descriptors to be sorted. |
| - int LinearSearch(String* name, int len); |
| + // valid. |
| + int LinearSearch(SearchMode mode, String* name, int len); |
| // Allocates a DescriptorArray, but returns the singleton |
| // empty descriptor array object if number_of_descriptors is 0. |
| - MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors); |
| + MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors, |
| + SharedMode shared_mode); |
| // Casting. |
| static inline DescriptorArray* cast(Object* obj); |
| @@ -2559,8 +2586,9 @@ class DescriptorArray: public FixedArray { |
| static const int kNotFound = -1; |
| static const int kBitField3StorageIndex = 0; |
| - static const int kEnumerationIndexIndex = 1; |
| - static const int kFirstIndex = 2; |
| + static const int kTransitionsIndex = 1; |
| + static const int kEnumerationIndexIndex = 2; |
| + static const int kFirstIndex = 3; |
| // The length of the "bridge" to the enum cache. |
| static const int kEnumCacheBridgeLength = 3; |
| @@ -2570,8 +2598,8 @@ class DescriptorArray: public FixedArray { |
| // Layout description. |
| static const int kBitField3StorageOffset = FixedArray::kHeaderSize; |
| - static const int kEnumerationIndexOffset = kBitField3StorageOffset + |
| - kPointerSize; |
| + static const int kTransitionsOffset = kBitField3StorageOffset + kPointerSize; |
| + static const int kEnumerationIndexOffset = kTransitionsOffset + kPointerSize; |
| static const int kFirstOffset = kEnumerationIndexOffset + kPointerSize; |
| // Layout description for the bridge array. |
| @@ -4677,6 +4705,9 @@ class Map: public HeapObject { |
| static bool IsValidElementsTransition(ElementsKind from_kind, |
| ElementsKind to_kind); |
| + inline Map* elements_transition_map(); |
| + inline void set_elements_transition_map(Map* transitioned_map); |
| + |
| // Tells whether the map is attached to SharedFunctionInfo |
| // (for inobject slack tracking). |
| inline void set_attached_to_shared_function_info(bool value); |
| @@ -4773,7 +4804,8 @@ class Map: public HeapObject { |
| // Returns a copy of the map, with all transitions dropped from the |
| // instance descriptors. |
| - MUST_USE_RESULT MaybeObject* CopyDropTransitions(); |
| + MUST_USE_RESULT MaybeObject* CopyDropTransitions( |
| + DescriptorArray::SharedMode shared_mode); |
| // Returns the property index for name (only valid for FAST MODE). |
| int PropertyIndexFor(String* name); |
| @@ -4826,23 +4858,15 @@ class Map: public HeapObject { |
| // The "shared" flags of both this map and |other| are ignored. |
| bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode); |
| - // Returns the contents of this map's descriptor array for the given string. |
| - // May return NULL. |safe_to_add_transition| is set to false and NULL |
| - // is returned if adding transitions is not allowed. |
| - Object* GetDescriptorContents(String* sentinel_name, |
| - bool* safe_to_add_transitions); |
| - |
| // Returns the map that this map transitions to if its elements_kind |
| // is changed to |elements_kind|, or NULL if no such map is cached yet. |
| // |safe_to_add_transitions| is set to false if adding transitions is not |
| // allowed. |
| - Map* LookupElementsTransitionMap(ElementsKind elements_kind, |
| - bool* safe_to_add_transition); |
| + Map* LookupElementsTransitionMap(ElementsKind elements_kind); |
| - // Adds an entry to this map's descriptor array for a transition to |
| - // |transitioned_map| when its elements_kind is changed to |elements_kind|. |
| - MUST_USE_RESULT MaybeObject* AddElementsTransition( |
| - ElementsKind elements_kind, Map* transitioned_map); |
| + // Adds a new transitions for changing the elements kind to |elements_kind|. |
| + MUST_USE_RESULT MaybeObject* CreateNextElementsTransition( |
| + ElementsKind elements_kind); |
| // Returns the transitioned map for this map with the most generic |
| // elements_kind that's found in |candidates|, or null handle if no match is |
| @@ -4984,7 +5008,6 @@ class Map: public HeapObject { |
| kSize> BodyDescriptor; |
| private: |
| - String* elements_transition_sentinel_name(); |
| DISALLOW_IMPLICIT_CONSTRUCTORS(Map); |
| }; |