| // Copyright 2019 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. |
| |
| #include 'src/objects/ordered-hash-table.h' |
| |
| // Using int as a dummy type-parameter to get access to these constants which |
| // don't actually depend on the derived class. This avoids accidentially |
| // depending on something from a concrete derived class. |
| const kSmallOrderedHashTableMaxCapacity: constexpr int31 |
| generates 'SmallOrderedHashTable<int>::kMaxCapacity'; |
| const kSmallOrderedHashTableNotFound: constexpr int31 |
| generates 'SmallOrderedHashTable<int>::kNotFound'; |
| const kSmallOrderedHashTableLoadFactor: constexpr int31 |
| generates 'SmallOrderedHashTable<int>::kLoadFactor'; |
| |
| @noVerifier |
| @abstract |
| extern class SmallOrderedHashTable extends HeapObject |
| generates 'TNode<HeapObject>' { |
| } |
| |
| extern macro SmallOrderedHashSetMapConstant(): Map; |
| const kSmallOrderedHashSetMap: Map = SmallOrderedHashSetMapConstant(); |
| |
| extern class SmallOrderedHashSet extends SmallOrderedHashTable { |
| number_of_elements: uint8; |
| number_of_deleted_elements: uint8; |
| const number_of_buckets: uint8; |
| @if(TAGGED_SIZE_8_BYTES) padding[5]: uint8; |
| @ifnot(TAGGED_SIZE_8_BYTES) padding[1]: uint8; |
| data_table[Convert<intptr>(number_of_buckets) * kSmallOrderedHashTableLoadFactor]: |
| JSAny|TheHole; |
| hash_table[number_of_buckets]: uint8; |
| chain_table[Convert<intptr>(number_of_buckets) * kSmallOrderedHashTableLoadFactor]: |
| uint8; |
| } |
| |
| @export |
| macro AllocateSmallOrderedHashSet(capacity: intptr): SmallOrderedHashSet { |
| const hashTableSize = capacity / kSmallOrderedHashTableLoadFactor; |
| assert( |
| 0 <= hashTableSize && hashTableSize <= kSmallOrderedHashTableMaxCapacity); |
| return new SmallOrderedHashSet{ |
| map: kSmallOrderedHashSetMap, |
| number_of_elements: 0, |
| number_of_deleted_elements: 0, |
| number_of_buckets: (Convert<uint8>(hashTableSize)), |
| padding: ...ConstantIterator<uint8>(0), |
| data_table: ...ConstantIterator(TheHole), |
| hash_table: ...ConstantIterator<uint8>(kSmallOrderedHashTableNotFound), |
| chain_table: ...ConstantIterator<uint8>(kSmallOrderedHashTableNotFound) |
| }; |
| } |
| |
| struct HashMapEntry { |
| key: JSAny|TheHole; |
| value: JSAny|TheHole; |
| } |
| |
| extern macro SmallOrderedHashMapMapConstant(): Map; |
| const kSmallOrderedHashMapMap: Map = SmallOrderedHashMapMapConstant(); |
| |
| extern class SmallOrderedHashMap extends SmallOrderedHashTable { |
| number_of_elements: uint8; |
| number_of_deleted_elements: uint8; |
| const number_of_buckets: uint8; |
| @if(TAGGED_SIZE_8_BYTES) padding[5]: uint8; |
| @ifnot(TAGGED_SIZE_8_BYTES) padding[1]: uint8; |
| data_table[Convert<intptr>(number_of_buckets) * kSmallOrderedHashTableLoadFactor]: |
| HashMapEntry; |
| hash_table[number_of_buckets]: uint8; |
| chain_table[Convert<intptr>(number_of_buckets) * kSmallOrderedHashTableLoadFactor]: |
| uint8; |
| } |
| |
| @export |
| macro AllocateSmallOrderedHashMap(capacity: intptr): SmallOrderedHashMap { |
| const hashTableSize = capacity / kSmallOrderedHashTableLoadFactor; |
| assert( |
| 0 <= hashTableSize && hashTableSize <= kSmallOrderedHashTableMaxCapacity); |
| return new SmallOrderedHashMap{ |
| map: kSmallOrderedHashMapMap, |
| number_of_elements: 0, |
| number_of_deleted_elements: 0, |
| number_of_buckets: (Convert<uint8>(hashTableSize)), |
| padding: ...ConstantIterator<uint8>(0), |
| data_table: ...ConstantIterator(HashMapEntry{key: TheHole, value: TheHole}), |
| hash_table: ...ConstantIterator<uint8>(kSmallOrderedHashTableNotFound), |
| chain_table: ...ConstantIterator<uint8>(kSmallOrderedHashTableNotFound) |
| }; |
| } |
| |
| struct NameDictionaryEntry { |
| key: JSAny|TheHole; |
| value: JSAny|TheHole; |
| property_details: Smi|TheHole; |
| } |
| |
| extern class SmallOrderedNameDictionary extends SmallOrderedHashTable { |
| hash: int32; |
| number_of_elements: uint8; |
| number_of_deleted_elements: uint8; |
| const number_of_buckets: uint8; |
| padding: uint8; |
| data_table[Convert<intptr>(number_of_buckets) * kSmallOrderedHashTableLoadFactor]: |
| NameDictionaryEntry; |
| hash_table[number_of_buckets]: uint8; |
| chain_table[number_of_buckets]: uint8; |
| } |