ordered-hash-table-inl.h 7.34 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_OBJECTS_ORDERED_HASH_TABLE_INL_H_
#define V8_OBJECTS_ORDERED_HASH_TABLE_INL_H_

#include "src/objects/ordered-hash-table.h"

10
#include "src/heap/heap.h"
11
#include "src/objects/compressed-slots.h"
12
#include "src/objects/fixed-array-inl.h"
13
#include "src/objects/js-collection-iterator.h"
14
#include "src/objects/objects-inl.h"
15
#include "src/objects/slots.h"
16

17 18 19
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"

20 21 22
namespace v8 {
namespace internal {

23 24 25 26 27 28
CAST_ACCESSOR(OrderedNameDictionary)
CAST_ACCESSOR(SmallOrderedNameDictionary)
CAST_ACCESSOR(OrderedHashMap)
CAST_ACCESSOR(OrderedHashSet)
CAST_ACCESSOR(SmallOrderedHashMap)
CAST_ACCESSOR(SmallOrderedHashSet)
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

template <class Derived, int entrysize>
OrderedHashTable<Derived, entrysize>::OrderedHashTable(Address ptr)
    : FixedArray(ptr) {}

OrderedHashSet::OrderedHashSet(Address ptr)
    : OrderedHashTable<OrderedHashSet, 1>(ptr) {
  SLOW_DCHECK(IsOrderedHashSet());
}

OrderedHashMap::OrderedHashMap(Address ptr)
    : OrderedHashTable<OrderedHashMap, 2>(ptr) {
  SLOW_DCHECK(IsOrderedHashMap());
}

OrderedNameDictionary::OrderedNameDictionary(Address ptr)
    : OrderedHashTable<OrderedNameDictionary, 3>(ptr) {
  SLOW_DCHECK(IsOrderedNameDictionary());
}

template <class Derived>
SmallOrderedHashTable<Derived>::SmallOrderedHashTable(Address ptr)
51
    : HeapObject(ptr) {}
52

53 54 55 56
template <class Derived>
Object SmallOrderedHashTable<Derived>::KeyAt(int entry) const {
  DCHECK_LT(entry, Capacity());
  Offset entry_offset = GetDataEntryOffset(entry, Derived::kKeyIndex);
57
  return TaggedField<Object>::load(*this, entry_offset);
58 59 60 61 62 63 64 65
}

template <class Derived>
Object SmallOrderedHashTable<Derived>::GetDataEntry(int entry,
                                                    int relative_index) {
  DCHECK_LT(entry, Capacity());
  DCHECK_LE(static_cast<unsigned>(relative_index), Derived::kEntrySize);
  Offset entry_offset = GetDataEntryOffset(entry, relative_index);
66
  return TaggedField<Object>::load(*this, entry_offset);
67 68
}

69 70 71 72 73 74 75
OBJECT_CONSTRUCTORS_IMPL(SmallOrderedHashSet,
                         SmallOrderedHashTable<SmallOrderedHashSet>)
OBJECT_CONSTRUCTORS_IMPL(SmallOrderedHashMap,
                         SmallOrderedHashTable<SmallOrderedHashMap>)
OBJECT_CONSTRUCTORS_IMPL(SmallOrderedNameDictionary,
                         SmallOrderedHashTable<SmallOrderedNameDictionary>)

76 77
Handle<Map> OrderedHashSet::GetMap(ReadOnlyRoots roots) {
  return roots.ordered_hash_set_map_handle();
78 79
}

80 81
Handle<Map> OrderedHashMap::GetMap(ReadOnlyRoots roots) {
  return roots.ordered_hash_map_map_handle();
82 83
}

84 85
Handle<Map> OrderedNameDictionary::GetMap(ReadOnlyRoots roots) {
  return roots.ordered_name_dictionary_map_handle();
86 87
}

88 89
Handle<Map> SmallOrderedNameDictionary::GetMap(ReadOnlyRoots roots) {
  return roots.small_ordered_name_dictionary_map_handle();
90 91
}

92 93
Handle<Map> SmallOrderedHashMap::GetMap(ReadOnlyRoots roots) {
  return roots.small_ordered_hash_map_map_handle();
94 95
}

96 97
Handle<Map> SmallOrderedHashSet::GetMap(ReadOnlyRoots roots) {
  return roots.small_ordered_hash_set_map_handle();
98 99
}

100
inline Object OrderedHashMap::ValueAt(int entry) {
101 102 103 104 105
  DCHECK_NE(entry, kNotFound);
  DCHECK_LT(entry, UsedCapacity());
  return get(EntryToIndex(entry) + kValueOffset);
}

106
inline Object OrderedNameDictionary::ValueAt(int entry) {
107 108
  DCHECK_NE(entry, kNotFound);
  DCHECK_LT(entry, UsedCapacity());
109 110 111
  return get(EntryToIndex(entry) + kValueOffset);
}

112
// Set the value for entry.
113
inline void OrderedNameDictionary::ValueAtPut(int entry, Object value) {
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
  DCHECK_NE(entry, kNotFound);
  DCHECK_LT(entry, UsedCapacity());
  this->set(EntryToIndex(entry) + kValueOffset, value);
}

// Returns the property details for the property at entry.
inline PropertyDetails OrderedNameDictionary::DetailsAt(int entry) {
  DCHECK_NE(entry, kNotFound);
  DCHECK_LT(entry, this->UsedCapacity());
  // TODO(gsathya): Optimize the cast away.
  return PropertyDetails(
      Smi::cast(get(EntryToIndex(entry) + kPropertyDetailsOffset)));
}

inline void OrderedNameDictionary::DetailsAtPut(int entry,
                                                PropertyDetails value) {
  DCHECK_NE(entry, kNotFound);
  DCHECK_LT(entry, this->UsedCapacity());
  // TODO(gsathya): Optimize the cast away.
  this->set(EntryToIndex(entry) + kPropertyDetailsOffset, value.AsSmi());
}

136
inline Object SmallOrderedNameDictionary::ValueAt(int entry) {
137 138 139 140
  return this->GetDataEntry(entry, kValueIndex);
}

// Set the value for entry.
141
inline void SmallOrderedNameDictionary::ValueAtPut(int entry, Object value) {
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
  this->SetDataEntry(entry, kValueIndex, value);
}

// Returns the property details for the property at entry.
inline PropertyDetails SmallOrderedNameDictionary::DetailsAt(int entry) {
  // TODO(gsathya): Optimize the cast away. And store this in the data table.
  return PropertyDetails(
      Smi::cast(this->GetDataEntry(entry, kPropertyDetailsIndex)));
}

// Set the details for entry.
inline void SmallOrderedNameDictionary::DetailsAtPut(int entry,
                                                     PropertyDetails value) {
  // TODO(gsathya): Optimize the cast away. And store this in the data table.
  this->SetDataEntry(entry, kPropertyDetailsIndex, value.AsSmi());
}

159 160 161 162 163 164 165 166
inline bool OrderedHashSet::Is(Handle<HeapObject> table) {
  return table->IsOrderedHashSet();
}

inline bool OrderedHashMap::Is(Handle<HeapObject> table) {
  return table->IsOrderedHashMap();
}

167 168 169 170
inline bool OrderedNameDictionary::Is(Handle<HeapObject> table) {
  return table->IsOrderedNameDictionary();
}

171 172 173 174
inline bool SmallOrderedHashSet::Is(Handle<HeapObject> table) {
  return table->IsSmallOrderedHashSet();
}

175 176 177 178
inline bool SmallOrderedNameDictionary::Is(Handle<HeapObject> table) {
  return table->IsSmallOrderedNameDictionary();
}

179 180 181
inline bool SmallOrderedHashMap::Is(Handle<HeapObject> table) {
  return table->IsSmallOrderedHashMap();
}
182 183 184

template <class Derived>
void SmallOrderedHashTable<Derived>::SetDataEntry(int entry, int relative_index,
185
                                                  Object value) {
186
  DCHECK_NE(kNotFound, entry);
187
  int entry_offset = GetDataEntryOffset(entry, relative_index);
188 189
  RELAXED_WRITE_FIELD(*this, entry_offset, value);
  WRITE_BARRIER(*this, entry_offset, value);
190 191 192
}

template <class Derived, class TableType>
193
Object OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
194 195
  TableType table = TableType::cast(this->table());
  int index = Smi::ToInt(this->index());
196 197
  Object key = table.KeyAt(index);
  DCHECK(!key.IsTheHole());
198 199 200
  return key;
}

201 202
inline void SmallOrderedNameDictionary::SetHash(int hash) {
  DCHECK(PropertyArray::HashField::is_valid(hash));
203
  WriteField<int>(PrefixOffset(), hash);
204 205 206
}

inline int SmallOrderedNameDictionary::Hash() {
207
  int hash = ReadField<int>(PrefixOffset());
208 209 210 211 212 213 214 215 216 217
  DCHECK(PropertyArray::HashField::is_valid(hash));
  return hash;
}

inline void OrderedNameDictionary::SetHash(int hash) {
  DCHECK(PropertyArray::HashField::is_valid(hash));
  this->set(PrefixIndex(), Smi::FromInt(hash));
}

inline int OrderedNameDictionary::Hash() {
218
  Object hash_obj = this->get(PrefixIndex());
219 220 221 222 223
  int hash = Smi::ToInt(hash_obj);
  DCHECK(PropertyArray::HashField::is_valid(hash));
  return hash;
}

224 225 226
}  // namespace internal
}  // namespace v8

227 228
#include "src/objects/object-macros-undef.h"

229
#endif  // V8_OBJECTS_ORDERED_HASH_TABLE_INL_H_