| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 1a0c47a79f4c611eff49f39fb3c5d2037e88949d..bf7f67d22af9cb8bc4820bafc7bdbeffde17f91e 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -3094,16 +3094,41 @@ class FixedDoubleArray: public FixedArrayBase {
|
|
|
|
|
| // ConstantPoolArray describes a fixed-sized array containing constant pool
|
| -// entires.
|
| -// The format of the pool is:
|
| -// [0]: Field holding the first index which is a raw code target pointer entry
|
| -// [1]: Field holding the first index which is a heap pointer entry
|
| -// [2]: Field holding the first index which is a int32 entry
|
| -// [3] ... [first_code_ptr_index() - 1] : 64 bit entries
|
| -// [first_code_ptr_index()] ... [first_heap_ptr_index() - 1] : code pointers
|
| -// [first_heap_ptr_index()] ... [first_int32_index() - 1] : heap pointers
|
| -// [first_int32_index()] ... [length - 1] : 32 bit entries
|
| -class ConstantPoolArray: public FixedArrayBase {
|
| +// entries.
|
| +//
|
| +// A ConstantPoolArray can be structured in two different ways depending upon
|
| +// whether it is extended or small. The is_extended_layout() method can be used
|
| +// to discover which layout the constant pool has.
|
| +//
|
| +// The format of a small constant pool is:
|
| +// [kSmallLayout1Offset] : Small section layout bitmap 1
|
| +// [kSmallLayout2Offset] : Small section layout bitmap 2
|
| +// [first_index(INT64, SMALL_SECTION)] : 64 bit entries
|
| +// ... : ...
|
| +// [first_index(CODE_PTR, SMALL_SECTION)] : code pointer entries
|
| +// ... : ...
|
| +// [first_index(HEAP_PTR, SMALL_SECTION)] : heap pointer entries
|
| +// ... : ...
|
| +// [first_index(INT32, SMALL_SECTION)] : 32 bit entries
|
| +// ... : ...
|
| +//
|
| +// If the constant pool has an extended layout, the extended section constant
|
| +// pool also contains an extended section, which has the following format at
|
| +// location get_extended_section_header_offset():
|
| +// [kExtendedInt64CountOffset] : count of extended 64 bit entries
|
| +// [kExtendedCodePtrCountOffset] : count of extended code pointers
|
| +// [kExtendedHeapPtrCountOffset] : count of extended heap pointers
|
| +// [kExtendedInt32CountOffset] : count of extended 32 bit entries
|
| +// [first_index(INT64, EXTENDED_SECTION)] : 64 bit entries
|
| +// ... : ...
|
| +// [first_index(CODE_PTR, EXTENDED_SECTION)]: code pointer entries
|
| +// ... : ...
|
| +// [first_index(HEAP_PTR, EXTENDED_SECTION)]: heap pointer entries
|
| +// ... : ...
|
| +// [first_index(INT32, EXTENDED_SECTION)] : 32 bit entries
|
| +// ... : ...
|
| +//
|
| +class ConstantPoolArray: public HeapObject {
|
| public:
|
| enum WeakObjectState {
|
| NO_WEAK_OBJECTS,
|
| @@ -3111,17 +3136,94 @@ class ConstantPoolArray: public FixedArrayBase {
|
| WEAK_OBJECTS_IN_IC
|
| };
|
|
|
| - // Getters for the field storing the first index for different type entries.
|
| - inline int first_code_ptr_index();
|
| - inline int first_heap_ptr_index();
|
| - inline int first_int64_index();
|
| - inline int first_int32_index();
|
| + enum Type {
|
| + INT64 = 0,
|
| + CODE_PTR,
|
| + HEAP_PTR,
|
| + INT32,
|
| + // Number of types stored by the ConstantPoolArrays.
|
| + NUMBER_OF_TYPES,
|
| + FIRST_TYPE = INT64,
|
| + LAST_TYPE = INT32
|
| + };
|
| +
|
| + enum LayoutSection {
|
| + SMALL_SECTION = 0,
|
| + EXTENDED_SECTION
|
| + };
|
| +
|
| + class NumberOfEntries BASE_EMBEDDED {
|
| + public:
|
| + inline NumberOfEntries(int int64_count, int code_ptr_count,
|
| + int heap_ptr_count, int int32_count) {
|
| + element_counts_[INT64] = int64_count;
|
| + element_counts_[CODE_PTR] = code_ptr_count;
|
| + element_counts_[HEAP_PTR] = heap_ptr_count;
|
| + element_counts_[INT32] = int32_count;
|
| + }
|
| +
|
| + inline NumberOfEntries(ConstantPoolArray* array, LayoutSection section) {
|
| + element_counts_[INT64] = array->number_of_entries(INT64, section);
|
| + element_counts_[CODE_PTR] = array->number_of_entries(CODE_PTR, section);
|
| + element_counts_[HEAP_PTR] = array->number_of_entries(HEAP_PTR, section);
|
| + element_counts_[INT32] = array->number_of_entries(INT32, section);
|
| + }
|
| +
|
| + inline int count_of(Type type) const {
|
| + ASSERT(type < NUMBER_OF_TYPES);
|
| + return element_counts_[type];
|
| + }
|
| +
|
| + inline int total_count() const {
|
| + int count = 0;
|
| + for (int i = 0; i < NUMBER_OF_TYPES; i++) {
|
| + count += element_counts_[i];
|
| + }
|
| + return count;
|
| + }
|
| +
|
| + inline int are_in_range(int min, int max) const {
|
| + for (int i = FIRST_TYPE; i < NUMBER_OF_TYPES; i++) {
|
| + if (element_counts_[i] < min || element_counts_[i] > max) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + private:
|
| + int element_counts_[NUMBER_OF_TYPES];
|
| + };
|
| +
|
| + class Iterator BASE_EMBEDDED {
|
| + public:
|
| + inline Iterator(ConstantPoolArray* array, Type type)
|
| + : array_(array), type_(type), final_section_(array->final_section()) {
|
| + current_section_ = SMALL_SECTION;
|
| + next_index_ = array->first_index(type, SMALL_SECTION);
|
| + update_section();
|
| + }
|
| +
|
| + inline int next_index();
|
| + inline bool is_finished();
|
| + private:
|
| + inline void update_section();
|
| + ConstantPoolArray* array_;
|
| + const Type type_;
|
| + const LayoutSection final_section_;
|
| +
|
| + LayoutSection current_section_;
|
| + int next_index_;
|
| + };
|
| +
|
| + // Getters for the first index, the last index and the count of entries of
|
| + // a given type for a given layout section.
|
| + inline int first_index(Type type, LayoutSection layout_section);
|
| + inline int last_index(Type type, LayoutSection layout_section);
|
| + inline int number_of_entries(Type type, LayoutSection layout_section);
|
|
|
| - // Getters for counts of different type entries.
|
| - inline int count_of_code_ptr_entries();
|
| - inline int count_of_heap_ptr_entries();
|
| - inline int count_of_int64_entries();
|
| - inline int count_of_int32_entries();
|
| + // Returns the type of the entry at the given index.
|
| + inline Type get_type(int index);
|
|
|
| // Setter and getter for pool elements.
|
| inline Address get_code_ptr_entry(int index);
|
| @@ -3130,49 +3232,98 @@ class ConstantPoolArray: public FixedArrayBase {
|
| inline int32_t get_int32_entry(int index);
|
| inline double get_int64_entry_as_double(int index);
|
|
|
| - // Setter and getter for weak objects state
|
| - inline void set_weak_object_state(WeakObjectState state);
|
| - inline WeakObjectState get_weak_object_state();
|
| -
|
| inline void set(int index, Address value);
|
| inline void set(int index, Object* value);
|
| inline void set(int index, int64_t value);
|
| inline void set(int index, double value);
|
| inline void set(int index, int32_t value);
|
|
|
| - // Set up initial state.
|
| - inline void Init(int number_of_int64_entries,
|
| - int number_of_code_ptr_entries,
|
| - int number_of_heap_ptr_entries,
|
| - int number_of_int32_entries);
|
| + // Setter and getter for weak objects state
|
| + inline void set_weak_object_state(WeakObjectState state);
|
| + inline WeakObjectState get_weak_object_state();
|
| +
|
| + // Returns true if the constant pool has an extended layout, false if it has
|
| + // only the small layout.
|
| + inline bool is_extended_layout();
|
| +
|
| + // Returns the last LayoutSection in this constant pool array.
|
| + inline LayoutSection final_section();
|
| +
|
| + // Set up initial state for a small layout constant pool array.
|
| + inline void Init(const NumberOfEntries& small);
|
| +
|
| + // Set up initial state for an extended layout constant pool array.
|
| + inline void InitExtended(const NumberOfEntries& small,
|
| + const NumberOfEntries& extended);
|
| +
|
| + // Clears the pointer entries with GC safe values.
|
| + void ClearPtrEntries(Isolate* isolate);
|
| +
|
| + // returns the total number of entries in the constant pool array.
|
| + inline int length();
|
|
|
| // Garbage collection support.
|
| - inline static int SizeFor(int number_of_int64_entries,
|
| - int number_of_code_ptr_entries,
|
| - int number_of_heap_ptr_entries,
|
| - int number_of_int32_entries) {
|
| - return RoundUp(OffsetAt(number_of_int64_entries,
|
| - number_of_code_ptr_entries,
|
| - number_of_heap_ptr_entries,
|
| - number_of_int32_entries),
|
| - kPointerSize);
|
| + inline int size();
|
| +
|
| + inline static int SizeFor(const NumberOfEntries& small) {
|
| + int size = kFirstEntryOffset +
|
| + (small.count_of(INT64) * kInt64Size) +
|
| + (small.count_of(CODE_PTR) * kPointerSize) +
|
| + (small.count_of(HEAP_PTR) * kPointerSize) +
|
| + (small.count_of(INT32) * kInt32Size);
|
| + return RoundUp(size, kPointerSize);
|
| + }
|
| +
|
| + inline static int SizeForExtended(const NumberOfEntries& small,
|
| + const NumberOfEntries& extended) {
|
| + int size = SizeFor(small);
|
| + size = RoundUp(size, kInt64Size); // Align extended header to 64 bits.
|
| + size += kExtendedFirstOffset +
|
| + (extended.count_of(INT64) * kInt64Size) +
|
| + (extended.count_of(CODE_PTR) * kPointerSize) +
|
| + (extended.count_of(HEAP_PTR) * kPointerSize) +
|
| + (extended.count_of(INT32) * kInt32Size);
|
| + return RoundUp(size, kPointerSize);
|
| + }
|
| +
|
| + inline static int entry_size(Type type) {
|
| + switch (type) {
|
| + case INT32:
|
| + return kInt32Size;
|
| + case INT64:
|
| + return kInt64Size;
|
| + case CODE_PTR:
|
| + case HEAP_PTR:
|
| + return kPointerSize;
|
| + default:
|
| + UNREACHABLE();
|
| + return 0;
|
| + }
|
| }
|
|
|
| // Code Generation support.
|
| inline int OffsetOfElementAt(int index) {
|
| - ASSERT(index < length());
|
| - if (index >= first_int32_index()) {
|
| - return OffsetAt(count_of_int64_entries(), count_of_code_ptr_entries(),
|
| - count_of_heap_ptr_entries(), index - first_int32_index());
|
| - } else if (index >= first_heap_ptr_index()) {
|
| - return OffsetAt(count_of_int64_entries(), count_of_code_ptr_entries(),
|
| - index - first_heap_ptr_index(), 0);
|
| - } else if (index >= first_code_ptr_index()) {
|
| - return OffsetAt(count_of_int64_entries(), index - first_code_ptr_index(),
|
| - 0, 0);
|
| + int offset;
|
| + LayoutSection section;
|
| + if (is_extended_layout() && index >= first_extended_section_index()) {
|
| + section = EXTENDED_SECTION;
|
| + offset = get_extended_section_header_offset() + kExtendedFirstOffset;
|
| } else {
|
| - return OffsetAt(index, 0, 0, 0);
|
| + section = SMALL_SECTION;
|
| + offset = kFirstEntryOffset;
|
| }
|
| +
|
| + // Add offsets for the preceding type sections.
|
| + ASSERT(index <= last_index(LAST_TYPE, section));
|
| + for (Type type = FIRST_TYPE; index > last_index(type, section);
|
| + type = next_type(type)) {
|
| + offset += entry_size(type) * number_of_entries(type, section);
|
| + }
|
| +
|
| + // Add offset for the index in it's type.
|
| + Type type = get_type(index);
|
| + offset += entry_size(type) * (index - first_index(type, section));
|
| + return offset;
|
| }
|
|
|
| // Casting.
|
| @@ -3183,17 +3334,37 @@ class ConstantPoolArray: public FixedArrayBase {
|
| return HeapObject::RawField(this, OffsetOfElementAt(index));
|
| }
|
|
|
| - // Layout description.
|
| - static const int kArrayLayoutOffset = FixedArray::kHeaderSize;
|
| - static const int kFirstOffset = kArrayLayoutOffset + kPointerSize;
|
| -
|
| - static const int kFieldBitSize = 10;
|
| - static const int kMaxEntriesPerType = (1 << kFieldBitSize) - 1;
|
| -
|
| - class NumberOfInt64EntriesField: public BitField<int, 0, kFieldBitSize> {};
|
| - class NumberOfCodePtrEntriesField: public BitField<int, 10, kFieldBitSize> {};
|
| - class NumberOfHeapPtrEntriesField: public BitField<int, 20, kFieldBitSize> {};
|
| - class WeakObjectStateField: public BitField<WeakObjectState, 30, 2> {};
|
| + // Small Layout description.
|
| + static const int kSmallLayout1Offset = HeapObject::kHeaderSize;
|
| + static const int kSmallLayout2Offset = kSmallLayout1Offset + kInt32Size;
|
| + static const int kHeaderSize = kSmallLayout2Offset + kInt32Size;
|
| + static const int kFirstEntryOffset = ROUND_UP(kHeaderSize, kInt64Size);
|
| +
|
| + static const int kSmallLayoutCountBits = 10;
|
| + static const int kMaxSmallEntriesPerType = (1 << kSmallLayoutCountBits) - 1;
|
| +
|
| + // Fields in kSmallLayout1Offset.
|
| + class Int64CountField: public BitField<int, 1, kSmallLayoutCountBits> {};
|
| + class CodePtrCountField: public BitField<int, 11, kSmallLayoutCountBits> {};
|
| + class HeapPtrCountField: public BitField<int, 21, kSmallLayoutCountBits> {};
|
| + class IsExtendedField: public BitField<bool, 31, 1> {};
|
| +
|
| + // Fields in kSmallLayout2Offset.
|
| + class Int32CountField: public BitField<int, 1, kSmallLayoutCountBits> {};
|
| + class TotalCountField: public BitField<int, 11, 12> {};
|
| + class WeakObjectStateField: public BitField<WeakObjectState, 23, 2> {};
|
| +
|
| + // Extended layout description, which starts at
|
| + // get_extended_section_header_offset().
|
| + static const int kExtendedInt64CountOffset = 0;
|
| + static const int kExtendedCodePtrCountOffset =
|
| + kExtendedInt64CountOffset + kPointerSize;
|
| + static const int kExtendedHeapPtrCountOffset =
|
| + kExtendedCodePtrCountOffset + kPointerSize;
|
| + static const int kExtendedInt32CountOffset =
|
| + kExtendedHeapPtrCountOffset + kPointerSize;
|
| + static const int kExtendedFirstOffset =
|
| + kExtendedInt32CountOffset + kPointerSize;
|
|
|
| // Dispatched behavior.
|
| void ConstantPoolIterateBody(ObjectVisitor* v);
|
| @@ -3202,15 +3373,13 @@ class ConstantPoolArray: public FixedArrayBase {
|
| DECLARE_VERIFIER(ConstantPoolArray)
|
|
|
| private:
|
| - inline static int OffsetAt(int number_of_int64_entries,
|
| - int number_of_code_ptr_entries,
|
| - int number_of_heap_ptr_entries,
|
| - int number_of_int32_entries) {
|
| - return kFirstOffset
|
| - + (number_of_int64_entries * kInt64Size)
|
| - + (number_of_code_ptr_entries * kPointerSize)
|
| - + (number_of_heap_ptr_entries * kPointerSize)
|
| - + (number_of_int32_entries * kInt32Size);
|
| + inline int first_extended_section_index();
|
| + inline int get_extended_section_header_offset();
|
| +
|
| + inline static Type next_type(Type type) {
|
| + ASSERT(type >= FIRST_TYPE && type < NUMBER_OF_TYPES);
|
| + int type_int = static_cast<int>(type);
|
| + return static_cast<Type>(++type_int);
|
| }
|
|
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(ConstantPoolArray);
|
|
|