Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_INL_H_ | 5 #ifndef V8_LAYOUT_DESCRIPTOR_INL_H_ |
| 6 #define V8_LAYOUT_DESCRIPTOR_INL_H_ | 6 #define V8_LAYOUT_DESCRIPTOR_INL_H_ |
| 7 | 7 |
| 8 #include "src/layout-descriptor.h" | 8 #include "src/layout-descriptor.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 // This is a mixed descriptor which is a fixed typed array. | 147 // This is a mixed descriptor which is a fixed typed array. |
| 148 MapWord map_word = reinterpret_cast<HeapObject*>(object)->map_word(); | 148 MapWord map_word = reinterpret_cast<HeapObject*>(object)->map_word(); |
| 149 if (map_word.IsForwardingAddress()) { | 149 if (map_word.IsForwardingAddress()) { |
| 150 // Mark-compact has already moved layout descriptor. | 150 // Mark-compact has already moved layout descriptor. |
| 151 object = map_word.ToForwardingAddress(); | 151 object = map_word.ToForwardingAddress(); |
| 152 } | 152 } |
| 153 return LayoutDescriptor::cast(object); | 153 return LayoutDescriptor::cast(object); |
| 154 } | 154 } |
| 155 | 155 |
| 156 | 156 |
| 157 int LayoutDescriptor::CalculateCapacity(Map* map, DescriptorArray* descriptors, | |
| 158 int num_descriptors) { | |
| 159 int inobject_properties = map->inobject_properties(); | |
| 160 if (inobject_properties == 0) return 0; | |
| 161 | |
| 162 DCHECK(num_descriptors <= descriptors->number_of_descriptors()); | |
|
Toon Verwaest
2015/03/30 11:42:25
_LE
Igor Sheludko
2015/03/30 16:01:29
Done.
| |
| 163 | |
| 164 int layout_descriptor_length; | |
| 165 const int kMaxWordsPerField = kDoubleSize / kPointerSize; | |
| 166 | |
| 167 if (num_descriptors <= kSmiValueSize / kMaxWordsPerField) { | |
| 168 // Even in the "worst" case (all fields are doubles) it would fit into | |
| 169 // a Smi, so no need to calculate length. | |
| 170 layout_descriptor_length = kSmiValueSize; | |
| 171 | |
| 172 } else { | |
| 173 layout_descriptor_length = 0; | |
| 174 | |
| 175 for (int i = 0; i < num_descriptors; i++) { | |
| 176 PropertyDetails details = descriptors->GetDetails(i); | |
| 177 if (!InobjectUnboxedField(inobject_properties, details)) continue; | |
| 178 int field_index = details.field_index(); | |
| 179 int field_width_in_words = details.field_width_in_words(); | |
| 180 layout_descriptor_length = | |
| 181 Max(layout_descriptor_length, field_index + field_width_in_words); | |
| 182 } | |
| 183 } | |
| 184 layout_descriptor_length = Min(layout_descriptor_length, inobject_properties); | |
| 185 return layout_descriptor_length; | |
| 186 } | |
| 187 | |
| 188 | |
| 189 LayoutDescriptor* LayoutDescriptor::Initialize( | |
| 190 LayoutDescriptor* layout_descriptor, Map* map, DescriptorArray* descriptors, | |
| 191 int num_descriptors) { | |
| 192 DisallowHeapAllocation no_allocation; | |
| 193 int inobject_properties = map->inobject_properties(); | |
| 194 | |
| 195 for (int i = 0; i < num_descriptors; i++) { | |
| 196 PropertyDetails details = descriptors->GetDetails(i); | |
| 197 if (!InobjectUnboxedField(inobject_properties, details)) { | |
| 198 DCHECK(details.location() != kField || | |
| 199 layout_descriptor->IsTagged(details.field_index())); | |
| 200 continue; | |
| 201 } | |
| 202 int field_index = details.field_index(); | |
| 203 layout_descriptor = layout_descriptor->SetRawData(field_index); | |
| 204 if (details.field_width_in_words() > 1) { | |
| 205 layout_descriptor = layout_descriptor->SetRawData(field_index + 1); | |
| 206 } | |
| 207 } | |
| 208 return layout_descriptor; | |
| 209 } | |
| 210 | |
| 211 | |
| 157 // InobjectPropertiesHelper is a helper class for querying whether inobject | 212 // InobjectPropertiesHelper is a helper class for querying whether inobject |
| 158 // property at offset is Double or not. | 213 // property at offset is Double or not. |
| 159 LayoutDescriptorHelper::LayoutDescriptorHelper(Map* map) | 214 LayoutDescriptorHelper::LayoutDescriptorHelper(Map* map) |
| 160 : all_fields_tagged_(true), | 215 : all_fields_tagged_(true), |
| 161 header_size_(0), | 216 header_size_(0), |
| 162 layout_descriptor_(LayoutDescriptor::FastPointerLayout()) { | 217 layout_descriptor_(LayoutDescriptor::FastPointerLayout()) { |
| 163 if (!FLAG_unbox_double_fields) return; | 218 if (!FLAG_unbox_double_fields) return; |
| 164 | 219 |
| 165 layout_descriptor_ = map->layout_descriptor_gc_safe(); | 220 layout_descriptor_ = map->layout_descriptor_gc_safe(); |
| 166 if (layout_descriptor_->IsFastPointerLayout()) { | 221 if (layout_descriptor_->IsFastPointerLayout()) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 182 // Object headers do not contain non-tagged fields. | 237 // Object headers do not contain non-tagged fields. |
| 183 if (offset_in_bytes < header_size_) return true; | 238 if (offset_in_bytes < header_size_) return true; |
| 184 int field_index = (offset_in_bytes - header_size_) / kPointerSize; | 239 int field_index = (offset_in_bytes - header_size_) / kPointerSize; |
| 185 | 240 |
| 186 return layout_descriptor_->IsTagged(field_index); | 241 return layout_descriptor_->IsTagged(field_index); |
| 187 } | 242 } |
| 188 } | 243 } |
| 189 } // namespace v8::internal | 244 } // namespace v8::internal |
| 190 | 245 |
| 191 #endif // V8_LAYOUT_DESCRIPTOR_INL_H_ | 246 #endif // V8_LAYOUT_DESCRIPTOR_INL_H_ |
| OLD | NEW |