| 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 2438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2449 #endif | 2449 #endif |
| 2450 DECLARE_VERIFIER(FixedDoubleArray) | 2450 DECLARE_VERIFIER(FixedDoubleArray) |
| 2451 | 2451 |
| 2452 private: | 2452 private: |
| 2453 DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); | 2453 DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); |
| 2454 }; | 2454 }; |
| 2455 | 2455 |
| 2456 | 2456 |
| 2457 // DescriptorArrays are fixed arrays used to hold instance descriptors. | 2457 // DescriptorArrays are fixed arrays used to hold instance descriptors. |
| 2458 // The format of the these objects is: | 2458 // The format of the these objects is: |
| 2459 // [0]: Either Smi(0) if uninitialized, or a pointer to small fixed array: | 2459 // [0]: Number of descriptors |
| 2460 // [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array: |
| 2460 // [0]: pointer to fixed array with enum cache | 2461 // [0]: pointer to fixed array with enum cache |
| 2461 // [1]: either Smi(0) or pointer to fixed array with indices | 2462 // [1]: either Smi(0) or pointer to fixed array with indices |
| 2462 // [1]: first key | 2463 // [2]: first key |
| 2463 // [length() - kDescriptorSize]: last key | 2464 // [2 + number of descriptors * kDescriptorSize]: start of slack |
| 2464 class DescriptorArray: public FixedArray { | 2465 class DescriptorArray: public FixedArray { |
| 2465 public: | 2466 public: |
| 2466 // WhitenessWitness is used to prove that a descriptor array is white | 2467 // WhitenessWitness is used to prove that a descriptor array is white |
| 2467 // (unmarked), so incremental write barriers can be skipped because the | 2468 // (unmarked), so incremental write barriers can be skipped because the |
| 2468 // marking invariant cannot be broken and slots pointing into evacuation | 2469 // marking invariant cannot be broken and slots pointing into evacuation |
| 2469 // candidates will be discovered when the object is scanned. A witness is | 2470 // candidates will be discovered when the object is scanned. A witness is |
| 2470 // always stack-allocated right after creating an array. By allocating a | 2471 // always stack-allocated right after creating an array. By allocating a |
| 2471 // witness, incremental marking is globally disabled. The witness is then | 2472 // witness, incremental marking is globally disabled. The witness is then |
| 2472 // passed along wherever needed to statically prove that the array is known to | 2473 // passed along wherever needed to statically prove that the array is known to |
| 2473 // be white. | 2474 // be white. |
| (...skipping 2327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4801 } | 4802 } |
| 4802 | 4803 |
| 4803 inline bool has_slow_elements_kind() { | 4804 inline bool has_slow_elements_kind() { |
| 4804 return elements_kind() == DICTIONARY_ELEMENTS | 4805 return elements_kind() == DICTIONARY_ELEMENTS |
| 4805 || elements_kind() == NON_STRICT_ARGUMENTS_ELEMENTS; | 4806 || elements_kind() == NON_STRICT_ARGUMENTS_ELEMENTS; |
| 4806 } | 4807 } |
| 4807 | 4808 |
| 4808 static bool IsValidElementsTransition(ElementsKind from_kind, | 4809 static bool IsValidElementsTransition(ElementsKind from_kind, |
| 4809 ElementsKind to_kind); | 4810 ElementsKind to_kind); |
| 4810 | 4811 |
| 4811 bool StoresOwnDescriptors() { return HasTransitionArray(); } | |
| 4812 inline bool HasTransitionArray(); | 4812 inline bool HasTransitionArray(); |
| 4813 inline bool HasElementsTransition(); | 4813 inline bool HasElementsTransition(); |
| 4814 inline Map* elements_transition_map(); | 4814 inline Map* elements_transition_map(); |
| 4815 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map( | 4815 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map( |
| 4816 Map* transitioned_map); | 4816 Map* transitioned_map); |
| 4817 inline void SetTransition(int transition_index, Map* target); | 4817 inline void SetTransition(int transition_index, Map* target); |
| 4818 inline Map* GetTransition(int transition_index); | 4818 inline Map* GetTransition(int transition_index); |
| 4819 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, | 4819 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, |
| 4820 Map* target, | 4820 Map* target, |
| 4821 SimpleTransitionFlag flag); | 4821 SimpleTransitionFlag flag); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 4849 | 4849 |
| 4850 // [prototype]: implicit prototype object. | 4850 // [prototype]: implicit prototype object. |
| 4851 DECL_ACCESSORS(prototype, Object) | 4851 DECL_ACCESSORS(prototype, Object) |
| 4852 | 4852 |
| 4853 // [constructor]: points back to the function responsible for this map. | 4853 // [constructor]: points back to the function responsible for this map. |
| 4854 DECL_ACCESSORS(constructor, Object) | 4854 DECL_ACCESSORS(constructor, Object) |
| 4855 | 4855 |
| 4856 inline JSFunction* unchecked_constructor(); | 4856 inline JSFunction* unchecked_constructor(); |
| 4857 | 4857 |
| 4858 // [instance descriptors]: describes the object. | 4858 // [instance descriptors]: describes the object. |
| 4859 inline DescriptorArray* instance_descriptors(); | 4859 DECL_ACCESSORS(instance_descriptors, DescriptorArray) |
| 4860 MUST_USE_RESULT inline MaybeObject* SetDescriptors( | 4860 inline void InitializeDescriptors(DescriptorArray* descriptors); |
| 4861 DescriptorArray* descriptors); | |
| 4862 static void SetDescriptors(Handle<Map> map, | |
| 4863 Handle<DescriptorArray> descriptors); | |
| 4864 MUST_USE_RESULT inline MaybeObject* InitializeDescriptors( | |
| 4865 DescriptorArray* descriptors); | |
| 4866 | 4861 |
| 4867 // [stub cache]: contains stubs compiled for this map. | 4862 // [stub cache]: contains stubs compiled for this map. |
| 4868 DECL_ACCESSORS(code_cache, Object) | 4863 DECL_ACCESSORS(code_cache, Object) |
| 4869 | 4864 |
| 4870 // [back pointer]: points back to the parent map from which a transition | 4865 // [back pointer]: points back to the parent map from which a transition |
| 4871 // leads to this map. The field overlaps with prototype transitions and the | 4866 // leads to this map. The field overlaps with prototype transitions and the |
| 4872 // back pointer will be moved into the prototype transitions array if | 4867 // back pointer will be moved into the prototype transitions array if |
| 4873 // required. | 4868 // required. |
| 4874 inline Object* GetBackPointer(); | 4869 inline Object* GetBackPointer(); |
| 4875 inline void SetBackPointer(Object* value, | 4870 inline void SetBackPointer(Object* value, |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5117 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; | 5112 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; |
| 5118 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; | 5113 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
| 5119 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; | 5114 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; |
| 5120 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; | 5115 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; |
| 5121 // Storage for the transition array is overloaded to directly contain a back | 5116 // Storage for the transition array is overloaded to directly contain a back |
| 5122 // pointer if unused. When the map has transitions, the back pointer is | 5117 // pointer if unused. When the map has transitions, the back pointer is |
| 5123 // transferred to the transition array and accessed through an extra | 5118 // transferred to the transition array and accessed through an extra |
| 5124 // indirection. | 5119 // indirection. |
| 5125 static const int kTransitionsOrBackPointerOffset = | 5120 static const int kTransitionsOrBackPointerOffset = |
| 5126 kConstructorOffset + kPointerSize; | 5121 kConstructorOffset + kPointerSize; |
| 5122 static const int kDescriptorsOffset = |
| 5123 kTransitionsOrBackPointerOffset + kPointerSize; |
| 5127 static const int kCodeCacheOffset = | 5124 static const int kCodeCacheOffset = |
| 5128 kTransitionsOrBackPointerOffset + kPointerSize; | 5125 kDescriptorsOffset + kPointerSize; |
| 5129 static const int kBitField3Offset = kCodeCacheOffset + kPointerSize; | 5126 static const int kBitField3Offset = kCodeCacheOffset + kPointerSize; |
| 5130 static const int kPadStart = kBitField3Offset + kPointerSize; | 5127 static const int kSize = kBitField3Offset + kPointerSize; |
| 5131 static const int kSize = MAP_POINTER_ALIGN(kPadStart); | |
| 5132 | 5128 |
| 5133 // Layout of pointer fields. Heap iteration code relies on them | 5129 // Layout of pointer fields. Heap iteration code relies on them |
| 5134 // being continuously allocated. | 5130 // being continuously allocated. |
| 5135 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; | 5131 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; |
| 5136 static const int kPointerFieldsEndOffset = kBitField3Offset + kPointerSize; | 5132 static const int kPointerFieldsEndOffset = kBitField3Offset + kPointerSize; |
| 5137 | 5133 |
| 5138 // Byte offsets within kInstanceSizesOffset. | 5134 // Byte offsets within kInstanceSizesOffset. |
| 5139 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; | 5135 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; |
| 5140 static const int kInObjectPropertiesByte = 1; | 5136 static const int kInObjectPropertiesByte = 1; |
| 5141 static const int kInObjectPropertiesOffset = | 5137 static const int kInObjectPropertiesOffset = |
| (...skipping 3790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8932 } else { | 8928 } else { |
| 8933 value &= ~(1 << bit_position); | 8929 value &= ~(1 << bit_position); |
| 8934 } | 8930 } |
| 8935 return value; | 8931 return value; |
| 8936 } | 8932 } |
| 8937 }; | 8933 }; |
| 8938 | 8934 |
| 8939 } } // namespace v8::internal | 8935 } } // namespace v8::internal |
| 8940 | 8936 |
| 8941 #endif // V8_OBJECTS_H_ | 8937 #endif // V8_OBJECTS_H_ |
| OLD | NEW |