| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index f30a8c9c2225f7401a98204648b2ff609b5b627d..8b8a8031f2f6b966797c572c0a7d9403d282c21d 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -2516,17 +2516,22 @@ class DescriptorArray: public FixedArray {
|
| inline Object* GetCallbacksObject(int descriptor_number);
|
| inline AccessorDescriptor* GetCallbacks(int descriptor_number);
|
|
|
| + inline String* GetSortedKey(int descriptor_number);
|
| + inline int GetSortedKeyIndex(int descriptor_number);
|
| + inline void SetSortedKey(int pointer, int descriptor_number);
|
| +
|
| // Accessor for complete descriptor.
|
| inline void Get(int descriptor_number, Descriptor* desc);
|
| inline void Set(int descriptor_number,
|
| Descriptor* desc,
|
| const WhitenessWitness&);
|
| +
|
| // Append automatically sets the enumeration index. This should only be used
|
| // to add descriptors in bulk at the end, followed by sorting the descriptor
|
| // array.
|
| - inline int Append(Descriptor* desc,
|
| - const WhitenessWitness&,
|
| - int number_of_set_descriptors);
|
| + inline void Append(Descriptor* desc,
|
| + const WhitenessWitness&,
|
| + int number_of_set_descriptors);
|
|
|
| // Transfer a complete descriptor from the src descriptor array to this
|
| // descriptor array.
|
| @@ -2536,7 +2541,8 @@ class DescriptorArray: public FixedArray {
|
| const WhitenessWitness&);
|
|
|
| // Sort the instance descriptors by the hash codes of their keys.
|
| - void Sort(const WhitenessWitness&);
|
| + void Sort();
|
| + inline void SwapSortedKeys(int first, int second);
|
|
|
| // Search the instance descriptors for given name.
|
| INLINE(int Search(String* name));
|
| @@ -4658,10 +4664,10 @@ class Map: public HeapObject {
|
| inline int bit_field3();
|
| inline void set_bit_field3(int value);
|
|
|
| - class IsShared: public BitField<bool, 0, 1> {};
|
| - class FunctionWithPrototype: public BitField<bool, 1, 1> {};
|
| - class DictionaryMap: public BitField<bool, 2, 1> {};
|
| - class LastAddedBits: public BitField<int, 3, 11> {};
|
| + class NumberOfOwnDescriptorsBits: public BitField<int, 0, 11> {};
|
| + class IsShared: public BitField<bool, 11, 1> {};
|
| + class FunctionWithPrototype: public BitField<bool, 12, 1> {};
|
| + class DictionaryMap: public BitField<bool, 13, 1> {};
|
|
|
| // Tells whether the object in the prototype property will be used
|
| // for instances created from this function. If the prototype
|
| @@ -4886,31 +4892,31 @@ class Map: public HeapObject {
|
| // Lookup in the map's instance descriptors and fill out the result
|
| // with the given holder if the name is found. The holder may be
|
| // NULL when this function is used from the compiler.
|
| - void LookupDescriptor(JSObject* holder,
|
| - String* name,
|
| - LookupResult* result);
|
| + inline void LookupDescriptor(JSObject* holder,
|
| + String* name,
|
| + LookupResult* result);
|
|
|
| - void LookupTransition(JSObject* holder,
|
| - String* name,
|
| - LookupResult* result);
|
| + inline void LookupTransition(JSObject* holder,
|
| + String* name,
|
| + LookupResult* result);
|
|
|
| // The size of transition arrays are limited so they do not end up in large
|
| // object space. Otherwise ClearNonLiveTransitions would leak memory while
|
| // applying in-place right trimming.
|
| inline bool CanHaveMoreTransitions();
|
|
|
| - void SetLastAdded(int index) {
|
| - set_bit_field3(LastAddedBits::update(bit_field3(), index));
|
| + int LastAdded() {
|
| + int number_of_own_descriptors = NumberOfOwnDescriptors();
|
| + ASSERT(number_of_own_descriptors > 0);
|
| + return number_of_own_descriptors - 1;
|
| }
|
|
|
| - int LastAdded() {
|
| - return LastAddedBits::decode(bit_field3());
|
| + int NumberOfOwnDescriptors() {
|
| + return NumberOfOwnDescriptorsBits::decode(bit_field3());
|
| }
|
|
|
| - int NumberOfSetDescriptors() {
|
| - ASSERT(!instance_descriptors()->IsEmpty());
|
| - if (LastAdded() == kNoneAdded) return 0;
|
| - return instance_descriptors()->GetDetails(LastAdded()).index();
|
| + void SetNumberOfOwnDescriptors(int number) {
|
| + set_bit_field3(NumberOfOwnDescriptorsBits::update(bit_field3(), number));
|
| }
|
|
|
| MUST_USE_RESULT MaybeObject* RawCopy(int instance_size);
|
| @@ -4919,7 +4925,6 @@ class Map: public HeapObject {
|
| MUST_USE_RESULT MaybeObject* CopyReplaceDescriptors(
|
| DescriptorArray* descriptors,
|
| String* name,
|
| - int last_added,
|
| TransitionFlag flag);
|
| MUST_USE_RESULT MaybeObject* CopyAddDescriptor(Descriptor* descriptor,
|
| TransitionFlag flag);
|
| @@ -5053,9 +5058,6 @@ class Map: public HeapObject {
|
|
|
| static const int kMaxPreAllocatedPropertyFields = 255;
|
|
|
| - // Constant for denoting that the LastAdded field was not yet set.
|
| - static const int kNoneAdded = LastAddedBits::kMax;
|
| -
|
| // Layout description.
|
| static const int kInstanceSizesOffset = HeapObject::kHeaderSize;
|
| static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize;
|
| @@ -5131,11 +5133,6 @@ class Map: public HeapObject {
|
| static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) <<
|
| Map::kElementsKindShift) - 1;
|
|
|
| - // Bit positions for bit field 3
|
| - static const int kIsShared = 0;
|
| - static const int kFunctionWithPrototype = 1;
|
| - static const int kDictionaryMap = 2;
|
| -
|
| typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
|
| kPointerFieldsEndOffset,
|
| kSize> BodyDescriptor;
|
|
|