| OLD | NEW |
| 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 5862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5873 inline bool HasElementsTransition(); | 5873 inline bool HasElementsTransition(); |
| 5874 inline Map* elements_transition_map(); | 5874 inline Map* elements_transition_map(); |
| 5875 | 5875 |
| 5876 inline Map* GetTransition(int transition_index); | 5876 inline Map* GetTransition(int transition_index); |
| 5877 inline int SearchSpecialTransition(Symbol* name); | 5877 inline int SearchSpecialTransition(Symbol* name); |
| 5878 inline int SearchTransition(PropertyKind kind, Name* name, | 5878 inline int SearchTransition(PropertyKind kind, Name* name, |
| 5879 PropertyAttributes attributes); | 5879 PropertyAttributes attributes); |
| 5880 inline FixedArrayBase* GetInitialElements(); | 5880 inline FixedArrayBase* GetInitialElements(); |
| 5881 | 5881 |
| 5882 DECL_ACCESSORS(transitions, TransitionArray) | 5882 DECL_ACCESSORS(transitions, TransitionArray) |
| 5883 inline void init_transitions(Object* undefined); |
| 5883 | 5884 |
| 5884 static inline Handle<String> ExpectedTransitionKey(Handle<Map> map); | 5885 static inline Handle<String> ExpectedTransitionKey(Handle<Map> map); |
| 5885 static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map); | 5886 static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map); |
| 5886 | 5887 |
| 5887 // Try to follow an existing transition to a field with attributes NONE. The | 5888 // Try to follow an existing transition to a field with attributes NONE. The |
| 5888 // return value indicates whether the transition was successful. | 5889 // return value indicates whether the transition was successful. |
| 5889 static inline Handle<Map> FindTransitionToField(Handle<Map> map, | 5890 static inline Handle<Map> FindTransitionToField(Handle<Map> map, |
| 5890 Handle<Name> key); | 5891 Handle<Name> key); |
| 5891 | 5892 |
| 5892 Map* FindRootMap(); | 5893 Map* FindRootMap(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5947 | 5948 |
| 5948 // [prototype]: implicit prototype object. | 5949 // [prototype]: implicit prototype object. |
| 5949 DECL_ACCESSORS(prototype, Object) | 5950 DECL_ACCESSORS(prototype, Object) |
| 5950 // TODO(jkummerow): make set_prototype private. | 5951 // TODO(jkummerow): make set_prototype private. |
| 5951 void SetPrototype(Handle<Object> prototype, | 5952 void SetPrototype(Handle<Object> prototype, |
| 5952 PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE); | 5953 PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE); |
| 5953 bool ShouldRegisterAsPrototypeUser(Handle<JSObject> prototype); | 5954 bool ShouldRegisterAsPrototypeUser(Handle<JSObject> prototype); |
| 5954 bool CanUseOptimizationsBasedOnPrototypeRegistry(); | 5955 bool CanUseOptimizationsBasedOnPrototypeRegistry(); |
| 5955 | 5956 |
| 5956 // [constructor]: points back to the function responsible for this map. | 5957 // [constructor]: points back to the function responsible for this map. |
| 5957 DECL_ACCESSORS(constructor, Object) | 5958 // The field overlaps with the back pointer. All maps in a transition tree |
| 5959 // have the same constructor, so maps with back pointers can walk the |
| 5960 // back pointer chain until they find the map holding their constructor. |
| 5961 DECL_ACCESSORS(constructor_or_backpointer, Object) |
| 5962 inline Object* GetConstructor() const; |
| 5963 inline void SetConstructor(Object* constructor, |
| 5964 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
| 5965 inline Object* GetBackPointer(); |
| 5966 inline void SetBackPointer(Object* value, |
| 5967 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
| 5958 | 5968 |
| 5959 // [instance descriptors]: describes the object. | 5969 // [instance descriptors]: describes the object. |
| 5960 DECL_ACCESSORS(instance_descriptors, DescriptorArray) | 5970 DECL_ACCESSORS(instance_descriptors, DescriptorArray) |
| 5961 | 5971 |
| 5962 // [layout descriptor]: describes the object layout. | 5972 // [layout descriptor]: describes the object layout. |
| 5963 DECL_ACCESSORS(layout_descriptor, LayoutDescriptor) | 5973 DECL_ACCESSORS(layout_descriptor, LayoutDescriptor) |
| 5964 // |layout descriptor| accessor which can be used from GC. | 5974 // |layout descriptor| accessor which can be used from GC. |
| 5965 inline LayoutDescriptor* layout_descriptor_gc_safe(); | 5975 inline LayoutDescriptor* layout_descriptor_gc_safe(); |
| 5966 inline bool HasFastPointerLayout() const; | 5976 inline bool HasFastPointerLayout() const; |
| 5967 | 5977 |
| 5968 // |layout descriptor| accessor that is safe to call even when | 5978 // |layout descriptor| accessor that is safe to call even when |
| 5969 // FLAG_unbox_double_fields is disabled (in this case Map does not contain | 5979 // FLAG_unbox_double_fields is disabled (in this case Map does not contain |
| 5970 // |layout_descriptor| field at all). | 5980 // |layout_descriptor| field at all). |
| 5971 inline LayoutDescriptor* GetLayoutDescriptor(); | 5981 inline LayoutDescriptor* GetLayoutDescriptor(); |
| 5972 | 5982 |
| 5973 inline void UpdateDescriptors(DescriptorArray* descriptors, | 5983 inline void UpdateDescriptors(DescriptorArray* descriptors, |
| 5974 LayoutDescriptor* layout_descriptor); | 5984 LayoutDescriptor* layout_descriptor); |
| 5975 inline void InitializeDescriptors(DescriptorArray* descriptors, | 5985 inline void InitializeDescriptors(DescriptorArray* descriptors, |
| 5976 LayoutDescriptor* layout_descriptor); | 5986 LayoutDescriptor* layout_descriptor); |
| 5977 | 5987 |
| 5978 // [stub cache]: contains stubs compiled for this map. | 5988 // [stub cache]: contains stubs compiled for this map. |
| 5979 DECL_ACCESSORS(code_cache, Object) | 5989 DECL_ACCESSORS(code_cache, Object) |
| 5980 | 5990 |
| 5981 // [dependent code]: list of optimized codes that weakly embed this map. | 5991 // [dependent code]: list of optimized codes that weakly embed this map. |
| 5982 DECL_ACCESSORS(dependent_code, DependentCode) | 5992 DECL_ACCESSORS(dependent_code, DependentCode) |
| 5983 | 5993 |
| 5984 // [back pointer]: points back to the parent map from which a transition | |
| 5985 // leads to this map. The field overlaps with prototype transitions and the | |
| 5986 // back pointer will be moved into the prototype transitions array if | |
| 5987 // required. | |
| 5988 inline Object* GetBackPointer(); | |
| 5989 inline void SetBackPointer(Object* value, | |
| 5990 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | |
| 5991 inline void init_back_pointer(Object* undefined); | |
| 5992 | |
| 5993 // [prototype transitions]: cache of prototype transitions. | 5994 // [prototype transitions]: cache of prototype transitions. |
| 5994 // Prototype transition is a transition that happens | 5995 // Prototype transition is a transition that happens |
| 5995 // when we change object's prototype to a new one. | 5996 // when we change object's prototype to a new one. |
| 5996 // Cache format: | 5997 // Cache format: |
| 5997 // 0: finger - index of the first free cell in the cache | 5998 // 0: finger - index of the first free cell in the cache |
| 5998 // 1 + i: target map | 5999 // 1 + i: target map |
| 5999 inline FixedArray* GetPrototypeTransitions(); | 6000 inline FixedArray* GetPrototypeTransitions(); |
| 6000 inline bool HasPrototypeTransitions(); | 6001 inline bool HasPrototypeTransitions(); |
| 6001 | 6002 |
| 6002 static const int kProtoTransitionNumberOfEntriesOffset = 0; | 6003 static const int kProtoTransitionNumberOfEntriesOffset = 0; |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6275 Handle<Object> prototype, | 6276 Handle<Object> prototype, |
| 6276 PrototypeOptimizationMode mode); | 6277 PrototypeOptimizationMode mode); |
| 6277 | 6278 |
| 6278 static const int kMaxPreAllocatedPropertyFields = 255; | 6279 static const int kMaxPreAllocatedPropertyFields = 255; |
| 6279 | 6280 |
| 6280 // Layout description. | 6281 // Layout description. |
| 6281 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; | 6282 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; |
| 6282 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; | 6283 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
| 6283 static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; | 6284 static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; |
| 6284 static const int kPrototypeOffset = kBitField3Offset + kPointerSize; | 6285 static const int kPrototypeOffset = kBitField3Offset + kPointerSize; |
| 6285 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; | 6286 static const int kConstructorOrBackPointerOffset = |
| 6286 // Storage for the transition array is overloaded to directly contain a back | 6287 kPrototypeOffset + kPointerSize; |
| 6287 // pointer if unused. When the map has transitions, the back pointer is | 6288 static const int kTransitionsOffset = |
| 6288 // transferred to the transition array and accessed through an extra | 6289 kConstructorOrBackPointerOffset + kPointerSize; |
| 6289 // indirection. | 6290 static const int kDescriptorsOffset = kTransitionsOffset + kPointerSize; |
| 6290 static const int kTransitionsOrBackPointerOffset = | |
| 6291 kConstructorOffset + kPointerSize; | |
| 6292 static const int kDescriptorsOffset = | |
| 6293 kTransitionsOrBackPointerOffset + kPointerSize; | |
| 6294 #if V8_DOUBLE_FIELDS_UNBOXING | 6291 #if V8_DOUBLE_FIELDS_UNBOXING |
| 6295 static const int kLayoutDecriptorOffset = kDescriptorsOffset + kPointerSize; | 6292 static const int kLayoutDecriptorOffset = kDescriptorsOffset + kPointerSize; |
| 6296 static const int kCodeCacheOffset = kLayoutDecriptorOffset + kPointerSize; | 6293 static const int kCodeCacheOffset = kLayoutDecriptorOffset + kPointerSize; |
| 6297 #else | 6294 #else |
| 6298 static const int kLayoutDecriptorOffset = 1; // Must not be ever accessed. | 6295 static const int kLayoutDecriptorOffset = 1; // Must not be ever accessed. |
| 6299 static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; | 6296 static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; |
| 6300 #endif | 6297 #endif |
| 6301 static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; | 6298 static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; |
| 6302 static const int kSize = kDependentCodeOffset + kPointerSize; | 6299 static const int kSize = kDependentCodeOffset + kPointerSize; |
| 6303 | 6300 |
| (...skipping 4684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10988 } else { | 10985 } else { |
| 10989 value &= ~(1 << bit_position); | 10986 value &= ~(1 << bit_position); |
| 10990 } | 10987 } |
| 10991 return value; | 10988 return value; |
| 10992 } | 10989 } |
| 10993 }; | 10990 }; |
| 10994 | 10991 |
| 10995 } } // namespace v8::internal | 10992 } } // namespace v8::internal |
| 10996 | 10993 |
| 10997 #endif // V8_OBJECTS_H_ | 10994 #endif // V8_OBJECTS_H_ |
| OLD | NEW |