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

Side by Side Diff: src/layout-descriptor.h

Issue 726713003: LayoutDescriptorHelper is now able to calculate the length of contiguous regions of tagged/non-tagg… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased Created 6 years 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/heap/store-buffer.cc ('k') | src/layout-descriptor.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_LAYOUT_DESCRIPTOR_H_ 5 #ifndef V8_LAYOUT_DESCRIPTOR_H_
6 #define V8_LAYOUT_DESCRIPTOR_H_ 6 #define V8_LAYOUT_DESCRIPTOR_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/objects.h" 10 #include "src/objects.h"
11 11
12 namespace v8 { 12 namespace v8 {
13 namespace internal { 13 namespace internal {
14 14
15 // LayoutDescriptor is a bit vector defining which fields contain non-tagged 15 // LayoutDescriptor is a bit vector defining which fields contain non-tagged
16 // values. It could either be a fixed typed array (slow form) or a Smi 16 // values. It could either be a fixed typed array (slow form) or a Smi
17 // if the length fits (fast form). 17 // if the length fits (fast form).
18 // Each bit in the layout represents a FIELD. The bits are referenced by 18 // Each bit in the layout represents a FIELD. The bits are referenced by
19 // field_index which is a field number. If the bit is set then the corresponding 19 // field_index which is a field number. If the bit is set then the corresponding
20 // field contains a non-tagged value and therefore must be skipped by GC. 20 // field contains a non-tagged value and therefore must be skipped by GC.
21 // Otherwise the field is considered tagged. If the queried bit lays "outside" 21 // Otherwise the field is considered tagged. If the queried bit lays "outside"
22 // of the descriptor then the field is also considered tagged. 22 // of the descriptor then the field is also considered tagged.
23 // Once a layout descriptor is created it is allowed only to append properties 23 // Once a layout descriptor is created it is allowed only to append properties
24 // to it. 24 // to it.
25 class LayoutDescriptor : public FixedTypedArray<Uint32ArrayTraits> { 25 class LayoutDescriptor : public FixedTypedArray<Uint32ArrayTraits> {
26 public: 26 public:
27 V8_INLINE bool IsTagged(int field_index); 27 V8_INLINE bool IsTagged(int field_index);
28 28
29 // Queries the contiguous region of fields that are either tagged or not.
30 // Returns true if the given field is tagged or false otherwise and writes
31 // the length of the contiguous region to |out_sequence_length|.
32 // If the sequence is longer than |max_sequence_length| then
33 // |out_sequence_length| is set to |max_sequence_length|.
34 bool IsTagged(int field_index, int max_sequence_length,
35 int* out_sequence_length);
36
29 // Returns true if this is a layout of the object having only tagged fields. 37 // Returns true if this is a layout of the object having only tagged fields.
30 V8_INLINE bool IsFastPointerLayout(); 38 V8_INLINE bool IsFastPointerLayout();
31 V8_INLINE static bool IsFastPointerLayout(Object* layout_descriptor); 39 V8_INLINE static bool IsFastPointerLayout(Object* layout_descriptor);
32 40
33 // Returns true if the layout descriptor is in non-Smi form. 41 // Returns true if the layout descriptor is in non-Smi form.
34 V8_INLINE bool IsSlowLayout(); 42 V8_INLINE bool IsSlowLayout();
35 43
36 V8_INLINE static LayoutDescriptor* cast(Object* object); 44 V8_INLINE static LayoutDescriptor* cast(Object* object);
37 V8_INLINE static const LayoutDescriptor* cast(const Object* object); 45 V8_INLINE static const LayoutDescriptor* cast(const Object* object);
38 46
(...skipping 30 matching lines...) Expand all
69 #ifdef OBJECT_PRINT 77 #ifdef OBJECT_PRINT
70 // For our gdb macros, we should perhaps change these in the future. 78 // For our gdb macros, we should perhaps change these in the future.
71 void Print(); 79 void Print();
72 80
73 void Print(std::ostream& os); // NOLINT 81 void Print(std::ostream& os); // NOLINT
74 #endif 82 #endif
75 83
76 // Capacity of layout descriptors in bits. 84 // Capacity of layout descriptors in bits.
77 V8_INLINE int capacity(); 85 V8_INLINE int capacity();
78 86
79 V8_INLINE LayoutDescriptor* SetTaggedForTesting(int field_index, 87 static Handle<LayoutDescriptor> NewForTesting(Isolate* isolate, int length);
80 bool tagged) { 88 LayoutDescriptor* SetTaggedForTesting(int field_index, bool tagged);
81 return SetTagged(field_index, tagged);
82 }
83 89
84 private: 90 private:
85 static const int kNumberOfBits = 32; 91 static const int kNumberOfBits = 32;
86 92
87 V8_INLINE static Handle<LayoutDescriptor> New(Isolate* isolate, int length); 93 V8_INLINE static Handle<LayoutDescriptor> New(Isolate* isolate, int length);
88 V8_INLINE static LayoutDescriptor* FromSmi(Smi* smi); 94 V8_INLINE static LayoutDescriptor* FromSmi(Smi* smi);
89 95
90 V8_INLINE static bool InobjectUnboxedField(int inobject_properties, 96 V8_INLINE static bool InobjectUnboxedField(int inobject_properties,
91 PropertyDetails details); 97 PropertyDetails details);
92 98
93 static Handle<LayoutDescriptor> EnsureCapacity( 99 static Handle<LayoutDescriptor> EnsureCapacity(
94 Isolate* isolate, Handle<LayoutDescriptor> layout_descriptor, 100 Isolate* isolate, Handle<LayoutDescriptor> layout_descriptor,
95 int new_capacity); 101 int new_capacity);
96 102
97 // Returns false if requested field_index is out of bounds. 103 // Returns false if requested field_index is out of bounds.
98 V8_INLINE bool GetIndexes(int field_index, int* layout_word_index, 104 V8_INLINE bool GetIndexes(int field_index, int* layout_word_index,
99 uint32_t* layout_mask); 105 int* layout_bit_index);
100 106
101 V8_INLINE MUST_USE_RESULT LayoutDescriptor* SetRawData(int field_index) { 107 V8_INLINE MUST_USE_RESULT LayoutDescriptor* SetRawData(int field_index) {
102 return SetTagged(field_index, false); 108 return SetTagged(field_index, false);
103 } 109 }
104 110
105 V8_INLINE MUST_USE_RESULT LayoutDescriptor* SetTagged(int field_index, 111 V8_INLINE MUST_USE_RESULT LayoutDescriptor* SetTagged(int field_index,
106 bool tagged); 112 bool tagged);
107 }; 113 };
108 114
109 115
110 // InobjectPropertiesHelper is a helper class for querying layout descriptor 116 // LayoutDescriptorHelper is a helper class for querying layout descriptor
111 // about whether the field at given offset is tagged or not. 117 // about whether the field at given offset is tagged or not.
112 class InobjectPropertiesHelper { 118 class LayoutDescriptorHelper {
113 public: 119 public:
114 inline explicit InobjectPropertiesHelper(Map* map); 120 inline explicit LayoutDescriptorHelper(Map* map);
115 121
116 bool all_fields_tagged() { return all_fields_tagged_; } 122 bool all_fields_tagged() { return all_fields_tagged_; }
117 inline bool IsTagged(int offset_in_bytes); 123 inline bool IsTagged(int offset_in_bytes);
118 124
125 // Queries the contiguous region of fields that are either tagged or not.
126 // Returns true if fields starting at |offset_in_bytes| are tagged or false
127 // otherwise and writes the offset of the end of the contiguous region to
128 // |out_end_of_contiguous_region_offset|. The |end_offset| value is the
129 // upper bound for |out_end_of_contiguous_region_offset|.
130 bool IsTagged(int offset_in_bytes, int end_offset,
131 int* out_end_of_contiguous_region_offset);
132
119 private: 133 private:
120 bool all_fields_tagged_; 134 bool all_fields_tagged_;
121 int header_size_; 135 int header_size_;
122 LayoutDescriptor* layout_descriptor_; 136 LayoutDescriptor* layout_descriptor_;
123 }; 137 };
124 } 138 }
125 } // namespace v8::internal 139 } // namespace v8::internal
126 140
127 #endif // V8_LAYOUT_DESCRIPTOR_H_ 141 #endif // V8_LAYOUT_DESCRIPTOR_H_
OLDNEW
« no previous file with comments | « src/heap/store-buffer.cc ('k') | src/layout-descriptor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698