| OLD | NEW |
| 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 2498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2509 inline Object** GetKeySlot(int descriptor_number); | 2509 inline Object** GetKeySlot(int descriptor_number); |
| 2510 inline Object* GetValue(int descriptor_number); | 2510 inline Object* GetValue(int descriptor_number); |
| 2511 inline Object** GetValueSlot(int descriptor_number); | 2511 inline Object** GetValueSlot(int descriptor_number); |
| 2512 inline PropertyDetails GetDetails(int descriptor_number); | 2512 inline PropertyDetails GetDetails(int descriptor_number); |
| 2513 inline PropertyType GetType(int descriptor_number); | 2513 inline PropertyType GetType(int descriptor_number); |
| 2514 inline int GetFieldIndex(int descriptor_number); | 2514 inline int GetFieldIndex(int descriptor_number); |
| 2515 inline JSFunction* GetConstantFunction(int descriptor_number); | 2515 inline JSFunction* GetConstantFunction(int descriptor_number); |
| 2516 inline Object* GetCallbacksObject(int descriptor_number); | 2516 inline Object* GetCallbacksObject(int descriptor_number); |
| 2517 inline AccessorDescriptor* GetCallbacks(int descriptor_number); | 2517 inline AccessorDescriptor* GetCallbacks(int descriptor_number); |
| 2518 | 2518 |
| 2519 inline String* GetSortedKey(int descriptor_number); |
| 2520 inline int GetSortedKeyIndex(int descriptor_number); |
| 2521 inline void SetSortedKey(int pointer, int descriptor_number); |
| 2522 |
| 2519 // Accessor for complete descriptor. | 2523 // Accessor for complete descriptor. |
| 2520 inline void Get(int descriptor_number, Descriptor* desc); | 2524 inline void Get(int descriptor_number, Descriptor* desc); |
| 2521 inline void Set(int descriptor_number, | 2525 inline void Set(int descriptor_number, |
| 2522 Descriptor* desc, | 2526 Descriptor* desc, |
| 2523 const WhitenessWitness&); | 2527 const WhitenessWitness&); |
| 2528 |
| 2524 // Append automatically sets the enumeration index. This should only be used | 2529 // Append automatically sets the enumeration index. This should only be used |
| 2525 // to add descriptors in bulk at the end, followed by sorting the descriptor | 2530 // to add descriptors in bulk at the end, followed by sorting the descriptor |
| 2526 // array. | 2531 // array. |
| 2527 inline int Append(Descriptor* desc, | 2532 inline void Append(Descriptor* desc, |
| 2528 const WhitenessWitness&, | 2533 const WhitenessWitness&, |
| 2529 int number_of_set_descriptors); | 2534 int number_of_set_descriptors); |
| 2530 | 2535 |
| 2531 // Transfer a complete descriptor from the src descriptor array to this | 2536 // Transfer a complete descriptor from the src descriptor array to this |
| 2532 // descriptor array. | 2537 // descriptor array. |
| 2533 void CopyFrom(int dst_index, | 2538 void CopyFrom(int dst_index, |
| 2534 DescriptorArray* src, | 2539 DescriptorArray* src, |
| 2535 int src_index, | 2540 int src_index, |
| 2536 const WhitenessWitness&); | 2541 const WhitenessWitness&); |
| 2537 | 2542 |
| 2538 // Sort the instance descriptors by the hash codes of their keys. | 2543 // Sort the instance descriptors by the hash codes of their keys. |
| 2539 void Sort(const WhitenessWitness&); | 2544 void Sort(); |
| 2545 inline void SwapSortedKeys(int first, int second); |
| 2540 | 2546 |
| 2541 // Search the instance descriptors for given name. | 2547 // Search the instance descriptors for given name. |
| 2542 INLINE(int Search(String* name)); | 2548 INLINE(int Search(String* name)); |
| 2543 | 2549 |
| 2544 // As the above, but uses DescriptorLookupCache and updates it when | 2550 // As the above, but uses DescriptorLookupCache and updates it when |
| 2545 // necessary. | 2551 // necessary. |
| 2546 INLINE(int SearchWithCache(String* name)); | 2552 INLINE(int SearchWithCache(String* name)); |
| 2547 | 2553 |
| 2548 // Tells whether the name is present int the array. | 2554 // Tells whether the name is present int the array. |
| 2549 bool Contains(String* name) { return kNotFound != Search(name); } | 2555 bool Contains(String* name) { return kNotFound != Search(name); } |
| (...skipping 2101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4651 inline void set_bit_field(byte value); | 4657 inline void set_bit_field(byte value); |
| 4652 | 4658 |
| 4653 // Bit field 2. | 4659 // Bit field 2. |
| 4654 inline byte bit_field2(); | 4660 inline byte bit_field2(); |
| 4655 inline void set_bit_field2(byte value); | 4661 inline void set_bit_field2(byte value); |
| 4656 | 4662 |
| 4657 // Bit field 3. | 4663 // Bit field 3. |
| 4658 inline int bit_field3(); | 4664 inline int bit_field3(); |
| 4659 inline void set_bit_field3(int value); | 4665 inline void set_bit_field3(int value); |
| 4660 | 4666 |
| 4661 class IsShared: public BitField<bool, 0, 1> {}; | 4667 class NumberOfOwnDescriptorsBits: public BitField<int, 0, 11> {}; |
| 4662 class FunctionWithPrototype: public BitField<bool, 1, 1> {}; | 4668 class IsShared: public BitField<bool, 11, 1> {}; |
| 4663 class DictionaryMap: public BitField<bool, 2, 1> {}; | 4669 class FunctionWithPrototype: public BitField<bool, 12, 1> {}; |
| 4664 class LastAddedBits: public BitField<int, 3, 11> {}; | 4670 class DictionaryMap: public BitField<bool, 13, 1> {}; |
| 4665 | 4671 |
| 4666 // Tells whether the object in the prototype property will be used | 4672 // Tells whether the object in the prototype property will be used |
| 4667 // for instances created from this function. If the prototype | 4673 // for instances created from this function. If the prototype |
| 4668 // property is set to a value that is not a JSObject, the prototype | 4674 // property is set to a value that is not a JSObject, the prototype |
| 4669 // property will not be used to create instances of the function. | 4675 // property will not be used to create instances of the function. |
| 4670 // See ECMA-262, 13.2.2. | 4676 // See ECMA-262, 13.2.2. |
| 4671 inline void set_non_instance_prototype(bool value); | 4677 inline void set_non_instance_prototype(bool value); |
| 4672 inline bool has_non_instance_prototype(); | 4678 inline bool has_non_instance_prototype(); |
| 4673 | 4679 |
| 4674 // Tells whether function has special prototype property. If not, prototype | 4680 // Tells whether function has special prototype property. If not, prototype |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4879 inline void SetNumberOfProtoTransitions(int value) { | 4885 inline void SetNumberOfProtoTransitions(int value) { |
| 4880 FixedArray* cache = GetPrototypeTransitions(); | 4886 FixedArray* cache = GetPrototypeTransitions(); |
| 4881 ASSERT(cache->length() != 0); | 4887 ASSERT(cache->length() != 0); |
| 4882 cache->set_unchecked(kProtoTransitionNumberOfEntriesOffset, | 4888 cache->set_unchecked(kProtoTransitionNumberOfEntriesOffset, |
| 4883 Smi::FromInt(value)); | 4889 Smi::FromInt(value)); |
| 4884 } | 4890 } |
| 4885 | 4891 |
| 4886 // Lookup in the map's instance descriptors and fill out the result | 4892 // Lookup in the map's instance descriptors and fill out the result |
| 4887 // with the given holder if the name is found. The holder may be | 4893 // with the given holder if the name is found. The holder may be |
| 4888 // NULL when this function is used from the compiler. | 4894 // NULL when this function is used from the compiler. |
| 4889 void LookupDescriptor(JSObject* holder, | 4895 inline void LookupDescriptor(JSObject* holder, |
| 4890 String* name, | 4896 String* name, |
| 4891 LookupResult* result); | 4897 LookupResult* result); |
| 4892 | 4898 |
| 4893 void LookupTransition(JSObject* holder, | 4899 inline void LookupTransition(JSObject* holder, |
| 4894 String* name, | 4900 String* name, |
| 4895 LookupResult* result); | 4901 LookupResult* result); |
| 4896 | 4902 |
| 4897 // The size of transition arrays are limited so they do not end up in large | 4903 // The size of transition arrays are limited so they do not end up in large |
| 4898 // object space. Otherwise ClearNonLiveTransitions would leak memory while | 4904 // object space. Otherwise ClearNonLiveTransitions would leak memory while |
| 4899 // applying in-place right trimming. | 4905 // applying in-place right trimming. |
| 4900 inline bool CanHaveMoreTransitions(); | 4906 inline bool CanHaveMoreTransitions(); |
| 4901 | 4907 |
| 4902 void SetLastAdded(int index) { | 4908 int LastAdded() { |
| 4903 set_bit_field3(LastAddedBits::update(bit_field3(), index)); | 4909 int number_of_own_descriptors = NumberOfOwnDescriptors(); |
| 4910 ASSERT(number_of_own_descriptors > 0); |
| 4911 return number_of_own_descriptors - 1; |
| 4904 } | 4912 } |
| 4905 | 4913 |
| 4906 int LastAdded() { | 4914 int NumberOfOwnDescriptors() { |
| 4907 return LastAddedBits::decode(bit_field3()); | 4915 return NumberOfOwnDescriptorsBits::decode(bit_field3()); |
| 4908 } | 4916 } |
| 4909 | 4917 |
| 4910 int NumberOfSetDescriptors() { | 4918 void SetNumberOfOwnDescriptors(int number) { |
| 4911 ASSERT(!instance_descriptors()->IsEmpty()); | 4919 set_bit_field3(NumberOfOwnDescriptorsBits::update(bit_field3(), number)); |
| 4912 if (LastAdded() == kNoneAdded) return 0; | |
| 4913 return instance_descriptors()->GetDetails(LastAdded()).index(); | |
| 4914 } | 4920 } |
| 4915 | 4921 |
| 4916 MUST_USE_RESULT MaybeObject* RawCopy(int instance_size); | 4922 MUST_USE_RESULT MaybeObject* RawCopy(int instance_size); |
| 4917 MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors(); | 4923 MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors(); |
| 4918 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); | 4924 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); |
| 4919 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptors( | 4925 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptors( |
| 4920 DescriptorArray* descriptors, | 4926 DescriptorArray* descriptors, |
| 4921 String* name, | 4927 String* name, |
| 4922 int last_added, | |
| 4923 TransitionFlag flag); | 4928 TransitionFlag flag); |
| 4924 MUST_USE_RESULT MaybeObject* CopyAddDescriptor(Descriptor* descriptor, | 4929 MUST_USE_RESULT MaybeObject* CopyAddDescriptor(Descriptor* descriptor, |
| 4925 TransitionFlag flag); | 4930 TransitionFlag flag); |
| 4926 MUST_USE_RESULT MaybeObject* CopyInsertDescriptor(Descriptor* descriptor, | 4931 MUST_USE_RESULT MaybeObject* CopyInsertDescriptor(Descriptor* descriptor, |
| 4927 TransitionFlag flag); | 4932 TransitionFlag flag); |
| 4928 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptor(Descriptor* descriptor, | 4933 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptor(Descriptor* descriptor, |
| 4929 int index, | 4934 int index, |
| 4930 TransitionFlag flag); | 4935 TransitionFlag flag); |
| 4931 MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind, | 4936 MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind, |
| 4932 TransitionFlag flag); | 4937 TransitionFlag flag); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5046 // and the values are the maps the are transitioned to. | 5051 // and the values are the maps the are transitioned to. |
| 5047 static const int kMaxCachedPrototypeTransitions = 256; | 5052 static const int kMaxCachedPrototypeTransitions = 256; |
| 5048 | 5053 |
| 5049 Map* GetPrototypeTransition(Object* prototype); | 5054 Map* GetPrototypeTransition(Object* prototype); |
| 5050 | 5055 |
| 5051 MUST_USE_RESULT MaybeObject* PutPrototypeTransition(Object* prototype, | 5056 MUST_USE_RESULT MaybeObject* PutPrototypeTransition(Object* prototype, |
| 5052 Map* map); | 5057 Map* map); |
| 5053 | 5058 |
| 5054 static const int kMaxPreAllocatedPropertyFields = 255; | 5059 static const int kMaxPreAllocatedPropertyFields = 255; |
| 5055 | 5060 |
| 5056 // Constant for denoting that the LastAdded field was not yet set. | |
| 5057 static const int kNoneAdded = LastAddedBits::kMax; | |
| 5058 | |
| 5059 // Layout description. | 5061 // Layout description. |
| 5060 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; | 5062 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; |
| 5061 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; | 5063 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
| 5062 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; | 5064 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; |
| 5063 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; | 5065 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; |
| 5064 // Storage for the transition array is overloaded to directly contain a back | 5066 // Storage for the transition array is overloaded to directly contain a back |
| 5065 // pointer if unused. When the map has transitions, the back pointer is | 5067 // pointer if unused. When the map has transitions, the back pointer is |
| 5066 // transferred to the transition array and accessed through an extra | 5068 // transferred to the transition array and accessed through an extra |
| 5067 // indirection. | 5069 // indirection. |
| 5068 static const int kTransitionsOrBackPointerOffset = | 5070 static const int kTransitionsOrBackPointerOffset = |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5124 static const int8_t kMaximumBitField2FastSmiElementValue = | 5126 static const int8_t kMaximumBitField2FastSmiElementValue = |
| 5125 static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) << | 5127 static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) << |
| 5126 Map::kElementsKindShift) - 1; | 5128 Map::kElementsKindShift) - 1; |
| 5127 static const int8_t kMaximumBitField2FastHoleyElementValue = | 5129 static const int8_t kMaximumBitField2FastHoleyElementValue = |
| 5128 static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) << | 5130 static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) << |
| 5129 Map::kElementsKindShift) - 1; | 5131 Map::kElementsKindShift) - 1; |
| 5130 static const int8_t kMaximumBitField2FastHoleySmiElementValue = | 5132 static const int8_t kMaximumBitField2FastHoleySmiElementValue = |
| 5131 static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) << | 5133 static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) << |
| 5132 Map::kElementsKindShift) - 1; | 5134 Map::kElementsKindShift) - 1; |
| 5133 | 5135 |
| 5134 // Bit positions for bit field 3 | |
| 5135 static const int kIsShared = 0; | |
| 5136 static const int kFunctionWithPrototype = 1; | |
| 5137 static const int kDictionaryMap = 2; | |
| 5138 | |
| 5139 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, | 5136 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, |
| 5140 kPointerFieldsEndOffset, | 5137 kPointerFieldsEndOffset, |
| 5141 kSize> BodyDescriptor; | 5138 kSize> BodyDescriptor; |
| 5142 | 5139 |
| 5143 private: | 5140 private: |
| 5144 DISALLOW_IMPLICIT_CONSTRUCTORS(Map); | 5141 DISALLOW_IMPLICIT_CONSTRUCTORS(Map); |
| 5145 }; | 5142 }; |
| 5146 | 5143 |
| 5147 | 5144 |
| 5148 // An abstract superclass, a marker class really, for simple structure classes. | 5145 // An abstract superclass, a marker class really, for simple structure classes. |
| (...skipping 3766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8915 } else { | 8912 } else { |
| 8916 value &= ~(1 << bit_position); | 8913 value &= ~(1 << bit_position); |
| 8917 } | 8914 } |
| 8918 return value; | 8915 return value; |
| 8919 } | 8916 } |
| 8920 }; | 8917 }; |
| 8921 | 8918 |
| 8922 } } // namespace v8::internal | 8919 } } // namespace v8::internal |
| 8923 | 8920 |
| 8924 #endif // V8_OBJECTS_H_ | 8921 #endif // V8_OBJECTS_H_ |
| OLD | NEW |