Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: src/objects.h

Issue 237043002: Revert "Reland "HashTable::Shrink() handlified and derived template parameter added to HashTable hi… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3638 matching lines...) Expand 10 before | Expand all | Expand 10 after
3649 ASSERT(UsesSeed); 3649 ASSERT(UsesSeed);
3650 return Hash(key); 3650 return Hash(key);
3651 } 3651 }
3652 static uint32_t HashForObject(Key key, Object* object) { return 0; } 3652 static uint32_t HashForObject(Key key, Object* object) { return 0; }
3653 static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) { 3653 static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) {
3654 ASSERT(UsesSeed); 3654 ASSERT(UsesSeed);
3655 return HashForObject(key, object); 3655 return HashForObject(key, object);
3656 } 3656 }
3657 }; 3657 };
3658 3658
3659 template<typename Derived, typename Shape, typename Key> 3659 template<typename Shape, typename Key>
3660 class HashTable: public FixedArray { 3660 class HashTable: public FixedArray {
3661 public: 3661 public:
3662 // Wrapper methods 3662 // Wrapper methods
3663 inline uint32_t Hash(Key key) { 3663 inline uint32_t Hash(Key key) {
3664 if (Shape::UsesSeed) { 3664 if (Shape::UsesSeed) {
3665 return Shape::SeededHash(key, 3665 return Shape::SeededHash(key,
3666 GetHeap()->HashSeed()); 3666 GetHeap()->HashSeed());
3667 } else { 3667 } else {
3668 return Shape::Hash(key); 3668 return Shape::Hash(key);
3669 } 3669 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3702 void ElementRemoved() { 3702 void ElementRemoved() {
3703 SetNumberOfElements(NumberOfElements() - 1); 3703 SetNumberOfElements(NumberOfElements() - 1);
3704 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); 3704 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
3705 } 3705 }
3706 void ElementsRemoved(int n) { 3706 void ElementsRemoved(int n) {
3707 SetNumberOfElements(NumberOfElements() - n); 3707 SetNumberOfElements(NumberOfElements() - n);
3708 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); 3708 SetNumberOfDeletedElements(NumberOfDeletedElements() + n);
3709 } 3709 }
3710 3710
3711 // Returns a new HashTable object. Might return Failure. 3711 // Returns a new HashTable object. Might return Failure.
3712 // TODO(ishell): this will be eventually replaced by New().
3713 MUST_USE_RESULT static MaybeObject* Allocate( 3712 MUST_USE_RESULT static MaybeObject* Allocate(
3714 Heap* heap, 3713 Heap* heap,
3715 int at_least_space_for, 3714 int at_least_space_for,
3716 MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, 3715 MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY,
3717 PretenureFlag pretenure = NOT_TENURED); 3716 PretenureFlag pretenure = NOT_TENURED);
3718 3717
3719 // Returns a new HashTable object.
3720 static Handle<Derived> New(
3721 Isolate* isolate,
3722 int at_least_space_for,
3723 MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY,
3724 PretenureFlag pretenure = NOT_TENURED);
3725
3726 // Computes the required capacity for a table holding the given 3718 // Computes the required capacity for a table holding the given
3727 // number of elements. May be more than HashTable::kMaxCapacity. 3719 // number of elements. May be more than HashTable::kMaxCapacity.
3728 static int ComputeCapacity(int at_least_space_for); 3720 static int ComputeCapacity(int at_least_space_for);
3729 3721
3730 // Returns the key at entry. 3722 // Returns the key at entry.
3731 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } 3723 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
3732 3724
3733 // Tells whether k is a real key. The hole and undefined are not allowed 3725 // Tells whether k is a real key. The hole and undefined are not allowed
3734 // as keys and can be used to indicate missing or deleted elements. 3726 // as keys and can be used to indicate missing or deleted elements.
3735 bool IsKey(Object* k) { 3727 bool IsKey(Object* k) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
3825 } 3817 }
3826 3818
3827 // Returns _expected_ if one of entries given by the first _probe_ probes is 3819 // Returns _expected_ if one of entries given by the first _probe_ probes is
3828 // equal to _expected_. Otherwise, returns the entry given by the probe 3820 // equal to _expected_. Otherwise, returns the entry given by the probe
3829 // number _probe_. 3821 // number _probe_.
3830 uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected); 3822 uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected);
3831 3823
3832 void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); 3824 void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode);
3833 3825
3834 // Rehashes this hash-table into the new table. 3826 // Rehashes this hash-table into the new table.
3835 void Rehash(Derived* new_table, Key key); 3827 MUST_USE_RESULT MaybeObject* Rehash(HashTable* new_table, Key key);
3836 3828
3837 // Attempt to shrink hash table after removal of key. 3829 // Attempt to shrink hash table after removal of key.
3838 static Handle<Derived> Shrink(Handle<Derived> table, Key key); 3830 MUST_USE_RESULT MaybeObject* Shrink(Key key);
3839 3831
3840 // Ensure enough space for n additional elements. 3832 // Ensure enough space for n additional elements.
3841 MUST_USE_RESULT MaybeObject* EnsureCapacity( 3833 MUST_USE_RESULT MaybeObject* EnsureCapacity(
3842 int n, 3834 int n,
3843 Key key, 3835 Key key,
3844 PretenureFlag pretenure = NOT_TENURED); 3836 PretenureFlag pretenure = NOT_TENURED);
3845 }; 3837 };
3846 3838
3847 3839
3848 // HashTableKey is an abstract superclass for virtual key behavior. 3840 // HashTableKey is an abstract superclass for virtual key behavior.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3881 static const int kPrefixSize = 0; 3873 static const int kPrefixSize = 0;
3882 static const int kEntrySize = 1; 3874 static const int kEntrySize = 1;
3883 }; 3875 };
3884 3876
3885 class SeqOneByteString; 3877 class SeqOneByteString;
3886 3878
3887 // StringTable. 3879 // StringTable.
3888 // 3880 //
3889 // No special elements in the prefix and the element size is 1 3881 // No special elements in the prefix and the element size is 1
3890 // because only the string itself (the key) needs to be stored. 3882 // because only the string itself (the key) needs to be stored.
3891 class StringTable: public HashTable<StringTable, 3883 class StringTable: public HashTable<StringTableShape, HashTableKey*> {
3892 StringTableShape,
3893 HashTableKey*> {
3894 public: 3884 public:
3895 // Find string in the string table. If it is not there yet, it is 3885 // Find string in the string table. If it is not there yet, it is
3896 // added. The return value is the string table which might have 3886 // added. The return value is the string table which might have
3897 // been enlarged. If the return value is not a failure, the string 3887 // been enlarged. If the return value is not a failure, the string
3898 // pointer *s is set to the string found. 3888 // pointer *s is set to the string found.
3899 MUST_USE_RESULT MaybeObject* LookupString(String* key, Object** s); 3889 MUST_USE_RESULT MaybeObject* LookupString(String* key, Object** s);
3900 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); 3890 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s);
3901 3891
3902 // Looks up a string that is equal to the given string and returns 3892 // Looks up a string that is equal to the given string and returns
3903 // true if it is found, assigning the string to the given output 3893 // true if it is found, assigning the string to the given output
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3935 3925
3936 static const int kPrefixSize = 0; 3926 static const int kPrefixSize = 0;
3937 static const int kEntrySize = 2; 3927 static const int kEntrySize = 2;
3938 }; 3928 };
3939 3929
3940 3930
3941 // MapCache. 3931 // MapCache.
3942 // 3932 //
3943 // Maps keys that are a fixed array of unique names to a map. 3933 // Maps keys that are a fixed array of unique names to a map.
3944 // Used for canonicalize maps for object literals. 3934 // Used for canonicalize maps for object literals.
3945 class MapCache: public HashTable<MapCache, MapCacheShape, HashTableKey*> { 3935 class MapCache: public HashTable<MapCacheShape, HashTableKey*> {
3946 public: 3936 public:
3947 // Find cached value for a name key, otherwise return null. 3937 // Find cached value for a name key, otherwise return null.
3948 Object* Lookup(FixedArray* key); 3938 Object* Lookup(FixedArray* key);
3949 MUST_USE_RESULT MaybeObject* Put(FixedArray* key, Map* value); 3939 MUST_USE_RESULT MaybeObject* Put(FixedArray* key, Map* value);
3950 static inline MapCache* cast(Object* obj); 3940 static inline MapCache* cast(Object* obj);
3951 3941
3952 private: 3942 private:
3953 DISALLOW_IMPLICIT_CONSTRUCTORS(MapCache); 3943 DISALLOW_IMPLICIT_CONSTRUCTORS(MapCache);
3954 }; 3944 };
3955 3945
3956 3946
3957 template <typename Derived, typename Shape, typename Key> 3947 template <typename Shape, typename Key>
3958 class Dictionary: public HashTable<Derived, Shape, Key> { 3948 class Dictionary: public HashTable<Shape, Key> {
3959 protected:
3960 typedef HashTable<Derived, Shape, Key> DerivedHashTable;
3961
3962 public: 3949 public:
3963 static inline Dictionary* cast(Object* obj) { 3950 static inline Dictionary<Shape, Key>* cast(Object* obj) {
3964 return reinterpret_cast<Dictionary*>(obj); 3951 return reinterpret_cast<Dictionary<Shape, Key>*>(obj);
3965 } 3952 }
3966 3953
3967 // Returns the value at entry. 3954 // Returns the value at entry.
3968 Object* ValueAt(int entry) { 3955 Object* ValueAt(int entry) {
3969 return this->get(DerivedHashTable::EntryToIndex(entry) + 1); 3956 return this->get(HashTable<Shape, Key>::EntryToIndex(entry) + 1);
3970 } 3957 }
3971 3958
3972 // Set the value for entry. 3959 // Set the value for entry.
3973 void ValueAtPut(int entry, Object* value) { 3960 void ValueAtPut(int entry, Object* value) {
3974 this->set(DerivedHashTable::EntryToIndex(entry) + 1, value); 3961 this->set(HashTable<Shape, Key>::EntryToIndex(entry) + 1, value);
3975 } 3962 }
3976 3963
3977 // Returns the property details for the property at entry. 3964 // Returns the property details for the property at entry.
3978 PropertyDetails DetailsAt(int entry) { 3965 PropertyDetails DetailsAt(int entry) {
3979 ASSERT(entry >= 0); // Not found is -1, which is not caught by get(). 3966 ASSERT(entry >= 0); // Not found is -1, which is not caught by get().
3980 return PropertyDetails( 3967 return PropertyDetails(
3981 Smi::cast(this->get(DerivedHashTable::EntryToIndex(entry) + 2))); 3968 Smi::cast(this->get(HashTable<Shape, Key>::EntryToIndex(entry) + 2)));
3982 } 3969 }
3983 3970
3984 // Set the details for entry. 3971 // Set the details for entry.
3985 void DetailsAtPut(int entry, PropertyDetails value) { 3972 void DetailsAtPut(int entry, PropertyDetails value) {
3986 this->set(DerivedHashTable::EntryToIndex(entry) + 2, value.AsSmi()); 3973 this->set(HashTable<Shape, Key>::EntryToIndex(entry) + 2, value.AsSmi());
3987 } 3974 }
3988 3975
3989 // Sorting support 3976 // Sorting support
3990 void CopyValuesTo(FixedArray* elements); 3977 void CopyValuesTo(FixedArray* elements);
3991 3978
3992 // Delete a property from the dictionary. 3979 // Delete a property from the dictionary.
3993 Object* DeleteProperty(int entry, JSObject::DeleteMode mode); 3980 Object* DeleteProperty(int entry, JSObject::DeleteMode mode);
3994 // TODO(ishell): Temporary wrapper until handlified. 3981 // TODO(ishell): Temporary wrapper until handlified.
3995 static Handle<Object> DeleteProperty( 3982 static Handle<Object> DeleteProperty(
3996 Handle<Dictionary> dictionary, 3983 Handle<Dictionary<Shape, Key> > dictionary,
3997 int entry, 3984 int entry,
3998 JSObject::DeleteMode mode); 3985 JSObject::DeleteMode mode);
3999 3986
4000 // Attempt to shrink the dictionary after deletion of key. 3987 // Attempt to shrink the dictionary after deletion of key.
4001 static inline Handle<Derived> Shrink(Handle<Derived> dictionary, Key key) { 3988 MUST_USE_RESULT MaybeObject* Shrink(Key key);
4002 return DerivedHashTable::Shrink(dictionary, key); 3989 // TODO(ishell): Temporary wrapper until handlified.
4003 } 3990 MUST_USE_RESULT static Handle<FixedArray> Shrink(
3991 Handle<Dictionary<Shape, Key> > dictionary,
3992 Key key);
4004 3993
4005 // Returns the number of elements in the dictionary filtering out properties 3994 // Returns the number of elements in the dictionary filtering out properties
4006 // with the specified attributes. 3995 // with the specified attributes.
4007 int NumberOfElementsFilterAttributes(PropertyAttributes filter); 3996 int NumberOfElementsFilterAttributes(PropertyAttributes filter);
4008 3997
4009 // Returns the number of enumerable elements in the dictionary. 3998 // Returns the number of enumerable elements in the dictionary.
4010 int NumberOfEnumElements(); 3999 int NumberOfEnumElements();
4011 4000
4012 enum SortMode { UNSORTED, SORTED }; 4001 enum SortMode { UNSORTED, SORTED };
4013 // Copies keys to preallocated fixed array. 4002 // Copies keys to preallocated fixed array.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4063 MUST_USE_RESULT MaybeObject* AtPut(Key key, Object* value); 4052 MUST_USE_RESULT MaybeObject* AtPut(Key key, Object* value);
4064 4053
4065 // Add entry to dictionary. 4054 // Add entry to dictionary.
4066 MUST_USE_RESULT MaybeObject* AddEntry(Key key, 4055 MUST_USE_RESULT MaybeObject* AddEntry(Key key,
4067 Object* value, 4056 Object* value,
4068 PropertyDetails details, 4057 PropertyDetails details,
4069 uint32_t hash); 4058 uint32_t hash);
4070 4059
4071 // Generate new enumeration indices to avoid enumeration index overflow. 4060 // Generate new enumeration indices to avoid enumeration index overflow.
4072 MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); 4061 MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices();
4073 static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex; 4062 static const int kMaxNumberKeyIndex =
4063 HashTable<Shape, Key>::kPrefixStartIndex;
4074 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; 4064 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1;
4075 }; 4065 };
4076 4066
4077 4067
4078 class NameDictionaryShape : public BaseShape<Name*> { 4068 class NameDictionaryShape : public BaseShape<Name*> {
4079 public: 4069 public:
4080 static inline bool IsMatch(Name* key, Object* other); 4070 static inline bool IsMatch(Name* key, Object* other);
4081 static inline uint32_t Hash(Name* key); 4071 static inline uint32_t Hash(Name* key);
4082 static inline uint32_t HashForObject(Name* key, Object* object); 4072 static inline uint32_t HashForObject(Name* key, Object* object);
4083 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap, 4073 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap,
4084 Name* key); 4074 Name* key);
4085 static const int kPrefixSize = 2; 4075 static const int kPrefixSize = 2;
4086 static const int kEntrySize = 3; 4076 static const int kEntrySize = 3;
4087 static const bool kIsEnumerable = true; 4077 static const bool kIsEnumerable = true;
4088 }; 4078 };
4089 4079
4090 4080
4091 class NameDictionary: public Dictionary<NameDictionary, 4081 class NameDictionary: public Dictionary<NameDictionaryShape, Name*> {
4092 NameDictionaryShape,
4093 Name*> {
4094 public: 4082 public:
4095 static inline NameDictionary* cast(Object* obj) { 4083 static inline NameDictionary* cast(Object* obj) {
4096 ASSERT(obj->IsDictionary()); 4084 ASSERT(obj->IsDictionary());
4097 return reinterpret_cast<NameDictionary*>(obj); 4085 return reinterpret_cast<NameDictionary*>(obj);
4098 } 4086 }
4099 4087
4100 // Copies enumerable keys to preallocated fixed array. 4088 // Copies enumerable keys to preallocated fixed array.
4101 void CopyEnumKeysTo(FixedArray* storage); 4089 void CopyEnumKeysTo(FixedArray* storage);
4102 static void DoGenerateNewEnumerationIndices( 4090 static void DoGenerateNewEnumerationIndices(
4103 Handle<NameDictionary> dictionary); 4091 Handle<NameDictionary> dictionary);
(...skipping 29 matching lines...) Expand all
4133 class UnseededNumberDictionaryShape : public NumberDictionaryShape { 4121 class UnseededNumberDictionaryShape : public NumberDictionaryShape {
4134 public: 4122 public:
4135 static const int kPrefixSize = 0; 4123 static const int kPrefixSize = 0;
4136 4124
4137 static inline uint32_t Hash(uint32_t key); 4125 static inline uint32_t Hash(uint32_t key);
4138 static inline uint32_t HashForObject(uint32_t key, Object* object); 4126 static inline uint32_t HashForObject(uint32_t key, Object* object);
4139 }; 4127 };
4140 4128
4141 4129
4142 class SeededNumberDictionary 4130 class SeededNumberDictionary
4143 : public Dictionary<SeededNumberDictionary, 4131 : public Dictionary<SeededNumberDictionaryShape, uint32_t> {
4144 SeededNumberDictionaryShape,
4145 uint32_t> {
4146 public: 4132 public:
4147 static SeededNumberDictionary* cast(Object* obj) { 4133 static SeededNumberDictionary* cast(Object* obj) {
4148 ASSERT(obj->IsDictionary()); 4134 ASSERT(obj->IsDictionary());
4149 return reinterpret_cast<SeededNumberDictionary*>(obj); 4135 return reinterpret_cast<SeededNumberDictionary*>(obj);
4150 } 4136 }
4151 4137
4152 // Type specific at put (default NONE attributes is used when adding). 4138 // Type specific at put (default NONE attributes is used when adding).
4153 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); 4139 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value);
4154 MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry( 4140 MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry(
4155 Handle<SeededNumberDictionary> dictionary, 4141 Handle<SeededNumberDictionary> dictionary,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4188 inline uint32_t max_number_key(); 4174 inline uint32_t max_number_key();
4189 4175
4190 // Bit masks. 4176 // Bit masks.
4191 static const int kRequiresSlowElementsMask = 1; 4177 static const int kRequiresSlowElementsMask = 1;
4192 static const int kRequiresSlowElementsTagSize = 1; 4178 static const int kRequiresSlowElementsTagSize = 1;
4193 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; 4179 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1;
4194 }; 4180 };
4195 4181
4196 4182
4197 class UnseededNumberDictionary 4183 class UnseededNumberDictionary
4198 : public Dictionary<UnseededNumberDictionary, 4184 : public Dictionary<UnseededNumberDictionaryShape, uint32_t> {
4199 UnseededNumberDictionaryShape,
4200 uint32_t> {
4201 public: 4185 public:
4202 static UnseededNumberDictionary* cast(Object* obj) { 4186 static UnseededNumberDictionary* cast(Object* obj) {
4203 ASSERT(obj->IsDictionary()); 4187 ASSERT(obj->IsDictionary());
4204 return reinterpret_cast<UnseededNumberDictionary*>(obj); 4188 return reinterpret_cast<UnseededNumberDictionary*>(obj);
4205 } 4189 }
4206 4190
4207 // Type specific at put (default NONE attributes is used when adding). 4191 // Type specific at put (default NONE attributes is used when adding).
4208 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); 4192 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value);
4209 MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, Object* value); 4193 MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, Object* value);
4210 4194
(...skipping 15 matching lines...) Expand all
4226 static inline uint32_t HashForObject(Object* key, Object* object); 4210 static inline uint32_t HashForObject(Object* key, Object* object);
4227 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap, 4211 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap,
4228 Object* key); 4212 Object* key);
4229 static const int kPrefixSize = 0; 4213 static const int kPrefixSize = 0;
4230 static const int kEntrySize = 2; 4214 static const int kEntrySize = 2;
4231 }; 4215 };
4232 4216
4233 4217
4234 // ObjectHashTable maps keys that are arbitrary objects to object values by 4218 // ObjectHashTable maps keys that are arbitrary objects to object values by
4235 // using the identity hash of the key for hashing purposes. 4219 // using the identity hash of the key for hashing purposes.
4236 class ObjectHashTable: public HashTable<ObjectHashTable, 4220 class ObjectHashTable: public HashTable<ObjectHashTableShape, Object*> {
4237 ObjectHashTableShape,
4238 Object*> {
4239 typedef HashTable<ObjectHashTable, ObjectHashTableShape, Object*> HashTable_;
4240 public: 4221 public:
4241 static inline ObjectHashTable* cast(Object* obj) { 4222 static inline ObjectHashTable* cast(Object* obj) {
4242 ASSERT(obj->IsHashTable()); 4223 ASSERT(obj->IsHashTable());
4243 return reinterpret_cast<ObjectHashTable*>(obj); 4224 return reinterpret_cast<ObjectHashTable*>(obj);
4244 } 4225 }
4245 4226
4246 static Handle<ObjectHashTable> EnsureCapacity( 4227 static Handle<ObjectHashTable> EnsureCapacity(
4247 Handle<ObjectHashTable> table, 4228 Handle<ObjectHashTable> table,
4248 int n, 4229 int n,
4249 Handle<Object> key, 4230 Handle<Object> key,
4250 PretenureFlag pretenure = NOT_TENURED); 4231 PretenureFlag pretenure = NOT_TENURED);
4251 4232
4252 // Attempt to shrink hash table after removal of key. 4233 // Attempt to shrink hash table after removal of key.
4253 static inline Handle<ObjectHashTable> Shrink(Handle<ObjectHashTable> table, 4234 static Handle<ObjectHashTable> Shrink(Handle<ObjectHashTable> table,
4254 Handle<Object> key); 4235 Handle<Object> key);
4255 4236
4256 // Looks up the value associated with the given key. The hole value is 4237 // Looks up the value associated with the given key. The hole value is
4257 // returned in case the key is not present. 4238 // returned in case the key is not present.
4258 Object* Lookup(Object* key); 4239 Object* Lookup(Object* key);
4259 4240
4260 // Adds (or overwrites) the value associated with the given key. Mapping a 4241 // Adds (or overwrites) the value associated with the given key. Mapping a
4261 // key to the hole value causes removal of the whole entry. 4242 // key to the hole value causes removal of the whole entry.
4262 static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 4243 static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table,
4263 Handle<Object> key, 4244 Handle<Object> key,
4264 Handle<Object> value); 4245 Handle<Object> value);
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
4442 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap, 4423 MUST_USE_RESULT static inline MaybeObject* AsObject(Heap* heap,
4443 Object* key); 4424 Object* key);
4444 static const int kPrefixSize = 0; 4425 static const int kPrefixSize = 0;
4445 static const int kEntrySize = entrysize; 4426 static const int kEntrySize = entrysize;
4446 }; 4427 };
4447 4428
4448 4429
4449 // WeakHashTable maps keys that are arbitrary objects to object values. 4430 // WeakHashTable maps keys that are arbitrary objects to object values.
4450 // It is used for the global weak hash table that maps objects 4431 // It is used for the global weak hash table that maps objects
4451 // embedded in optimized code to dependent code lists. 4432 // embedded in optimized code to dependent code lists.
4452 class WeakHashTable: public HashTable<WeakHashTable, 4433 class WeakHashTable: public HashTable<WeakHashTableShape<2>, Object*> {
4453 WeakHashTableShape<2>,
4454 Object*> {
4455 public: 4434 public:
4456 static inline WeakHashTable* cast(Object* obj) { 4435 static inline WeakHashTable* cast(Object* obj) {
4457 ASSERT(obj->IsHashTable()); 4436 ASSERT(obj->IsHashTable());
4458 return reinterpret_cast<WeakHashTable*>(obj); 4437 return reinterpret_cast<WeakHashTable*>(obj);
4459 } 4438 }
4460 4439
4461 // Looks up the value associated with the given key. The hole value is 4440 // Looks up the value associated with the given key. The hole value is
4462 // returned in case the key is not present. 4441 // returned in case the key is not present.
4463 Object* Lookup(Object* key); 4442 Object* Lookup(Object* key);
4464 4443
(...skipping 3749 matching lines...) Expand 10 before | Expand all | Expand 10 after
8214 MUST_USE_RESULT static MaybeObject* AsObject(Heap* heap, 8193 MUST_USE_RESULT static MaybeObject* AsObject(Heap* heap,
8215 HashTableKey* key) { 8194 HashTableKey* key) {
8216 return key->AsObject(heap); 8195 return key->AsObject(heap);
8217 } 8196 }
8218 8197
8219 static const int kPrefixSize = 0; 8198 static const int kPrefixSize = 0;
8220 static const int kEntrySize = 2; 8199 static const int kEntrySize = 2;
8221 }; 8200 };
8222 8201
8223 8202
8224 class CompilationCacheTable: public HashTable<CompilationCacheTable, 8203 class CompilationCacheTable: public HashTable<CompilationCacheShape,
8225 CompilationCacheShape,
8226 HashTableKey*> { 8204 HashTableKey*> {
8227 public: 8205 public:
8228 // Find cached value for a string key, otherwise return null. 8206 // Find cached value for a string key, otherwise return null.
8229 Handle<Object> Lookup(Handle<String> src, Handle<Context> context); 8207 Handle<Object> Lookup(Handle<String> src, Handle<Context> context);
8230 Handle<Object> LookupEval(Handle<String> src, Handle<Context> context, 8208 Handle<Object> LookupEval(Handle<String> src, Handle<Context> context,
8231 StrictMode strict_mode, int scope_position); 8209 StrictMode strict_mode, int scope_position);
8232 Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags); 8210 Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags);
8233 static Handle<CompilationCacheTable> Put( 8211 static Handle<CompilationCacheTable> Put(
8234 Handle<CompilationCacheTable> cache, Handle<String> src, 8212 Handle<CompilationCacheTable> cache, Handle<String> src,
8235 Handle<Context> context, Handle<Object> value); 8213 Handle<Context> context, Handle<Object> value);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
8316 MUST_USE_RESULT static MaybeObject* AsObject(Heap* heap, 8294 MUST_USE_RESULT static MaybeObject* AsObject(Heap* heap,
8317 HashTableKey* key) { 8295 HashTableKey* key) {
8318 return key->AsObject(heap); 8296 return key->AsObject(heap);
8319 } 8297 }
8320 8298
8321 static const int kPrefixSize = 0; 8299 static const int kPrefixSize = 0;
8322 static const int kEntrySize = 2; 8300 static const int kEntrySize = 2;
8323 }; 8301 };
8324 8302
8325 8303
8326 class CodeCacheHashTable: public HashTable<CodeCacheHashTable, 8304 class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape,
8327 CodeCacheHashTableShape,
8328 HashTableKey*> { 8305 HashTableKey*> {
8329 public: 8306 public:
8330 Object* Lookup(Name* name, Code::Flags flags); 8307 Object* Lookup(Name* name, Code::Flags flags);
8331 MUST_USE_RESULT MaybeObject* Put(Name* name, Code* code); 8308 MUST_USE_RESULT MaybeObject* Put(Name* name, Code* code);
8332 8309
8333 int GetIndex(Name* name, Code::Flags flags); 8310 int GetIndex(Name* name, Code::Flags flags);
8334 void RemoveByIndex(int index); 8311 void RemoveByIndex(int index);
8335 8312
8336 static inline CodeCacheHashTable* cast(Object* obj); 8313 static inline CodeCacheHashTable* cast(Object* obj);
8337 8314
(...skipping 29 matching lines...) Expand all
8367 8344
8368 static const int kCacheOffset = HeapObject::kHeaderSize; 8345 static const int kCacheOffset = HeapObject::kHeaderSize;
8369 static const int kSize = kCacheOffset + kPointerSize; 8346 static const int kSize = kCacheOffset + kPointerSize;
8370 8347
8371 private: 8348 private:
8372 DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache); 8349 DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache);
8373 }; 8350 };
8374 8351
8375 8352
8376 class PolymorphicCodeCacheHashTable 8353 class PolymorphicCodeCacheHashTable
8377 : public HashTable<PolymorphicCodeCacheHashTable, 8354 : public HashTable<CodeCacheHashTableShape, HashTableKey*> {
8378 CodeCacheHashTableShape,
8379 HashTableKey*> {
8380 public: 8355 public:
8381 Object* Lookup(MapHandleList* maps, int code_kind); 8356 Object* Lookup(MapHandleList* maps, int code_kind);
8382 8357
8383 MUST_USE_RESULT MaybeObject* Put(MapHandleList* maps, 8358 MUST_USE_RESULT MaybeObject* Put(MapHandleList* maps,
8384 int code_kind, 8359 int code_kind,
8385 Code* code); 8360 Code* code);
8386 8361
8387 static inline PolymorphicCodeCacheHashTable* cast(Object* obj); 8362 static inline PolymorphicCodeCacheHashTable* cast(Object* obj);
8388 8363
8389 static const int kInitialSize = 64; 8364 static const int kInitialSize = 64;
(...skipping 2659 matching lines...) Expand 10 before | Expand all | Expand 10 after
11049 } else { 11024 } else {
11050 value &= ~(1 << bit_position); 11025 value &= ~(1 << bit_position);
11051 } 11026 }
11052 return value; 11027 return value;
11053 } 11028 }
11054 }; 11029 };
11055 11030
11056 } } // namespace v8::internal 11031 } } // namespace v8::internal
11057 11032
11058 #endif // V8_OBJECTS_H_ 11033 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « no previous file | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698