| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 0df7c78fa58604140865ddc8302d652317658e67..15f22757e63b1e844b8dacb861629c15168e246c 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -1420,10 +1420,12 @@ class JSObject: public JSReceiver {
|
| };
|
|
|
| enum ElementsKind {
|
| - // The only "fast" kind.
|
| + // The "fast" kind for tagged values. Must be first to make it possible
|
| + // to efficiently check maps if they have fast elements.
|
| FAST_ELEMENTS,
|
| - // All the kinds below are "slow".
|
| + // The "slow" kind.
|
| DICTIONARY_ELEMENTS,
|
| + // The "fast" kind for external arrays
|
| EXTERNAL_BYTE_ELEMENTS,
|
| EXTERNAL_UNSIGNED_BYTE_ELEMENTS,
|
| EXTERNAL_SHORT_ELEMENTS,
|
| @@ -1432,9 +1434,18 @@ class JSObject: public JSReceiver {
|
| EXTERNAL_UNSIGNED_INT_ELEMENTS,
|
| EXTERNAL_FLOAT_ELEMENTS,
|
| EXTERNAL_DOUBLE_ELEMENTS,
|
| - EXTERNAL_PIXEL_ELEMENTS
|
| + EXTERNAL_PIXEL_ELEMENTS,
|
| +
|
| + // Derived constants from ElementsKind
|
| + FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_BYTE_ELEMENTS,
|
| + LAST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS,
|
| + FIRST_ELEMENTS_KIND = FAST_ELEMENTS,
|
| + LAST_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS
|
| };
|
|
|
| + static const int kElementsKindCount =
|
| + LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1;
|
| +
|
| // [properties]: Backing storage for properties.
|
| // properties is a FixedArray in the fast case and a Dictionary in the
|
| // slow case.
|
| @@ -3784,31 +3795,27 @@ class Map: public HeapObject {
|
| inline void set_is_extensible(bool value);
|
| inline bool is_extensible();
|
|
|
| - // Tells whether the instance has fast elements.
|
| - // Equivalent to instance->GetElementsKind() == FAST_ELEMENTS.
|
| - inline void set_has_fast_elements(bool value) {
|
| - if (value) {
|
| - set_bit_field2(bit_field2() | (1 << kHasFastElements));
|
| - } else {
|
| - set_bit_field2(bit_field2() & ~(1 << kHasFastElements));
|
| - }
|
| + inline void set_elements_kind(JSObject::ElementsKind elements_kind) {
|
| + ASSERT(elements_kind < JSObject::kElementsKindCount);
|
| + ASSERT(JSObject::kElementsKindCount <= (1 << kElementsKindBitCount));
|
| + set_bit_field2((bit_field2() & ~kElementsKindMask) |
|
| + (elements_kind << kElementsKindShift));
|
| + ASSERT(this->elements_kind() == elements_kind);
|
| }
|
|
|
| - inline bool has_fast_elements() {
|
| - return ((1 << kHasFastElements) & bit_field2()) != 0;
|
| + inline JSObject::ElementsKind elements_kind() {
|
| + return static_cast<JSObject::ElementsKind>(
|
| + (bit_field2() & kElementsKindMask) >> kElementsKindShift);
|
| }
|
|
|
| - // Tells whether an instance has pixel array elements.
|
| - inline void set_has_external_array_elements(bool value) {
|
| - if (value) {
|
| - set_bit_field2(bit_field2() | (1 << kHasExternalArrayElements));
|
| - } else {
|
| - set_bit_field2(bit_field2() & ~(1 << kHasExternalArrayElements));
|
| - }
|
| + inline bool has_fast_elements() {
|
| + return elements_kind() == JSObject::FAST_ELEMENTS;
|
| }
|
|
|
| inline bool has_external_array_elements() {
|
| - return ((1 << kHasExternalArrayElements) & bit_field2()) != 0;
|
| + JSObject::ElementsKind kind(elements_kind());
|
| + return kind >= JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
|
| + kind <= JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND;
|
| }
|
|
|
| // Tells whether the map is attached to SharedFunctionInfo
|
| @@ -4029,13 +4036,21 @@ class Map: public HeapObject {
|
| // Bit positions for bit field 2
|
| static const int kIsExtensible = 0;
|
| static const int kFunctionWithPrototype = 1;
|
| - static const int kHasFastElements = 2;
|
| - static const int kStringWrapperSafeForDefaultValueOf = 3;
|
| - static const int kAttachedToSharedFunctionInfo = 4;
|
| - static const int kHasExternalArrayElements = 5;
|
| + static const int kStringWrapperSafeForDefaultValueOf = 2;
|
| + static const int kAttachedToSharedFunctionInfo = 3;
|
| + // No bits can be used after kElementsKindFirstBit, they are all reserved for
|
| + // storing ElementKind. for anything other than storing the ElementKind.
|
| + static const int kElementsKindShift = 4;
|
| + static const int kElementsKindBitCount = 4;
|
| +
|
| + // Derived values from bit field 2
|
| + static const int kElementsKindMask = (-1 << kElementsKindShift) &
|
| + ((1 << (kElementsKindShift + kElementsKindBitCount)) - 1);
|
| + static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>(
|
| + (JSObject::FAST_ELEMENTS + 1) << Map::kElementsKindShift) - 1;
|
|
|
| // Bit positions for bit field 3
|
| - static const int kIsShared = 1;
|
| + static const int kIsShared = 0;
|
|
|
| // Layout of the default cache. It holds alternating name and code objects.
|
| static const int kCodeCacheEntrySize = 2;
|
|
|