Commit fbc82ec3 authored by Sathya Gunasekaran's avatar Sathya Gunasekaran Committed by Commit Bot

[dict] Prefix a slot in ordered dicts

The prefix size is read from the Derived class.
The hash code of the object will be stored in this prefix.

Change-Id: I15646701c9bab99b8aed39ea9ad8ae03f6d605ed
Bug: v8:6443, v8:7569
Reviewed-on: https://chromium-review.googlesource.com/c/1337586
Commit-Queue: Sathya Gunasekaran <gsathya@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58058}
parent 014eb84f
This diff is collapsed.
......@@ -3454,12 +3454,12 @@ Node* CodeStubAssembler::AllocateOrderedHashTable() {
static const int kBucketCount = kCapacity / CollectionType::kLoadFactor;
static const int kDataTableLength = kCapacity * CollectionType::kEntrySize;
static const int kFixedArrayLength =
CollectionType::kHashTableStartIndex + kBucketCount + kDataTableLength;
CollectionType::HashTableStartIndex() + kBucketCount + kDataTableLength;
static const int kDataTableStartIndex =
CollectionType::kHashTableStartIndex + kBucketCount;
CollectionType::HashTableStartIndex() + kBucketCount;
STATIC_ASSERT(base::bits::IsPowerOfTwo(kCapacity));
STATIC_ASSERT(kCapacity <= CollectionType::kMaxCapacity);
STATIC_ASSERT(kCapacity <= CollectionType::MaxCapacity());
// Allocate the table and add the proper map.
const ElementsKind elements_kind = HOLEY_ELEMENTS;
......@@ -3472,21 +3472,21 @@ Node* CodeStubAssembler::AllocateOrderedHashTable() {
// Initialize the OrderedHashTable fields.
const WriteBarrierMode barrier_mode = SKIP_WRITE_BARRIER;
StoreFixedArrayElement(table, CollectionType::kNumberOfElementsIndex,
StoreFixedArrayElement(table, CollectionType::NumberOfElementsIndex(),
SmiConstant(0), barrier_mode);
StoreFixedArrayElement(table, CollectionType::kNumberOfDeletedElementsIndex,
StoreFixedArrayElement(table, CollectionType::NumberOfDeletedElementsIndex(),
SmiConstant(0), barrier_mode);
StoreFixedArrayElement(table, CollectionType::kNumberOfBucketsIndex,
StoreFixedArrayElement(table, CollectionType::NumberOfBucketsIndex(),
SmiConstant(kBucketCount), barrier_mode);
// Fill the buckets with kNotFound.
TNode<Smi> not_found = SmiConstant(CollectionType::kNotFound);
STATIC_ASSERT(CollectionType::kHashTableStartIndex ==
CollectionType::kNumberOfBucketsIndex + 1);
STATIC_ASSERT((CollectionType::kHashTableStartIndex + kBucketCount) ==
STATIC_ASSERT(CollectionType::HashTableStartIndex() ==
CollectionType::NumberOfBucketsIndex() + 1);
STATIC_ASSERT((CollectionType::HashTableStartIndex() + kBucketCount) ==
kDataTableStartIndex);
for (int i = 0; i < kBucketCount; i++) {
StoreFixedArrayElement(table, CollectionType::kHashTableStartIndex + i,
StoreFixedArrayElement(table, CollectionType::HashTableStartIndex() + i,
not_found, barrier_mode);
}
......@@ -3511,7 +3511,7 @@ TNode<CollectionType> CodeStubAssembler::AllocateSmallOrderedHashTable(
capacity, IntPtrConstant(CollectionType::kMaxCapacity)));
TNode<IntPtrT> data_table_start_offset =
IntPtrConstant(CollectionType::kDataTableStartOffset);
IntPtrConstant(CollectionType::DataTableStartOffset());
TNode<IntPtrT> data_table_size = IntPtrMul(
capacity, IntPtrConstant(CollectionType::kEntrySize * kPointerSize));
......@@ -3546,12 +3546,12 @@ TNode<CollectionType> CodeStubAssembler::AllocateSmallOrderedHashTable(
// Initialize the SmallOrderedHashTable fields.
StoreObjectByteNoWriteBarrier(
table, CollectionType::kNumberOfBucketsOffset,
table, CollectionType::NumberOfBucketsOffset(),
Word32And(Int32Constant(0xFF), hash_table_size));
StoreObjectByteNoWriteBarrier(table, CollectionType::kNumberOfElementsOffset,
StoreObjectByteNoWriteBarrier(table, CollectionType::NumberOfElementsOffset(),
Int32Constant(0));
StoreObjectByteNoWriteBarrier(
table, CollectionType::kNumberOfDeletedElementsOffset, Int32Constant(0));
table, CollectionType::NumberOfDeletedElementsOffset(), Int32Constant(0));
TNode<IntPtrT> table_address =
IntPtrSub(BitcastTaggedToWord(table), IntPtrConstant(kHeapObjectTag));
......@@ -3591,12 +3591,12 @@ void CodeStubAssembler::FindOrderedHashTableEntry(
Variable* entry_start_position, Label* entry_found, Label* not_found) {
// Get the index of the bucket.
Node* const number_of_buckets = SmiUntag(CAST(LoadFixedArrayElement(
CAST(table), CollectionType::kNumberOfBucketsIndex)));
CAST(table), CollectionType::NumberOfBucketsIndex())));
Node* const bucket =
WordAnd(hash, IntPtrSub(number_of_buckets, IntPtrConstant(1)));
Node* const first_entry = SmiUntag(CAST(LoadFixedArrayElement(
CAST(table), bucket,
CollectionType::kHashTableStartIndex * kPointerSize)));
CollectionType::HashTableStartIndex() * kPointerSize)));
// Walk the bucket chain.
Node* entry_start;
......@@ -3615,14 +3615,15 @@ void CodeStubAssembler::FindOrderedHashTableEntry(
// Make sure the entry index is within range.
CSA_ASSERT(
this, UintPtrLessThan(
var_entry.value(),
SmiUntag(SmiAdd(
CAST(LoadFixedArrayElement(
CAST(table), CollectionType::kNumberOfElementsIndex)),
CAST(LoadFixedArrayElement(
CAST(table),
CollectionType::kNumberOfDeletedElementsIndex))))));
this,
UintPtrLessThan(
var_entry.value(),
SmiUntag(SmiAdd(
CAST(LoadFixedArrayElement(
CAST(table), CollectionType::NumberOfElementsIndex())),
CAST(LoadFixedArrayElement(
CAST(table),
CollectionType::NumberOfDeletedElementsIndex()))))));
// Compute the index of the entry relative to kHashTableStartIndex.
entry_start =
......@@ -3633,7 +3634,7 @@ void CodeStubAssembler::FindOrderedHashTableEntry(
// Load the key from the entry.
Node* const candidate_key = LoadFixedArrayElement(
CAST(table), entry_start,
CollectionType::kHashTableStartIndex * kPointerSize);
CollectionType::HashTableStartIndex() * kPointerSize);
key_compare(candidate_key, &if_key_found, &continue_next_entry);
......@@ -3641,7 +3642,7 @@ void CodeStubAssembler::FindOrderedHashTableEntry(
// Load the index of the next entry in the bucket chain.
var_entry.Bind(SmiUntag(CAST(LoadFixedArrayElement(
CAST(table), entry_start,
(CollectionType::kHashTableStartIndex + CollectionType::kChainOffset) *
(CollectionType::HashTableStartIndex() + CollectionType::kChainOffset) *
kPointerSize))));
Goto(&loop);
......
......@@ -1039,10 +1039,10 @@ FieldAccess AccessBuilder::ForHashTableBaseCapacity() {
FieldAccess AccessBuilder::ForOrderedHashMapOrSetNextTable() {
// TODO(turbofan): This will be redundant with the HashTableBase
// methods above once the hash table unification is done.
STATIC_ASSERT(OrderedHashMap::kNextTableOffset ==
OrderedHashSet::kNextTableOffset);
STATIC_ASSERT(OrderedHashMap::NextTableOffset() ==
OrderedHashSet::NextTableOffset());
FieldAccess const access = {
kTaggedBase, OrderedHashMap::kNextTableOffset,
kTaggedBase, OrderedHashMap::NextTableOffset(),
MaybeHandle<Name>(), MaybeHandle<Map>(),
Type::Any(), MachineType::AnyTagged(),
kFullWriteBarrier};
......@@ -1053,10 +1053,10 @@ FieldAccess AccessBuilder::ForOrderedHashMapOrSetNextTable() {
FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfBuckets() {
// TODO(turbofan): This will be redundant with the HashTableBase
// methods above once the hash table unification is done.
STATIC_ASSERT(OrderedHashMap::kNumberOfBucketsOffset ==
OrderedHashSet::kNumberOfBucketsOffset);
STATIC_ASSERT(OrderedHashMap::NumberOfBucketsOffset() ==
OrderedHashSet::NumberOfBucketsOffset());
FieldAccess const access = {kTaggedBase,
OrderedHashMap::kNumberOfBucketsOffset,
OrderedHashMap::NumberOfBucketsOffset(),
MaybeHandle<Name>(),
MaybeHandle<Map>(),
TypeCache::Get().kFixedArrayLengthType,
......@@ -1069,10 +1069,10 @@ FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfBuckets() {
FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfDeletedElements() {
// TODO(turbofan): This will be redundant with the HashTableBase
// methods above once the hash table unification is done.
STATIC_ASSERT(OrderedHashMap::kNumberOfDeletedElementsOffset ==
OrderedHashSet::kNumberOfDeletedElementsOffset);
STATIC_ASSERT(OrderedHashMap::NumberOfDeletedElementsOffset() ==
OrderedHashSet::NumberOfDeletedElementsOffset());
FieldAccess const access = {kTaggedBase,
OrderedHashMap::kNumberOfDeletedElementsOffset,
OrderedHashMap::NumberOfDeletedElementsOffset(),
MaybeHandle<Name>(),
MaybeHandle<Map>(),
TypeCache::Get().kFixedArrayLengthType,
......@@ -1085,10 +1085,10 @@ FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfDeletedElements() {
FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfElements() {
// TODO(turbofan): This will be redundant with the HashTableBase
// methods above once the hash table unification is done.
STATIC_ASSERT(OrderedHashMap::kNumberOfElementsOffset ==
OrderedHashSet::kNumberOfElementsOffset);
STATIC_ASSERT(OrderedHashMap::NumberOfElementsOffset() ==
OrderedHashSet::NumberOfElementsOffset());
FieldAccess const access = {kTaggedBase,
OrderedHashMap::kNumberOfElementsOffset,
OrderedHashMap::NumberOfElementsOffset(),
MaybeHandle<Name>(),
MaybeHandle<Map>(),
TypeCache::Get().kFixedArrayLengthType,
......@@ -1100,7 +1100,7 @@ FieldAccess AccessBuilder::ForOrderedHashMapOrSetNumberOfElements() {
// static
ElementAccess AccessBuilder::ForOrderedHashMapEntryValue() {
ElementAccess const access = {kTaggedBase,
OrderedHashMap::kHashTableStartOffset +
OrderedHashMap::HashTableStartOffset() +
OrderedHashMap::kValueOffset * kPointerSize,
Type::Any(), MachineType::AnyTagged(),
kFullWriteBarrier};
......
......@@ -5233,7 +5233,7 @@ Node* EffectControlLinearizer::LowerFindOrderedHashMapEntryForInt32Key(
Node* first_entry = ChangeSmiToIntPtr(__ Load(
MachineType::TaggedSigned(), table,
__ IntAdd(__ WordShl(hash, __ IntPtrConstant(kPointerSizeLog2)),
__ IntPtrConstant(OrderedHashMap::kHashTableStartOffset -
__ IntPtrConstant(OrderedHashMap::HashTableStartOffset() -
kHeapObjectTag))));
auto loop = __ MakeLoopLabel(MachineType::PointerRepresentation());
......@@ -5252,7 +5252,7 @@ Node* EffectControlLinearizer::LowerFindOrderedHashMapEntryForInt32Key(
Node* candidate_key = __ Load(
MachineType::AnyTagged(), table,
__ IntAdd(__ WordShl(entry, __ IntPtrConstant(kPointerSizeLog2)),
__ IntPtrConstant(OrderedHashMap::kHashTableStartOffset -
__ IntPtrConstant(OrderedHashMap::HashTableStartOffset() -
kHeapObjectTag)));
auto if_match = __ MakeLabel();
......@@ -5281,7 +5281,7 @@ Node* EffectControlLinearizer::LowerFindOrderedHashMapEntryForInt32Key(
MachineType::TaggedSigned(), table,
__ IntAdd(
__ WordShl(entry, __ IntPtrConstant(kPointerSizeLog2)),
__ IntPtrConstant(OrderedHashMap::kHashTableStartOffset +
__ IntPtrConstant(OrderedHashMap::HashTableStartOffset() +
OrderedHashMap::kChainOffset * kPointerSize -
kHeapObjectTag))));
__ Goto(&loop, next_entry);
......
......@@ -6604,8 +6604,8 @@ Reduction JSCallReducer::ReduceCollectionIteratorPrototypeNext(
Node* etrue0 = effect;
{
// Load the key of the entry.
STATIC_ASSERT(OrderedHashMap::kHashTableStartIndex ==
OrderedHashSet::kHashTableStartIndex);
STATIC_ASSERT(OrderedHashMap::HashTableStartIndex() ==
OrderedHashSet::HashTableStartIndex());
Node* entry_start_position = graph()->NewNode(
simplified()->NumberAdd(),
graph()->NewNode(
......@@ -6613,7 +6613,7 @@ Reduction JSCallReducer::ReduceCollectionIteratorPrototypeNext(
graph()->NewNode(simplified()->NumberMultiply(), index,
jsgraph()->Constant(entry_size)),
number_of_buckets),
jsgraph()->Constant(OrderedHashMap::kHashTableStartIndex));
jsgraph()->Constant(OrderedHashMap::HashTableStartIndex()));
Node* entry_key = etrue0 = graph()->NewNode(
simplified()->LoadElement(AccessBuilder::ForFixedArrayElement()),
table, entry_start_position, etrue0, if_true0);
......
......@@ -804,7 +804,7 @@ void Heap::CreateInitialObjects() {
// Allocate the empty OrderedHashMap.
Handle<FixedArray> empty_ordered_hash_map = factory->NewFixedArray(
OrderedHashMap::kHashTableStartIndex, TENURED_READ_ONLY);
OrderedHashMap::HashTableStartIndex(), TENURED_READ_ONLY);
empty_ordered_hash_map->set_map_no_write_barrier(
*factory->ordered_hash_map_map());
for (int i = 0; i < empty_ordered_hash_map->length(); ++i) {
......@@ -814,7 +814,7 @@ void Heap::CreateInitialObjects() {
// Allocate the empty OrderedHashSet.
Handle<FixedArray> empty_ordered_hash_set = factory->NewFixedArray(
OrderedHashSet::kHashTableStartIndex, TENURED_READ_ONLY);
OrderedHashSet::HashTableStartIndex(), TENURED_READ_ONLY);
empty_ordered_hash_set->set_map_no_write_barrier(
*factory->ordered_hash_set_map());
for (int i = 0; i < empty_ordered_hash_set->length(); ++i) {
......
......@@ -89,7 +89,7 @@ void KeyAccumulator::AddKey(Handle<Object> key, AddKeyConversion convert) {
// The keys_ Set is converted directly to a FixedArray in GetKeys which can
// be left-trimmer. Hence the previous Set should not keep a pointer to the
// new one.
keys_->set(OrderedHashSet::kNextTableIndex, Smi::kZero);
keys_->set(OrderedHashSet::NextTableIndex(), Smi::kZero);
// TODO(3770): Drop explicit conversion.
keys_ = Handle<FixedArray>(new_set.location());
}
......
......@@ -277,7 +277,7 @@ class SmallOrderedHashTable<Derived>::BodyDescriptor final
public:
static bool IsValidSlot(Map map, HeapObject* obj, int offset) {
Derived table = Derived::cast(obj);
if (offset < kDataTableStartOffset) return false;
if (offset < DataTableStartOffset()) return false;
if (offset >= table->GetBucketsStartOffset()) return false;
return IsValidSlotImpl(map, obj, offset);
}
......@@ -287,7 +287,7 @@ class SmallOrderedHashTable<Derived>::BodyDescriptor final
ObjectVisitor* v) {
Derived table = Derived::cast(obj);
int offset = kDataTableStartOffset;
int offset = DataTableStartOffset();
int entry = 0;
for (int i = 0; i < table->Capacity(); i++) {
for (int j = 0; j < Derived::kEntrySize; j++) {
......
......@@ -21,16 +21,16 @@ Handle<Derived> OrderedHashTable<Derived, entrysize>::Allocate(
// to something other than 2, capacity should be stored as another
// field of this object.
capacity = base::bits::RoundUpToPowerOfTwo32(Max(kMinCapacity, capacity));
if (capacity > kMaxCapacity) {
if (capacity > MaxCapacity()) {
isolate->heap()->FatalProcessOutOfMemory("invalid table size");
}
int num_buckets = capacity / kLoadFactor;
Handle<FixedArray> backing_store = isolate->factory()->NewFixedArrayWithMap(
Derived::GetMapRootIndex(),
kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure);
HashTableStartIndex() + num_buckets + (capacity * kEntrySize), pretenure);
Handle<Derived> table = Handle<Derived>::cast(backing_store);
for (int i = 0; i < num_buckets; ++i) {
table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound));
table->set(HashTableStartIndex() + i, Smi::FromInt(kNotFound));
}
table->SetNumberOfBuckets(num_buckets);
table->SetNumberOfElements(0);
......@@ -141,7 +141,7 @@ Handle<OrderedHashSet> OrderedHashSet::Add(Isolate* isolate,
table->set(new_index, *key);
table->set(new_index + kChainOffset, Smi::FromInt(previous_entry));
// and point the bucket to the new entry.
table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry));
table->set(HashTableStartIndex() + bucket, Smi::FromInt(new_entry));
table->SetNumberOfElements(nof + 1);
return table;
}
......@@ -157,7 +157,7 @@ Handle<FixedArray> OrderedHashSet::ConvertToKeysArray(
int const kMaxStringTableEntries =
isolate->heap()->MaxNumberToStringCacheSize();
for (int i = 0; i < length; i++) {
int index = kHashTableStartIndex + nof_buckets + (i * kEntrySize);
int index = HashTableStartIndex() + nof_buckets + (i * kEntrySize);
Object* key = table->get(index);
if (convert == GetKeysConversion::kConvertToString) {
uint32_t index_value;
......@@ -205,8 +205,8 @@ Handle<Derived> OrderedHashTable<Derived, entrysize>::Rehash(
Object* hash = key->GetHash();
int bucket = Smi::ToInt(hash) & (new_buckets - 1);
Object* chain_entry = new_table->get(kHashTableStartIndex + bucket);
new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry));
Object* chain_entry = new_table->get(HashTableStartIndex() + bucket);
new_table->set(HashTableStartIndex() + bucket, Smi::FromInt(new_entry));
int new_index = new_table->EntryToIndex(new_entry);
int old_index = table->EntryToIndex(old_entry);
for (int i = 0; i < entrysize; ++i) {
......@@ -288,7 +288,7 @@ Handle<OrderedHashMap> OrderedHashMap::Add(Isolate* isolate,
table->set(new_index + kValueOffset, *value);
table->set(new_index + kChainOffset, Smi::FromInt(previous_entry));
// and point the bucket to the new entry.
table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry));
table->set(HashTableStartIndex() + bucket, Smi::FromInt(new_entry));
table->SetNumberOfElements(nof + 1);
return table;
}
......@@ -333,7 +333,7 @@ Handle<OrderedNameDictionary> OrderedNameDictionary::Add(
table->set(new_index + kChainOffset, Smi::FromInt(previous_entry));
// and point the bucket to the new entry.
table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry));
table->set(HashTableStartIndex() + bucket, Smi::FromInt(new_entry));
table->SetNumberOfElements(nof + 1);
return table;
}
......@@ -461,7 +461,7 @@ void SmallOrderedHashTable<Derived>::Initialize(Isolate* isolate,
num_buckets + num_chains);
if (Heap::InNewSpace(*this)) {
MemsetTagged(RawField(kDataTableStartOffset),
MemsetTagged(RawField(DataTableStartOffset()),
ReadOnlyRoots(isolate).the_hole_value(),
capacity * Derived::kEntrySize);
} else {
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment