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

Side by Side Diff: src/objects.h

Issue 1156993018: GlobalDictionary now stores PropertyDetails in PropertyCells. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 3441 matching lines...) Expand 10 before | Expand all | Expand 10 after
3452 // Returns the key at entry. 3452 // Returns the key at entry.
3453 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } 3453 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
3454 3454
3455 static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize; 3455 static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize;
3456 static const int kEntrySize = Shape::kEntrySize; 3456 static const int kEntrySize = Shape::kEntrySize;
3457 static const int kElementsStartOffset = 3457 static const int kElementsStartOffset =
3458 kHeaderSize + kElementsStartIndex * kPointerSize; 3458 kHeaderSize + kElementsStartIndex * kPointerSize;
3459 static const int kCapacityOffset = 3459 static const int kCapacityOffset =
3460 kHeaderSize + kCapacityIndex * kPointerSize; 3460 kHeaderSize + kCapacityIndex * kPointerSize;
3461 3461
3462 // Returns the index for an entry (of the key)
3463 static inline int EntryToIndex(int entry) {
3464 return (entry * kEntrySize) + kElementsStartIndex;
3465 }
3466
3462 protected: 3467 protected:
3463 friend class ObjectHashTable; 3468 friend class ObjectHashTable;
3464 3469
3465 // Find the entry at which to insert element with the given key that 3470 // Find the entry at which to insert element with the given key that
3466 // has the given hash value. 3471 // has the given hash value.
3467 uint32_t FindInsertionEntry(uint32_t hash); 3472 uint32_t FindInsertionEntry(uint32_t hash);
3468 3473
3469 // Attempt to shrink hash table after removal of key. 3474 // Attempt to shrink hash table after removal of key.
3470 MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key); 3475 MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key);
3471 3476
3472 // Ensure enough space for n additional elements. 3477 // Ensure enough space for n additional elements.
3473 MUST_USE_RESULT static Handle<Derived> EnsureCapacity( 3478 MUST_USE_RESULT static Handle<Derived> EnsureCapacity(
3474 Handle<Derived> table, 3479 Handle<Derived> table,
3475 int n, 3480 int n,
3476 Key key, 3481 Key key,
3477 PretenureFlag pretenure = NOT_TENURED); 3482 PretenureFlag pretenure = NOT_TENURED);
3478 3483
3479 // Returns the index for an entry (of the key)
3480 static inline int EntryToIndex(int entry) {
3481 return (entry * kEntrySize) + kElementsStartIndex;
3482 }
3483
3484 // Sets the capacity of the hash table. 3484 // Sets the capacity of the hash table.
3485 void SetCapacity(int capacity) { 3485 void SetCapacity(int capacity) {
3486 // To scale a computed hash code to fit within the hash table, we 3486 // To scale a computed hash code to fit within the hash table, we
3487 // use bit-wise AND with a mask, so the capacity must be positive 3487 // use bit-wise AND with a mask, so the capacity must be positive
3488 // and non-zero. 3488 // and non-zero.
3489 DCHECK(capacity > 0); 3489 DCHECK(capacity > 0);
3490 DCHECK(capacity <= kMaxCapacity); 3490 DCHECK(capacity <= kMaxCapacity);
3491 set(kCapacityIndex, Smi::FromInt(capacity)); 3491 set(kCapacityIndex, Smi::FromInt(capacity));
3492 } 3492 }
3493 3493
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3599 return this->get(Derived::EntryToIndex(entry) + 1); 3599 return this->get(Derived::EntryToIndex(entry) + 1);
3600 } 3600 }
3601 3601
3602 // Set the value for entry. 3602 // Set the value for entry.
3603 void ValueAtPut(int entry, Object* value) { 3603 void ValueAtPut(int entry, Object* value) {
3604 this->set(Derived::EntryToIndex(entry) + 1, value); 3604 this->set(Derived::EntryToIndex(entry) + 1, value);
3605 } 3605 }
3606 3606
3607 // Returns the property details for the property at entry. 3607 // Returns the property details for the property at entry.
3608 PropertyDetails DetailsAt(int entry) { 3608 PropertyDetails DetailsAt(int entry) {
3609 DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). 3609 return Shape::DetailsAt(static_cast<Derived*>(this), entry);
3610 return PropertyDetails(
3611 Smi::cast(this->get(Derived::EntryToIndex(entry) + 2)));
3612 } 3610 }
3613 3611
3614 // Set the details for entry. 3612 // Set the details for entry.
3615 void DetailsAtPut(int entry, PropertyDetails value) { 3613 void DetailsAtPut(int entry, PropertyDetails value) {
3616 this->set(Derived::EntryToIndex(entry) + 2, value.AsSmi()); 3614 Shape::DetailsAtPut(static_cast<Derived*>(this), entry, value);
3617 } 3615 }
3618 3616
3619 // Returns true if property at given entry is deleted. 3617 // Returns true if property at given entry is deleted.
3620 bool IsDeleted(int entry) { 3618 bool IsDeleted(int entry) {
3621 return Shape::IsDeleted(static_cast<Derived*>(this), entry); 3619 return Shape::IsDeleted(static_cast<Derived*>(this), entry);
3622 } 3620 }
3623 3621
3624 // Delete a property from the dictionary. 3622 // Delete a property from the dictionary.
3625 static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry); 3623 static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry);
3626 3624
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
3739 // Find entry for key, otherwise return kNotFound. Optimized version of 3737 // Find entry for key, otherwise return kNotFound. Optimized version of
3740 // HashTable::FindEntry. 3738 // HashTable::FindEntry.
3741 int FindEntry(Handle<Name> key); 3739 int FindEntry(Handle<Name> key);
3742 }; 3740 };
3743 3741
3744 3742
3745 template <typename Key> 3743 template <typename Key>
3746 class BaseDictionaryShape : public BaseShape<Key> { 3744 class BaseDictionaryShape : public BaseShape<Key> {
3747 public: 3745 public:
3748 template <typename Dictionary> 3746 template <typename Dictionary>
3747 static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) {
3748 STATIC_ASSERT(Dictionary::kEntrySize == 3);
3749 DCHECK(entry >= 0); // Not found is -1, which is not caught by get().
3750 return PropertyDetails(
3751 Smi::cast(dict->get(Dictionary::EntryToIndex(entry) + 2)));
3752 }
3753
3754 template <typename Dictionary>
3755 static inline void DetailsAtPut(Dictionary* dict, int entry,
3756 PropertyDetails value) {
3757 STATIC_ASSERT(Dictionary::kEntrySize == 3);
3758 dict->set(Dictionary::EntryToIndex(entry) + 2, value.AsSmi());
3759 }
3760
3761 template <typename Dictionary>
3749 static bool IsDeleted(Dictionary* dict, int entry) { 3762 static bool IsDeleted(Dictionary* dict, int entry) {
3750 return false; 3763 return false;
3751 } 3764 }
3765
3766 template <typename Dictionary>
3767 static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
3768 Handle<Object> value, PropertyDetails details);
3752 }; 3769 };
3753 3770
3754 3771
3755 class NameDictionaryShape : public BaseDictionaryShape<Handle<Name> > { 3772 class NameDictionaryShape : public BaseDictionaryShape<Handle<Name> > {
3756 public: 3773 public:
3757 static inline bool IsMatch(Handle<Name> key, Object* other); 3774 static inline bool IsMatch(Handle<Name> key, Object* other);
3758 static inline uint32_t Hash(Handle<Name> key); 3775 static inline uint32_t Hash(Handle<Name> key);
3759 static inline uint32_t HashForObject(Handle<Name> key, Object* object); 3776 static inline uint32_t HashForObject(Handle<Name> key, Object* object);
3760 static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key); 3777 static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key);
3761 static const int kPrefixSize = 2; 3778 static const int kPrefixSize = 2;
(...skipping 10 matching lines...) Expand all
3772 public: 3789 public:
3773 DECLARE_CAST(NameDictionary) 3790 DECLARE_CAST(NameDictionary)
3774 3791
3775 inline static Handle<FixedArray> DoGenerateNewEnumerationIndices( 3792 inline static Handle<FixedArray> DoGenerateNewEnumerationIndices(
3776 Handle<NameDictionary> dictionary); 3793 Handle<NameDictionary> dictionary);
3777 }; 3794 };
3778 3795
3779 3796
3780 class GlobalDictionaryShape : public NameDictionaryShape { 3797 class GlobalDictionaryShape : public NameDictionaryShape {
3781 public: 3798 public:
3782 static const int kEntrySize = 3; // Overrides NameDictionaryShape::kEntrySize 3799 static const int kEntrySize = 2; // Overrides NameDictionaryShape::kEntrySize
3800
3801 template <typename Dictionary>
3802 static inline PropertyDetails DetailsAt(Dictionary* dict, int entry);
3803
3804 template <typename Dictionary>
3805 static inline void DetailsAtPut(Dictionary* dict, int entry,
3806 PropertyDetails value);
3783 3807
3784 template <typename Dictionary> 3808 template <typename Dictionary>
3785 static bool IsDeleted(Dictionary* dict, int entry); 3809 static bool IsDeleted(Dictionary* dict, int entry);
3810
3811 template <typename Dictionary>
3812 static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
3813 Handle<Object> value, PropertyDetails details);
3786 }; 3814 };
3787 3815
3788 3816
3789 class GlobalDictionary 3817 class GlobalDictionary
3790 : public NameDictionaryBase<GlobalDictionary, GlobalDictionaryShape> { 3818 : public NameDictionaryBase<GlobalDictionary, GlobalDictionaryShape> {
3791 public: 3819 public:
3792 DECLARE_CAST(GlobalDictionary) 3820 DECLARE_CAST(GlobalDictionary)
3793 }; 3821 };
3794 3822
3795 3823
(...skipping 6065 matching lines...) Expand 10 before | Expand all | Expand 10 after
9861 kValueOffset + kPointerSize, 9889 kValueOffset + kPointerSize,
9862 kSize> BodyDescriptor; 9890 kSize> BodyDescriptor;
9863 9891
9864 private: 9892 private:
9865 DISALLOW_IMPLICIT_CONSTRUCTORS(Cell); 9893 DISALLOW_IMPLICIT_CONSTRUCTORS(Cell);
9866 }; 9894 };
9867 9895
9868 9896
9869 class PropertyCell : public HeapObject { 9897 class PropertyCell : public HeapObject {
9870 public: 9898 public:
9899 // [property_details]: details of the global property.
9900 DECL_ACCESSORS(property_details_raw, Object)
9871 // [value]: value of the global property. 9901 // [value]: value of the global property.
9872 DECL_ACCESSORS(value, Object) 9902 DECL_ACCESSORS(value, Object)
9873 // [dependent_code]: dependent code that depends on the type of the global 9903 // [dependent_code]: dependent code that depends on the type of the global
9874 // property. 9904 // property.
9875 DECL_ACCESSORS(dependent_code, DependentCode) 9905 DECL_ACCESSORS(dependent_code, DependentCode)
9876 9906
9907 PropertyDetails property_details() {
9908 return PropertyDetails(Smi::cast(property_details_raw()));
9909 }
9910
9911 void set_property_details(PropertyDetails details) {
9912 set_property_details_raw(details.AsSmi());
9913 }
9914
9877 PropertyCellConstantType GetConstantType(); 9915 PropertyCellConstantType GetConstantType();
9878 9916
9879 // Computes the new type of the cell's contents for the given value, but 9917 // Computes the new type of the cell's contents for the given value, but
9880 // without actually modifying the details. 9918 // without actually modifying the details.
9881 static PropertyCellType UpdatedType(Handle<PropertyCell> cell, 9919 static PropertyCellType UpdatedType(Handle<PropertyCell> cell,
9882 Handle<Object> value, 9920 Handle<Object> value,
9883 PropertyDetails details); 9921 PropertyDetails details);
9884 static void UpdateCell(Handle<GlobalDictionary> dictionary, int entry, 9922 static void UpdateCell(Handle<GlobalDictionary> dictionary, int entry,
9885 Handle<Object> value, PropertyDetails details); 9923 Handle<Object> value, PropertyDetails details);
9886 9924
9887 static Handle<PropertyCell> InvalidateEntry( 9925 static Handle<PropertyCell> InvalidateEntry(
9888 Handle<GlobalDictionary> dictionary, int entry); 9926 Handle<GlobalDictionary> dictionary, int entry);
9889 9927
9890 static void SetValueWithInvalidation(Handle<PropertyCell> cell, 9928 static void SetValueWithInvalidation(Handle<PropertyCell> cell,
9891 Handle<Object> new_value); 9929 Handle<Object> new_value);
9892 9930
9893 DECLARE_CAST(PropertyCell) 9931 DECLARE_CAST(PropertyCell)
9894 9932
9895 // Dispatched behavior. 9933 // Dispatched behavior.
9896 DECLARE_PRINTER(PropertyCell) 9934 DECLARE_PRINTER(PropertyCell)
9897 DECLARE_VERIFIER(PropertyCell) 9935 DECLARE_VERIFIER(PropertyCell)
9898 9936
9899 // Layout description. 9937 // Layout description.
9900 static const int kValueOffset = HeapObject::kHeaderSize; 9938 static const int kDetailsOffset = HeapObject::kHeaderSize;
9939 static const int kValueOffset = kDetailsOffset + kPointerSize;
9901 static const int kDependentCodeOffset = kValueOffset + kPointerSize; 9940 static const int kDependentCodeOffset = kValueOffset + kPointerSize;
9902 static const int kSize = kDependentCodeOffset + kPointerSize; 9941 static const int kSize = kDependentCodeOffset + kPointerSize;
9903 9942
9904 static const int kPointerFieldsBeginOffset = kValueOffset; 9943 static const int kPointerFieldsBeginOffset = kValueOffset;
9905 static const int kPointerFieldsEndOffset = kSize; 9944 static const int kPointerFieldsEndOffset = kSize;
9906 9945
9907 typedef FixedBodyDescriptor<kValueOffset, 9946 typedef FixedBodyDescriptor<kValueOffset,
9908 kSize, 9947 kSize,
9909 kSize> BodyDescriptor; 9948 kSize> BodyDescriptor;
9910 9949
(...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after
11148 } else { 11187 } else {
11149 value &= ~(1 << bit_position); 11188 value &= ~(1 << bit_position);
11150 } 11189 }
11151 return value; 11190 return value;
11152 } 11191 }
11153 }; 11192 };
11154 11193
11155 } } // namespace v8::internal 11194 } } // namespace v8::internal
11156 11195
11157 #endif // V8_OBJECTS_H_ 11196 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/lookup-inl.h ('k') | src/objects.cc » ('j') | src/objects-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698