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

Side by Side Diff: src/objects.h

Issue 10692130: Swap bitfield3 and backpointer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: u Created 8 years, 5 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 | Annotate | Revision Log
OLDNEW
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 2494 matching lines...) Expand 10 before | Expand all | Expand 10 after
2505 ASSERT(HasEnumCache()); 2505 ASSERT(HasEnumCache());
2506 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), 2506 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this),
2507 kEnumerationIndexOffset); 2507 kEnumerationIndexOffset);
2508 } 2508 }
2509 2509
2510 Object** GetTransitionsSlot() { 2510 Object** GetTransitionsSlot() {
2511 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), 2511 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this),
2512 kTransitionsOffset); 2512 kTransitionsOffset);
2513 } 2513 }
2514 2514
2515 // TODO(1399): It should be possible to make room for bit_field3 in the map 2515 DECL_ACCESSORS(back_pointer_storage, Object)
2516 // without overloading the instance descriptors field in the map
2517 // (and storing it in the DescriptorArray when the map has one).
2518 inline int bit_field3_storage();
2519 inline void set_bit_field3_storage(int value);
2520 2516
2521 // Initialize or change the enum cache, 2517 // Initialize or change the enum cache,
2522 // using the supplied storage for the small "bridge". 2518 // using the supplied storage for the small "bridge".
2523 void SetEnumCache(FixedArray* bridge_storage, 2519 void SetEnumCache(FixedArray* bridge_storage,
2524 FixedArray* new_cache, 2520 FixedArray* new_cache,
2525 Object* new_index_cache); 2521 Object* new_index_cache);
2526 2522
2527 // Accessors for fetching instance descriptor at descriptor number. 2523 // Accessors for fetching instance descriptor at descriptor number.
2528 inline String* GetKey(int descriptor_number); 2524 inline String* GetKey(int descriptor_number);
2529 inline Object** GetKeySlot(int descriptor_number); 2525 inline Object** GetKeySlot(int descriptor_number);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2598 // empty descriptor array object if number_of_descriptors is 0. 2594 // empty descriptor array object if number_of_descriptors is 0.
2599 MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors, 2595 MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors,
2600 SharedMode shared_mode); 2596 SharedMode shared_mode);
2601 2597
2602 // Casting. 2598 // Casting.
2603 static inline DescriptorArray* cast(Object* obj); 2599 static inline DescriptorArray* cast(Object* obj);
2604 2600
2605 // Constant for denoting key was not found. 2601 // Constant for denoting key was not found.
2606 static const int kNotFound = -1; 2602 static const int kNotFound = -1;
2607 2603
2608 static const int kBitField3StorageIndex = 0; 2604 static const int kBackPointerStorageIndex = 0;
2609 static const int kEnumerationIndexIndex = 1; 2605 static const int kEnumerationIndexIndex = 1;
2610 static const int kTransitionsIndex = 2; 2606 static const int kTransitionsIndex = 2;
2611 static const int kFirstIndex = 3; 2607 static const int kFirstIndex = 3;
2612 2608
2613 // The length of the "bridge" to the enum cache. 2609 // The length of the "bridge" to the enum cache.
2614 static const int kEnumCacheBridgeLength = 3; 2610 static const int kEnumCacheBridgeLength = 3;
2615 static const int kEnumCacheBridgeEnumIndex = 0; 2611 static const int kEnumCacheBridgeEnumIndex = 0;
2616 static const int kEnumCacheBridgeCacheIndex = 1; 2612 static const int kEnumCacheBridgeCacheIndex = 1;
2617 static const int kEnumCacheBridgeIndicesCacheIndex = 2; 2613 static const int kEnumCacheBridgeIndicesCacheIndex = 2;
2618 2614
2619 // Layout description. 2615 // Layout description.
2620 static const int kBitField3StorageOffset = FixedArray::kHeaderSize; 2616 static const int kBackPointerStorageOffset = FixedArray::kHeaderSize;
2621 static const int kEnumerationIndexOffset = kBitField3StorageOffset + 2617 static const int kEnumerationIndexOffset = kBackPointerStorageOffset +
2622 kPointerSize; 2618 kPointerSize;
2623 static const int kTransitionsOffset = kEnumerationIndexOffset + kPointerSize; 2619 static const int kTransitionsOffset = kEnumerationIndexOffset + kPointerSize;
2624 static const int kFirstOffset = kTransitionsOffset + kPointerSize; 2620 static const int kFirstOffset = kTransitionsOffset + kPointerSize;
2625 2621
2626 // Layout description for the bridge array. 2622 // Layout description for the bridge array.
2627 static const int kEnumCacheBridgeEnumOffset = FixedArray::kHeaderSize; 2623 static const int kEnumCacheBridgeEnumOffset = FixedArray::kHeaderSize;
2628 static const int kEnumCacheBridgeCacheOffset = 2624 static const int kEnumCacheBridgeCacheOffset =
2629 kEnumCacheBridgeEnumOffset + kPointerSize; 2625 kEnumCacheBridgeEnumOffset + kPointerSize;
2630 2626
2631 // Layout of descriptor. 2627 // Layout of descriptor.
(...skipping 1979 matching lines...) Expand 10 before | Expand all | Expand 10 after
4611 4607
4612 // Bit field. 4608 // Bit field.
4613 inline byte bit_field(); 4609 inline byte bit_field();
4614 inline void set_bit_field(byte value); 4610 inline void set_bit_field(byte value);
4615 4611
4616 // Bit field 2. 4612 // Bit field 2.
4617 inline byte bit_field2(); 4613 inline byte bit_field2();
4618 inline void set_bit_field2(byte value); 4614 inline void set_bit_field2(byte value);
4619 4615
4620 // Bit field 3. 4616 // Bit field 3.
4621 // TODO(1399): It should be possible to make room for bit_field3 in the map 4617 // TODO(1399): It should be possible to make room for bit_field3 in the map
Jakob Kummerow 2012/07/10 12:26:25 outdated comment?
Toon Verwaest 2012/07/10 13:28:28 Done.
4622 // without overloading the instance descriptors field (and storing it in the 4618 // without overloading the instance descriptors field (and storing it in the
4623 // DescriptorArray when the map has one). 4619 // DescriptorArray when the map has one).
4624 inline int bit_field3(); 4620 inline int bit_field3();
4625 inline void set_bit_field3(int value); 4621 inline void set_bit_field3(int value);
4626 inline void SetOwnBitField3(int value);
4627 4622
4628 // Tells whether the object in the prototype property will be used 4623 // Tells whether the object in the prototype property will be used
4629 // for instances created from this function. If the prototype 4624 // for instances created from this function. If the prototype
4630 // property is set to a value that is not a JSObject, the prototype 4625 // property is set to a value that is not a JSObject, the prototype
4631 // property will not be used to create instances of the function. 4626 // property will not be used to create instances of the function.
4632 // See ECMA-262, 13.2.2. 4627 // See ECMA-262, 13.2.2.
4633 inline void set_non_instance_prototype(bool value); 4628 inline void set_non_instance_prototype(bool value);
4634 inline bool has_non_instance_prototype(); 4629 inline bool has_non_instance_prototype();
4635 4630
4636 // Tells whether function has special prototype property. If not, prototype 4631 // Tells whether function has special prototype property. If not, prototype
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
4747 inline bool HasTransitionArray(); 4742 inline bool HasTransitionArray();
4748 inline bool HasElementsTransition(); 4743 inline bool HasElementsTransition();
4749 inline Map* elements_transition_map(); 4744 inline Map* elements_transition_map();
4750 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map( 4745 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map(
4751 Map* transitioned_map); 4746 Map* transitioned_map);
4752 inline TransitionArray* transitions(); 4747 inline TransitionArray* transitions();
4753 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, 4748 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key,
4754 Object* value); 4749 Object* value);
4755 MUST_USE_RESULT inline MaybeObject* set_transitions( 4750 MUST_USE_RESULT inline MaybeObject* set_transitions(
4756 TransitionArray* transitions); 4751 TransitionArray* transitions);
4757 inline void ClearTransitions(); 4752 inline void ClearTransitions(Heap* heap,
4753 WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
4758 4754
4759 // Tells whether the map is attached to SharedFunctionInfo 4755 // Tells whether the map is attached to SharedFunctionInfo
4760 // (for inobject slack tracking). 4756 // (for inobject slack tracking).
4761 inline void set_attached_to_shared_function_info(bool value); 4757 inline void set_attached_to_shared_function_info(bool value);
4762 4758
4763 inline bool attached_to_shared_function_info(); 4759 inline bool attached_to_shared_function_info();
4764 4760
4765 // Tells whether the map is shared between objects that may have different 4761 // Tells whether the map is shared between objects that may have different
4766 // behavior. If true, the map should never be modified, instead a clone 4762 // behavior. If true, the map should never be modified, instead a clone
4767 // should be created and modified. 4763 // should be created and modified.
4768 inline void set_is_shared(bool value); 4764 inline void set_is_shared(bool value);
4769 inline bool is_shared(); 4765 inline bool is_shared();
4770 4766
4771 // Tells whether the instance needs security checks when accessing its 4767 // Tells whether the instance needs security checks when accessing its
4772 // properties. 4768 // properties.
4773 inline void set_is_access_check_needed(bool access_check_needed); 4769 inline void set_is_access_check_needed(bool access_check_needed);
4774 inline bool is_access_check_needed(); 4770 inline bool is_access_check_needed();
4775 4771
4776 // [prototype]: implicit prototype object. 4772 // [prototype]: implicit prototype object.
4777 DECL_ACCESSORS(prototype, Object) 4773 DECL_ACCESSORS(prototype, Object)
4778 4774
4779 // [constructor]: points back to the function responsible for this map. 4775 // [constructor]: points back to the function responsible for this map.
4780 DECL_ACCESSORS(constructor, Object) 4776 DECL_ACCESSORS(constructor, Object)
4781 4777
4782 inline JSFunction* unchecked_constructor(); 4778 inline JSFunction* unchecked_constructor();
4783 4779
4784 // Should only be called by the code that initializes map to set initial valid
4785 // value of the instance descriptor member.
4786 inline void init_instance_descriptors();
4787
4788 // [instance descriptors]: describes the object. 4780 // [instance descriptors]: describes the object.
4789 DECL_ACCESSORS(instance_descriptors, DescriptorArray) 4781 DECL_ACCESSORS(instance_descriptors, DescriptorArray)
4790 4782
4791 // Should only be called to clear a descriptor array that was only used to 4783 // Should only be called to clear a descriptor array that was only used to
4792 // store transitions and does not contain any live transitions anymore. 4784 // store transitions and does not contain any live transitions anymore.
4793 inline void ClearDescriptorArray(); 4785 inline void ClearDescriptorArray(Heap* heap, WriteBarrierMode mode);
4794
4795 // Sets the instance descriptor array for the map to be an empty descriptor
4796 // array.
4797 inline void clear_instance_descriptors();
4798 4786
4799 // [stub cache]: contains stubs compiled for this map. 4787 // [stub cache]: contains stubs compiled for this map.
4800 DECL_ACCESSORS(code_cache, Object) 4788 DECL_ACCESSORS(code_cache, Object)
4801 4789
4802 // [back pointer]: points back to the parent map from which a transition 4790 // [back pointer]: points back to the parent map from which a transition
4803 // leads to this map. The field overlaps with prototype transitions and the 4791 // leads to this map. The field overlaps with prototype transitions and the
4804 // back pointer will be moved into the prototype transitions array if 4792 // back pointer will be moved into the prototype transitions array if
4805 // required. 4793 // required.
4806 inline Object* GetBackPointer(); 4794 inline Object* GetBackPointer();
4807 inline void SetBackPointer(Object* value, 4795 inline void SetBackPointer(Object* value,
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
4982 4970
4983 // Layout description. 4971 // Layout description.
4984 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; 4972 static const int kInstanceSizesOffset = HeapObject::kHeaderSize;
4985 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; 4973 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize;
4986 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; 4974 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize;
4987 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; 4975 static const int kConstructorOffset = kPrototypeOffset + kPointerSize;
4988 // Storage for instance descriptors is overloaded to also contain additional 4976 // Storage for instance descriptors is overloaded to also contain additional
4989 // map flags when unused (bit_field3). When the map has instance descriptors, 4977 // map flags when unused (bit_field3). When the map has instance descriptors,
4990 // the flags are transferred to the instance descriptor array and accessed 4978 // the flags are transferred to the instance descriptor array and accessed
4991 // through an extra indirection. 4979 // through an extra indirection.
4992 // TODO(1399): It should be possible to make room for bit_field3 in the map 4980 // TODO(1399): It should be possible to make room for bit_field3 in the map
Jakob Kummerow 2012/07/10 12:26:25 outdated comment?
Toon Verwaest 2012/07/10 13:28:28 Done.
4993 // without overloading the instance descriptors field, but the map is 4981 // without overloading the instance descriptors field, but the map is
4994 // currently perfectly aligned to 32 bytes and extending it at all would 4982 // currently perfectly aligned to 32 bytes and extending it at all would
4995 // double its size. After the increment GC work lands, this size restriction 4983 // double its size. After the increment GC work lands, this size restriction
4996 // could be loosened and bit_field3 moved directly back in the map. 4984 // could be loosened and bit_field3 moved directly back in the map.
4997 static const int kInstanceDescriptorsOrBitField3Offset = 4985 static const int kInstanceDescriptorsOrBackPointerOffset =
4998 kConstructorOffset + kPointerSize; 4986 kConstructorOffset + kPointerSize;
4999 static const int kCodeCacheOffset = 4987 static const int kCodeCacheOffset =
5000 kInstanceDescriptorsOrBitField3Offset + kPointerSize; 4988 kInstanceDescriptorsOrBackPointerOffset + kPointerSize;
5001 static const int kBackPointerOffset = kCodeCacheOffset + kPointerSize; 4989 static const int kBitField3Offset = kCodeCacheOffset + kPointerSize;
5002 static const int kPadStart = kBackPointerOffset + kPointerSize; 4990 static const int kPadStart = kBitField3Offset + kPointerSize;
5003 static const int kSize = MAP_POINTER_ALIGN(kPadStart); 4991 static const int kSize = MAP_POINTER_ALIGN(kPadStart);
5004 4992
5005 // Layout of pointer fields. Heap iteration code relies on them 4993 // Layout of pointer fields. Heap iteration code relies on them
5006 // being continuously allocated. 4994 // being continuously allocated.
5007 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; 4995 static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset;
5008 static const int kPointerFieldsEndOffset = kBackPointerOffset + kPointerSize; 4996 static const int kPointerFieldsEndOffset = kBitField3Offset + kPointerSize;
5009 4997
5010 // Byte offsets within kInstanceSizesOffset. 4998 // Byte offsets within kInstanceSizesOffset.
5011 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; 4999 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0;
5012 static const int kInObjectPropertiesByte = 1; 5000 static const int kInObjectPropertiesByte = 1;
5013 static const int kInObjectPropertiesOffset = 5001 static const int kInObjectPropertiesOffset =
5014 kInstanceSizesOffset + kInObjectPropertiesByte; 5002 kInstanceSizesOffset + kInObjectPropertiesByte;
5015 static const int kPreAllocatedPropertyFieldsByte = 2; 5003 static const int kPreAllocatedPropertyFieldsByte = 2;
5016 static const int kPreAllocatedPropertyFieldsOffset = 5004 static const int kPreAllocatedPropertyFieldsOffset =
5017 kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte; 5005 kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte;
5018 static const int kVisitorIdByte = 3; 5006 static const int kVisitorIdByte = 3;
(...skipping 3805 matching lines...) Expand 10 before | Expand all | Expand 10 after
8824 } else { 8812 } else {
8825 value &= ~(1 << bit_position); 8813 value &= ~(1 << bit_position);
8826 } 8814 }
8827 return value; 8815 return value;
8828 } 8816 }
8829 }; 8817 };
8830 8818
8831 } } // namespace v8::internal 8819 } } // namespace v8::internal
8832 8820
8833 #endif // V8_OBJECTS_H_ 8821 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698