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

Side by Side Diff: src/objects.h

Issue 1002703002: remove DeletedField from PropertyDetails (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « src/lookup-inl.h ('k') | 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 // 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 3509 matching lines...) Expand 10 before | Expand all | Expand 10 after
3520 DECLARE_CAST(StringTable) 3520 DECLARE_CAST(StringTable)
3521 3521
3522 private: 3522 private:
3523 template <bool seq_one_byte> 3523 template <bool seq_one_byte>
3524 friend class JsonParser; 3524 friend class JsonParser;
3525 3525
3526 DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable); 3526 DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable);
3527 }; 3527 };
3528 3528
3529 3529
3530 enum class DictionaryEntryType { kObjects, kCells };
3531
3532
3530 template <typename Derived, typename Shape, typename Key> 3533 template <typename Derived, typename Shape, typename Key>
3531 class Dictionary: public HashTable<Derived, Shape, Key> { 3534 class Dictionary: public HashTable<Derived, Shape, Key> {
3532 protected: 3535 protected:
3533 typedef HashTable<Derived, Shape, Key> DerivedHashTable; 3536 typedef HashTable<Derived, Shape, Key> DerivedHashTable;
3534 3537
3535 public: 3538 public:
3536 // Returns the value at entry. 3539 // Returns the value at entry.
3537 Object* ValueAt(int entry) { 3540 Object* ValueAt(int entry) {
3538 return this->get(DerivedHashTable::EntryToIndex(entry) + 1); 3541 return this->get(DerivedHashTable::EntryToIndex(entry) + 1);
3539 } 3542 }
3540 3543
3541 // Set the value for entry. 3544 // Set the value for entry.
3542 void ValueAtPut(int entry, Object* value) { 3545 void ValueAtPut(int entry, Object* value) {
3543 this->set(DerivedHashTable::EntryToIndex(entry) + 1, value); 3546 this->set(DerivedHashTable::EntryToIndex(entry) + 1, value);
3544 } 3547 }
3545 3548
3546 // Returns the property details for the property at entry. 3549 // Returns the property details for the property at entry.
3547 PropertyDetails DetailsAt(int entry) { 3550 PropertyDetails DetailsAt(int entry) {
3548 DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). 3551 DCHECK(entry >= 0); // Not found is -1, which is not caught by get().
3549 return PropertyDetails( 3552 return PropertyDetails(
3550 Smi::cast(this->get(DerivedHashTable::EntryToIndex(entry) + 2))); 3553 Smi::cast(this->get(DerivedHashTable::EntryToIndex(entry) + 2)));
3551 } 3554 }
3552 3555
3553 // Set the details for entry. 3556 // Set the details for entry.
3554 void DetailsAtPut(int entry, PropertyDetails value) { 3557 void DetailsAtPut(int entry, PropertyDetails value) {
3555 this->set(DerivedHashTable::EntryToIndex(entry) + 2, value.AsSmi()); 3558 this->set(DerivedHashTable::EntryToIndex(entry) + 2, value.AsSmi());
3556 } 3559 }
3557 3560
3558 // Sorting support
3559 void CopyValuesTo(FixedArray* elements);
3560
3561 // Delete a property from the dictionary. 3561 // Delete a property from the dictionary.
3562 static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry); 3562 static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry);
3563 3563
3564 // Attempt to shrink the dictionary after deletion of key. 3564 // Attempt to shrink the dictionary after deletion of key.
3565 MUST_USE_RESULT static inline Handle<Derived> Shrink( 3565 MUST_USE_RESULT static inline Handle<Derived> Shrink(
3566 Handle<Derived> dictionary, 3566 Handle<Derived> dictionary,
3567 Key key) { 3567 Key key) {
3568 return DerivedHashTable::Shrink(dictionary, key); 3568 return DerivedHashTable::Shrink(dictionary, key);
3569 } 3569 }
3570 3570
3571 // Sorting support
3572 // TODO(dcarney): templatize or move to SeededNumberDictionary
3573 void CopyValuesTo(FixedArray* elements);
3574
3571 // Returns the number of elements in the dictionary filtering out properties 3575 // Returns the number of elements in the dictionary filtering out properties
3572 // with the specified attributes. 3576 // with the specified attributes.
3577 template <DictionaryEntryType type>
3573 int NumberOfElementsFilterAttributes(PropertyAttributes filter); 3578 int NumberOfElementsFilterAttributes(PropertyAttributes filter);
3579 int NumberOfElementsFilterAttributes(Object* holder,
3580 PropertyAttributes filter) {
3581 if (holder->IsGlobalObject()) {
3582 return NumberOfElementsFilterAttributes<DictionaryEntryType::kCells>(
3583 filter);
3584 } else {
3585 return NumberOfElementsFilterAttributes<DictionaryEntryType::kObjects>(
3586 filter);
3587 }
3588 }
3574 3589
3575 // Returns the number of enumerable elements in the dictionary. 3590 // Returns the number of enumerable elements in the dictionary.
3576 int NumberOfEnumElements(); 3591 template <DictionaryEntryType type>
3592 int NumberOfEnumElements() {
3593 return NumberOfElementsFilterAttributes<type>(
3594 static_cast<PropertyAttributes>(DONT_ENUM | SYMBOLIC));
3595 }
3596 int NumberOfEnumElements(Object* holder) {
3597 if (holder->IsGlobalObject()) {
3598 return NumberOfEnumElements<DictionaryEntryType::kCells>();
3599 } else {
3600 return NumberOfEnumElements<DictionaryEntryType::kObjects>();
3601 }
3602 }
3577 3603
3578 // Returns true if the dictionary contains any elements that are non-writable, 3604 // Returns true if the dictionary contains any elements that are non-writable,
3579 // non-configurable, non-enumerable, or have getters/setters. 3605 // non-configurable, non-enumerable, or have getters/setters.
3606 template <DictionaryEntryType type>
3580 bool HasComplexElements(); 3607 bool HasComplexElements();
3608 bool HasComplexElements(Object* holder) {
3609 if (holder->IsGlobalObject()) {
3610 return HasComplexElements<DictionaryEntryType::kCells>();
3611 } else {
3612 return HasComplexElements<DictionaryEntryType::kObjects>();
3613 }
3614 }
3581 3615
3582 enum SortMode { UNSORTED, SORTED }; 3616 enum SortMode { UNSORTED, SORTED };
3617
3583 // Copies keys to preallocated fixed array. 3618 // Copies keys to preallocated fixed array.
3584 void CopyKeysTo(FixedArray* storage, 3619 template <DictionaryEntryType type>
3585 PropertyAttributes filter, 3620 void CopyKeysTo(FixedArray* storage, PropertyAttributes filter,
3586 SortMode sort_mode); 3621 SortMode sort_mode);
3622 void CopyKeysTo(Object* holder, FixedArray* storage,
3623 PropertyAttributes filter, SortMode sort_mode) {
3624 if (holder->IsGlobalObject()) {
3625 return CopyKeysTo<DictionaryEntryType::kCells>(storage, filter,
3626 sort_mode);
3627 } else {
3628 return CopyKeysTo<DictionaryEntryType::kObjects>(storage, filter,
3629 sort_mode);
3630 }
3631 }
3632
3587 // Fill in details for properties into storage. 3633 // Fill in details for properties into storage.
3588 void CopyKeysTo(FixedArray* storage, 3634 template <DictionaryEntryType type>
3589 int index, 3635 void CopyKeysTo(FixedArray* storage, int index, PropertyAttributes filter,
3590 PropertyAttributes filter,
3591 SortMode sort_mode); 3636 SortMode sort_mode);
3637 void CopyKeysTo(Object* holder, FixedArray* storage, int index,
3638 PropertyAttributes filter, SortMode sort_mode) {
3639 if (holder->IsGlobalObject()) {
3640 return CopyKeysTo<DictionaryEntryType::kCells>(storage, index, filter,
3641 sort_mode);
3642 } else {
3643 return CopyKeysTo<DictionaryEntryType::kObjects>(storage, index, filter,
3644 sort_mode);
3645 }
3646 }
3592 3647
3593 // Accessors for next enumeration index. 3648 // Accessors for next enumeration index.
3594 void SetNextEnumerationIndex(int index) { 3649 void SetNextEnumerationIndex(int index) {
3595 DCHECK(index != 0); 3650 DCHECK(index != 0);
3596 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); 3651 this->set(kNextEnumerationIndexIndex, Smi::FromInt(index));
3597 } 3652 }
3598 3653
3599 int NextEnumerationIndex() { 3654 int NextEnumerationIndex() {
3600 return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); 3655 return Smi::cast(this->get(kNextEnumerationIndexIndex))->value();
3601 } 3656 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3674 class NameDictionary: public Dictionary<NameDictionary, 3729 class NameDictionary: public Dictionary<NameDictionary,
3675 NameDictionaryShape, 3730 NameDictionaryShape,
3676 Handle<Name> > { 3731 Handle<Name> > {
3677 typedef Dictionary< 3732 typedef Dictionary<
3678 NameDictionary, NameDictionaryShape, Handle<Name> > DerivedDictionary; 3733 NameDictionary, NameDictionaryShape, Handle<Name> > DerivedDictionary;
3679 3734
3680 public: 3735 public:
3681 DECLARE_CAST(NameDictionary) 3736 DECLARE_CAST(NameDictionary)
3682 3737
3683 // Copies enumerable keys to preallocated fixed array. 3738 // Copies enumerable keys to preallocated fixed array.
3739 template <DictionaryEntryType type>
3684 void CopyEnumKeysTo(FixedArray* storage); 3740 void CopyEnumKeysTo(FixedArray* storage);
3741 void CopyEnumKeysTo(Object* holder, FixedArray* storage) {
3742 if (holder->IsGlobalObject()) {
3743 return CopyEnumKeysTo<DictionaryEntryType::kCells>(storage);
3744 } else {
3745 return CopyEnumKeysTo<DictionaryEntryType::kObjects>(storage);
3746 }
3747 }
3748
3685 inline static Handle<FixedArray> DoGenerateNewEnumerationIndices( 3749 inline static Handle<FixedArray> DoGenerateNewEnumerationIndices(
3686 Handle<NameDictionary> dictionary); 3750 Handle<NameDictionary> dictionary);
3687 3751
3688 // Find entry for key, otherwise return kNotFound. Optimized version of 3752 // Find entry for key, otherwise return kNotFound. Optimized version of
3689 // HashTable::FindEntry. 3753 // HashTable::FindEntry.
3690 int FindEntry(Handle<Name> key); 3754 int FindEntry(Handle<Name> key);
3691 }; 3755 };
3692 3756
3693 3757
3694 class NumberDictionaryShape : public BaseShape<uint32_t> { 3758 class NumberDictionaryShape : public BaseShape<uint32_t> {
(...skipping 7236 matching lines...) Expand 10 before | Expand all | Expand 10 after
10931 } else { 10995 } else {
10932 value &= ~(1 << bit_position); 10996 value &= ~(1 << bit_position);
10933 } 10997 }
10934 return value; 10998 return value;
10935 } 10999 }
10936 }; 11000 };
10937 11001
10938 } } // namespace v8::internal 11002 } } // namespace v8::internal
10939 11003
10940 #endif // V8_OBJECTS_H_ 11004 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/lookup-inl.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698