| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 4a7b0c21f0cf1f7cf7021bf28e8a1f05ae25647b..788b03b5ddffc627e5afa202861ecaac37f06403 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -2472,43 +2472,20 @@ class DescriptorArray: public FixedArray {
|
| inline int number_of_entries() { return number_of_descriptors(); }
|
| inline int NextEnumerationIndex() { return number_of_descriptors() + 1; }
|
|
|
| - int LastAdded() {
|
| - ASSERT(!IsEmpty());
|
| - Object* obj = get(kLastAddedIndex);
|
| - if (obj->IsSmi()) {
|
| - return Smi::cast(obj)->value();
|
| - } else {
|
| - Object* index = FixedArray::cast(obj)->get(kEnumCacheBridgeLastAdded);
|
| - return Smi::cast(index)->value();
|
| - }
|
| - }
|
| -
|
| - // Set index of the last added descriptor and flush any enum cache.
|
| - void SetLastAdded(int index) {
|
| - ASSERT(!IsEmpty() || index > 0);
|
| - set(kLastAddedIndex, Smi::FromInt(index));
|
| - }
|
| -
|
| - int NumberOfSetDescriptors() {
|
| - ASSERT(!IsEmpty());
|
| - if (LastAdded() == kNoneAdded) return 0;
|
| - return GetDetails(LastAdded()).index();
|
| - }
|
| -
|
| bool HasEnumCache() {
|
| - return !IsEmpty() && !get(kLastAddedIndex)->IsSmi();
|
| + return !IsEmpty() && !get(kEnumCacheIndex)->IsSmi();
|
| }
|
|
|
| Object* GetEnumCache() {
|
| ASSERT(HasEnumCache());
|
| - FixedArray* bridge = FixedArray::cast(get(kLastAddedIndex));
|
| + FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
|
| return bridge->get(kEnumCacheBridgeCacheIndex);
|
| }
|
|
|
| Object** GetEnumCacheSlot() {
|
| ASSERT(HasEnumCache());
|
| return HeapObject::RawField(reinterpret_cast<HeapObject*>(this),
|
| - kLastAddedOffset);
|
| + kEnumCacheOffset);
|
| }
|
|
|
| Object** GetTransitionsSlot() {
|
| @@ -2590,11 +2567,8 @@ class DescriptorArray: public FixedArray {
|
| // Constant for denoting key was not found.
|
| static const int kNotFound = -1;
|
|
|
| - // Constant for denoting that the LastAdded field was not yet set.
|
| - static const int kNoneAdded = -1;
|
| -
|
| static const int kBackPointerStorageIndex = 0;
|
| - static const int kLastAddedIndex = 1;
|
| + static const int kEnumCacheIndex = 1;
|
| static const int kTransitionsIndex = 2;
|
| static const int kFirstIndex = 3;
|
|
|
| @@ -2606,9 +2580,9 @@ class DescriptorArray: public FixedArray {
|
|
|
| // Layout description.
|
| static const int kBackPointerStorageOffset = FixedArray::kHeaderSize;
|
| - static const int kLastAddedOffset = kBackPointerStorageOffset +
|
| + static const int kEnumCacheOffset = kBackPointerStorageOffset +
|
| kPointerSize;
|
| - static const int kTransitionsOffset = kLastAddedOffset + kPointerSize;
|
| + static const int kTransitionsOffset = kEnumCacheOffset + kPointerSize;
|
| static const int kFirstOffset = kTransitionsOffset + kPointerSize;
|
|
|
| // Layout description for the bridge array.
|
| @@ -4674,6 +4648,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 LastAddedBits: public BitField<int, 2, 11> {};
|
| +
|
| // Tells whether the object in the prototype property will be used
|
| // for instances created from this function. If the prototype
|
| // property is set to a value that is not a JSObject, the prototype
|
| @@ -4898,6 +4876,20 @@ class Map: public HeapObject {
|
| String* name,
|
| LookupResult* result);
|
|
|
| + void SetLastAdded(int index) {
|
| + set_bit_field3(LastAddedBits::update(bit_field3(), index));
|
| + }
|
| +
|
| + int LastAdded() {
|
| + return LastAddedBits::decode(bit_field3());
|
| + }
|
| +
|
| + int NumberOfSetDescriptors() {
|
| + ASSERT(!instance_descriptors()->IsEmpty());
|
| + if (LastAdded() == kNoneAdded) return 0;
|
| + return instance_descriptors()->GetDetails(LastAdded()).index();
|
| + }
|
| +
|
| MUST_USE_RESULT MaybeObject* RawCopy(int instance_size);
|
| MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors();
|
| MUST_USE_RESULT MaybeObject* CopyDropDescriptors();
|
| @@ -5033,6 +5025,9 @@ 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;
|
|
|