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

Side by Side Diff: src/objects-inl.h

Issue 699613004: Revert "In-object double fields unboxing (for 64-bit only)." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.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 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 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
11 11
12 #ifndef V8_OBJECTS_INL_H_ 12 #ifndef V8_OBJECTS_INL_H_
13 #define V8_OBJECTS_INL_H_ 13 #define V8_OBJECTS_INL_H_
14 14
15 #include "src/base/atomicops.h" 15 #include "src/base/atomicops.h"
16 #include "src/base/bits.h" 16 #include "src/base/bits.h"
17 #include "src/contexts.h" 17 #include "src/contexts.h"
18 #include "src/conversions-inl.h" 18 #include "src/conversions-inl.h"
19 #include "src/elements.h" 19 #include "src/elements.h"
20 #include "src/factory.h" 20 #include "src/factory.h"
21 #include "src/field-index-inl.h" 21 #include "src/field-index-inl.h"
22 #include "src/heap/heap-inl.h" 22 #include "src/heap/heap-inl.h"
23 #include "src/heap/heap.h" 23 #include "src/heap/heap.h"
24 #include "src/heap/incremental-marking.h" 24 #include "src/heap/incremental-marking.h"
25 #include "src/heap/objects-visiting.h" 25 #include "src/heap/objects-visiting.h"
26 #include "src/heap/spaces.h" 26 #include "src/heap/spaces.h"
27 #include "src/heap/store-buffer.h" 27 #include "src/heap/store-buffer.h"
28 #include "src/isolate.h" 28 #include "src/isolate.h"
29 #include "src/layout-descriptor-inl.h"
30 #include "src/lookup.h" 29 #include "src/lookup.h"
31 #include "src/objects.h" 30 #include "src/objects.h"
32 #include "src/property.h" 31 #include "src/property.h"
33 #include "src/prototype.h" 32 #include "src/prototype.h"
34 #include "src/transitions-inl.h" 33 #include "src/transitions-inl.h"
35 #include "src/type-feedback-vector-inl.h" 34 #include "src/type-feedback-vector-inl.h"
36 #include "src/v8memory.h" 35 #include "src/v8memory.h"
37 36
38 namespace v8 { 37 namespace v8 {
39 namespace internal { 38 namespace internal {
(...skipping 10 matching lines...) Expand all
50 return Smi::FromInt(value >> 1); 49 return Smi::FromInt(value >> 1);
51 } 50 }
52 51
53 52
54 PropertyDetails PropertyDetails::AsDeleted() const { 53 PropertyDetails PropertyDetails::AsDeleted() const {
55 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1)); 54 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
56 return PropertyDetails(smi); 55 return PropertyDetails(smi);
57 } 56 }
58 57
59 58
60 int PropertyDetails::field_width_in_words() const {
61 DCHECK(type() == FIELD);
62 if (!FLAG_unbox_double_fields) return 1;
63 if (kDoubleSize == kPointerSize) return 1;
64 return representation().IsDouble() ? kDoubleSize / kPointerSize : 1;
65 }
66
67
68 #define TYPE_CHECKER(type, instancetype) \ 59 #define TYPE_CHECKER(type, instancetype) \
69 bool Object::Is##type() const { \ 60 bool Object::Is##type() const { \
70 return Object::IsHeapObject() && \ 61 return Object::IsHeapObject() && \
71 HeapObject::cast(this)->map()->instance_type() == instancetype; \ 62 HeapObject::cast(this)->map()->instance_type() == instancetype; \
72 } 63 }
73 64
74 65
75 #define CAST_ACCESSOR(type) \ 66 #define CAST_ACCESSOR(type) \
76 type* type::cast(Object* object) { \ 67 type* type::cast(Object* object) { \
77 SLOW_DCHECK(object->Is##type()); \ 68 SLOW_DCHECK(object->Is##type()); \
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 bool Object::IsJSWeakCollection() const { 697 bool Object::IsJSWeakCollection() const {
707 return IsJSWeakMap() || IsJSWeakSet(); 698 return IsJSWeakMap() || IsJSWeakSet();
708 } 699 }
709 700
710 701
711 bool Object::IsDescriptorArray() const { 702 bool Object::IsDescriptorArray() const {
712 return IsFixedArray(); 703 return IsFixedArray();
713 } 704 }
714 705
715 706
716 bool Object::IsLayoutDescriptor() const {
717 return IsSmi() || IsFixedTypedArrayBase();
718 }
719
720
721 bool Object::IsTransitionArray() const { 707 bool Object::IsTransitionArray() const {
722 return IsFixedArray(); 708 return IsFixedArray();
723 } 709 }
724 710
725 711
726 bool Object::IsTypeFeedbackVector() const { return IsFixedArray(); } 712 bool Object::IsTypeFeedbackVector() const { return IsFixedArray(); }
727 713
728 714
729 bool Object::IsDeoptimizationInputData() const { 715 bool Object::IsDeoptimizationInputData() const {
730 // Must be a fixed array. 716 // Must be a fixed array.
(...skipping 1346 matching lines...) Expand 10 before | Expand all | Expand 10 after
2077 void JSObject::SetInternalField(int index, Smi* value) { 2063 void JSObject::SetInternalField(int index, Smi* value) {
2078 DCHECK(index < GetInternalFieldCount() && index >= 0); 2064 DCHECK(index < GetInternalFieldCount() && index >= 0);
2079 // Internal objects do follow immediately after the header, whereas in-object 2065 // Internal objects do follow immediately after the header, whereas in-object
2080 // properties are at the end of the object. Therefore there is no need 2066 // properties are at the end of the object. Therefore there is no need
2081 // to adjust the index here. 2067 // to adjust the index here.
2082 int offset = GetHeaderSize() + (kPointerSize * index); 2068 int offset = GetHeaderSize() + (kPointerSize * index);
2083 WRITE_FIELD(this, offset, value); 2069 WRITE_FIELD(this, offset, value);
2084 } 2070 }
2085 2071
2086 2072
2087 bool JSObject::IsUnboxedDoubleField(FieldIndex index) {
2088 if (!FLAG_unbox_double_fields) return false;
2089 return map()->IsUnboxedDoubleField(index);
2090 }
2091
2092
2093 bool Map::IsUnboxedDoubleField(FieldIndex index) {
2094 if (!FLAG_unbox_double_fields) return false;
2095 if (index.is_hidden_field() || !index.is_inobject()) return false;
2096 return !layout_descriptor()->IsTagged(index.property_index());
2097 }
2098
2099
2100 // Access fast-case object properties at index. The use of these routines 2073 // Access fast-case object properties at index. The use of these routines
2101 // is needed to correctly distinguish between properties stored in-object and 2074 // is needed to correctly distinguish between properties stored in-object and
2102 // properties stored in the properties array. 2075 // properties stored in the properties array.
2103 Object* JSObject::RawFastPropertyAt(FieldIndex index) { 2076 Object* JSObject::RawFastPropertyAt(FieldIndex index) {
2104 DCHECK(!IsUnboxedDoubleField(index));
2105 if (index.is_inobject()) { 2077 if (index.is_inobject()) {
2106 return READ_FIELD(this, index.offset()); 2078 return READ_FIELD(this, index.offset());
2107 } else { 2079 } else {
2108 return properties()->get(index.outobject_array_index()); 2080 return properties()->get(index.outobject_array_index());
2109 } 2081 }
2110 } 2082 }
2111 2083
2112 2084
2113 double JSObject::RawFastDoublePropertyAt(FieldIndex index) { 2085 void JSObject::FastPropertyAtPut(FieldIndex index, Object* value) {
2114 DCHECK(IsUnboxedDoubleField(index));
2115 return READ_DOUBLE_FIELD(this, index.offset());
2116 }
2117
2118
2119 void JSObject::RawFastPropertyAtPut(FieldIndex index, Object* value) {
2120 if (index.is_inobject()) { 2086 if (index.is_inobject()) {
2121 int offset = index.offset(); 2087 int offset = index.offset();
2122 WRITE_FIELD(this, offset, value); 2088 WRITE_FIELD(this, offset, value);
2123 WRITE_BARRIER(GetHeap(), this, offset, value); 2089 WRITE_BARRIER(GetHeap(), this, offset, value);
2124 } else { 2090 } else {
2125 properties()->set(index.outobject_array_index(), value); 2091 properties()->set(index.outobject_array_index(), value);
2126 } 2092 }
2127 } 2093 }
2128 2094
2129 2095
2130 void JSObject::RawFastDoublePropertyAtPut(FieldIndex index, double value) {
2131 WRITE_DOUBLE_FIELD(this, index.offset(), value);
2132 }
2133
2134
2135 void JSObject::FastPropertyAtPut(FieldIndex index, Object* value) {
2136 if (IsUnboxedDoubleField(index)) {
2137 DCHECK(value->IsMutableHeapNumber());
2138 RawFastDoublePropertyAtPut(index, HeapNumber::cast(value)->value());
2139 } else {
2140 RawFastPropertyAtPut(index, value);
2141 }
2142 }
2143
2144
2145 int JSObject::GetInObjectPropertyOffset(int index) { 2096 int JSObject::GetInObjectPropertyOffset(int index) {
2146 return map()->GetInObjectPropertyOffset(index); 2097 return map()->GetInObjectPropertyOffset(index);
2147 } 2098 }
2148 2099
2149 2100
2150 Object* JSObject::InObjectPropertyAt(int index) { 2101 Object* JSObject::InObjectPropertyAt(int index) {
2151 int offset = GetInObjectPropertyOffset(index); 2102 int offset = GetInObjectPropertyOffset(index);
2152 return READ_FIELD(this, offset); 2103 return READ_FIELD(this, offset);
2153 } 2104 }
2154 2105
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after
3153 const WhitenessWitness&) { 3104 const WhitenessWitness&) {
3154 // Range check. 3105 // Range check.
3155 DCHECK(descriptor_number < number_of_descriptors()); 3106 DCHECK(descriptor_number < number_of_descriptors());
3156 3107
3157 NoIncrementalWriteBarrierSet(this, 3108 NoIncrementalWriteBarrierSet(this,
3158 ToKeyIndex(descriptor_number), 3109 ToKeyIndex(descriptor_number),
3159 *desc->GetKey()); 3110 *desc->GetKey());
3160 NoIncrementalWriteBarrierSet(this, 3111 NoIncrementalWriteBarrierSet(this,
3161 ToValueIndex(descriptor_number), 3112 ToValueIndex(descriptor_number),
3162 *desc->GetValue()); 3113 *desc->GetValue());
3163 NoIncrementalWriteBarrierSet(this, ToDetailsIndex(descriptor_number), 3114 NoIncrementalWriteBarrierSet(this,
3115 ToDetailsIndex(descriptor_number),
3164 desc->GetDetails().AsSmi()); 3116 desc->GetDetails().AsSmi());
3165 } 3117 }
3166 3118
3167 3119
3168 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) { 3120 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
3169 // Range check. 3121 // Range check.
3170 DCHECK(descriptor_number < number_of_descriptors()); 3122 DCHECK(descriptor_number < number_of_descriptors());
3171 3123
3172 set(ToKeyIndex(descriptor_number), *desc->GetKey()); 3124 set(ToKeyIndex(descriptor_number), *desc->GetKey());
3173 set(ToValueIndex(descriptor_number), *desc->GetValue()); 3125 set(ToValueIndex(descriptor_number), *desc->GetValue());
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
3328 CAST_ACCESSOR(JSObject) 3280 CAST_ACCESSOR(JSObject)
3329 CAST_ACCESSOR(JSProxy) 3281 CAST_ACCESSOR(JSProxy)
3330 CAST_ACCESSOR(JSReceiver) 3282 CAST_ACCESSOR(JSReceiver)
3331 CAST_ACCESSOR(JSRegExp) 3283 CAST_ACCESSOR(JSRegExp)
3332 CAST_ACCESSOR(JSSet) 3284 CAST_ACCESSOR(JSSet)
3333 CAST_ACCESSOR(JSSetIterator) 3285 CAST_ACCESSOR(JSSetIterator)
3334 CAST_ACCESSOR(JSTypedArray) 3286 CAST_ACCESSOR(JSTypedArray)
3335 CAST_ACCESSOR(JSValue) 3287 CAST_ACCESSOR(JSValue)
3336 CAST_ACCESSOR(JSWeakMap) 3288 CAST_ACCESSOR(JSWeakMap)
3337 CAST_ACCESSOR(JSWeakSet) 3289 CAST_ACCESSOR(JSWeakSet)
3338 CAST_ACCESSOR(LayoutDescriptor)
3339 CAST_ACCESSOR(Map) 3290 CAST_ACCESSOR(Map)
3340 CAST_ACCESSOR(MapCache) 3291 CAST_ACCESSOR(MapCache)
3341 CAST_ACCESSOR(Name) 3292 CAST_ACCESSOR(Name)
3342 CAST_ACCESSOR(NameDictionary) 3293 CAST_ACCESSOR(NameDictionary)
3343 CAST_ACCESSOR(NormalizedMapCache) 3294 CAST_ACCESSOR(NormalizedMapCache)
3344 CAST_ACCESSOR(Object) 3295 CAST_ACCESSOR(Object)
3345 CAST_ACCESSOR(ObjectHashTable) 3296 CAST_ACCESSOR(ObjectHashTable)
3346 CAST_ACCESSOR(Oddball) 3297 CAST_ACCESSOR(Oddball)
3347 CAST_ACCESSOR(OrderedHashMap) 3298 CAST_ACCESSOR(OrderedHashMap)
3348 CAST_ACCESSOR(OrderedHashSet) 3299 CAST_ACCESSOR(OrderedHashSet)
(...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after
4371 4322
4372 4323
4373 int Map::GetInObjectPropertyOffset(int index) { 4324 int Map::GetInObjectPropertyOffset(int index) {
4374 // Adjust for the number of properties stored in the object. 4325 // Adjust for the number of properties stored in the object.
4375 index -= inobject_properties(); 4326 index -= inobject_properties();
4376 DCHECK(index <= 0); 4327 DCHECK(index <= 0);
4377 return instance_size() + (index * kPointerSize); 4328 return instance_size() + (index * kPointerSize);
4378 } 4329 }
4379 4330
4380 4331
4381 Handle<Map> Map::CopyInstallDescriptorsForTesting(
4382 Handle<Map> map, int new_descriptor, Handle<DescriptorArray> descriptors,
4383 Handle<LayoutDescriptor> layout_descriptor) {
4384 return CopyInstallDescriptors(map, new_descriptor, descriptors,
4385 layout_descriptor);
4386 }
4387
4388
4389 int HeapObject::SizeFromMap(Map* map) { 4332 int HeapObject::SizeFromMap(Map* map) {
4390 int instance_size = map->instance_size(); 4333 int instance_size = map->instance_size();
4391 if (instance_size != kVariableSizeSentinel) return instance_size; 4334 if (instance_size != kVariableSizeSentinel) return instance_size;
4392 // Only inline the most frequent cases. 4335 // Only inline the most frequent cases.
4393 InstanceType instance_type = map->instance_type(); 4336 InstanceType instance_type = map->instance_type();
4394 if (instance_type == FIXED_ARRAY_TYPE) { 4337 if (instance_type == FIXED_ARRAY_TYPE) {
4395 return FixedArray::BodyDescriptor::SizeOf(map, this); 4338 return FixedArray::BodyDescriptor::SizeOf(map, this);
4396 } 4339 }
4397 if (instance_type == ONE_BYTE_STRING_TYPE || 4340 if (instance_type == ONE_BYTE_STRING_TYPE ||
4398 instance_type == ONE_BYTE_INTERNALIZED_STRING_TYPE) { 4341 instance_type == ONE_BYTE_INTERNALIZED_STRING_TYPE) {
(...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after
5224 transitions->set_back_pointer_storage(map->GetBackPointer()); 5167 transitions->set_back_pointer_storage(map->GetBackPointer());
5225 } else if (!map->transitions()->IsFullTransitionArray()) { 5168 } else if (!map->transitions()->IsFullTransitionArray()) {
5226 transitions = TransitionArray::ExtendToFullTransitionArray(map); 5169 transitions = TransitionArray::ExtendToFullTransitionArray(map);
5227 } else { 5170 } else {
5228 return; 5171 return;
5229 } 5172 }
5230 map->set_transitions(*transitions); 5173 map->set_transitions(*transitions);
5231 } 5174 }
5232 5175
5233 5176
5234 LayoutDescriptor* Map::layout_descriptor_gc_safe() { 5177 void Map::InitializeDescriptors(DescriptorArray* descriptors) {
5235 Object* layout_desc = READ_FIELD(this, kLayoutDecriptorOffset);
5236 return LayoutDescriptor::cast_gc_safe(layout_desc);
5237 }
5238
5239
5240 void Map::UpdateDescriptors(DescriptorArray* descriptors,
5241 LayoutDescriptor* layout_desc) {
5242 set_instance_descriptors(descriptors);
5243 if (FLAG_unbox_double_fields) {
5244 if (layout_descriptor()->IsSlowLayout()) {
5245 set_layout_descriptor(layout_desc);
5246 }
5247 SLOW_DCHECK(layout_descriptor()->IsConsistentWithMap(this));
5248 DCHECK(visitor_id() == StaticVisitorBase::GetVisitorId(this));
5249 }
5250 }
5251
5252
5253 void Map::InitializeDescriptors(DescriptorArray* descriptors,
5254 LayoutDescriptor* layout_desc) {
5255 int len = descriptors->number_of_descriptors(); 5178 int len = descriptors->number_of_descriptors();
5256 set_instance_descriptors(descriptors); 5179 set_instance_descriptors(descriptors);
5257 SetNumberOfOwnDescriptors(len); 5180 SetNumberOfOwnDescriptors(len);
5258
5259 if (FLAG_unbox_double_fields) {
5260 set_layout_descriptor(layout_desc);
5261 SLOW_DCHECK(layout_descriptor()->IsConsistentWithMap(this));
5262 set_visitor_id(StaticVisitorBase::GetVisitorId(this));
5263 }
5264 } 5181 }
5265 5182
5266 5183
5267 ACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset) 5184 ACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset)
5268 ACCESSORS(Map, layout_descriptor, LayoutDescriptor, kLayoutDecriptorOffset)
5269 5185
5270 5186
5271 void Map::set_bit_field3(uint32_t bits) { 5187 void Map::set_bit_field3(uint32_t bits) {
5272 if (kInt32Size != kPointerSize) { 5188 if (kInt32Size != kPointerSize) {
5273 WRITE_UINT32_FIELD(this, kBitField3Offset + kInt32Size, 0); 5189 WRITE_UINT32_FIELD(this, kBitField3Offset + kInt32Size, 0);
5274 } 5190 }
5275 WRITE_UINT32_FIELD(this, kBitField3Offset, bits); 5191 WRITE_UINT32_FIELD(this, kBitField3Offset, bits);
5276 } 5192 }
5277 5193
5278 5194
5279 uint32_t Map::bit_field3() { 5195 uint32_t Map::bit_field3() {
5280 return READ_UINT32_FIELD(this, kBitField3Offset); 5196 return READ_UINT32_FIELD(this, kBitField3Offset);
5281 } 5197 }
5282 5198
5283 5199
5284 Handle<LayoutDescriptor> Map::GetLayoutDescriptor() {
5285 LayoutDescriptor* layout_desc = FLAG_unbox_double_fields
5286 ? layout_descriptor()
5287 : LayoutDescriptor::FastPointerLayout();
5288 return handle(layout_desc, GetIsolate());
5289 }
5290
5291
5292 void Map::AppendDescriptor(Descriptor* desc) { 5200 void Map::AppendDescriptor(Descriptor* desc) {
5293 DescriptorArray* descriptors = instance_descriptors(); 5201 DescriptorArray* descriptors = instance_descriptors();
5294 int number_of_own_descriptors = NumberOfOwnDescriptors(); 5202 int number_of_own_descriptors = NumberOfOwnDescriptors();
5295 DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors); 5203 DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors);
5296 descriptors->Append(desc); 5204 descriptors->Append(desc);
5297 SetNumberOfOwnDescriptors(number_of_own_descriptors + 1); 5205 SetNumberOfOwnDescriptors(number_of_own_descriptors + 1);
5298
5299 // This function does not support appending double field descriptors and
5300 // it should never try to (otherwise, layout descriptor must be updated too).
5301 #ifdef DEBUG
5302 PropertyDetails details = desc->GetDetails();
5303 CHECK(details.type() != FIELD || !details.representation().IsDouble());
5304 #endif
5305 } 5206 }
5306 5207
5307 5208
5308 Object* Map::GetBackPointer() { 5209 Object* Map::GetBackPointer() {
5309 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset); 5210 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5310 if (object->IsDescriptorArray()) { 5211 if (object->IsDescriptorArray()) {
5311 return TransitionArray::cast(object)->back_pointer_storage(); 5212 return TransitionArray::cast(object)->back_pointer_storage();
5312 } else { 5213 } else {
5313 DCHECK(object->IsMap() || object->IsUndefined()); 5214 DCHECK(object->IsMap() || object->IsUndefined());
5314 return object; 5215 return object;
(...skipping 2056 matching lines...) Expand 10 before | Expand all | Expand 10 after
7371 7272
7372 7273
7373 template<typename StaticVisitor> 7274 template<typename StaticVisitor>
7374 void ExternalTwoByteString::ExternalTwoByteStringIterateBody() { 7275 void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
7375 typedef v8::String::ExternalStringResource Resource; 7276 typedef v8::String::ExternalStringResource Resource;
7376 StaticVisitor::VisitExternalTwoByteString( 7277 StaticVisitor::VisitExternalTwoByteString(
7377 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 7278 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
7378 } 7279 }
7379 7280
7380 7281
7381 static inline void IterateBodyUsingLayoutDescriptor(HeapObject* object,
7382 int start_offset,
7383 int end_offset,
7384 ObjectVisitor* v) {
7385 DCHECK(FLAG_unbox_double_fields);
7386 DCHECK(IsAligned(start_offset, kPointerSize) &&
7387 IsAligned(end_offset, kPointerSize));
7388
7389 InobjectPropertiesHelper helper(object->map());
7390 DCHECK(!helper.all_fields_tagged());
7391
7392 for (int offset = start_offset; offset < end_offset; offset += kPointerSize) {
7393 // Visit all tagged fields.
7394 if (helper.IsTagged(offset)) {
7395 v->VisitPointer(HeapObject::RawField(object, offset));
7396 }
7397 }
7398 }
7399
7400
7401 template<int start_offset, int end_offset, int size> 7282 template<int start_offset, int end_offset, int size>
7402 void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody( 7283 void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
7403 HeapObject* obj, 7284 HeapObject* obj,
7404 ObjectVisitor* v) { 7285 ObjectVisitor* v) {
7405 if (!FLAG_unbox_double_fields ||
7406 obj->map()->layout_descriptor()->IsFastPointerLayout()) {
7407 v->VisitPointers(HeapObject::RawField(obj, start_offset), 7286 v->VisitPointers(HeapObject::RawField(obj, start_offset),
7408 HeapObject::RawField(obj, end_offset)); 7287 HeapObject::RawField(obj, end_offset));
7409 } else {
7410 IterateBodyUsingLayoutDescriptor(obj, start_offset, end_offset, v);
7411 }
7412 } 7288 }
7413 7289
7414 7290
7415 template<int start_offset> 7291 template<int start_offset>
7416 void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj, 7292 void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
7417 int object_size, 7293 int object_size,
7418 ObjectVisitor* v) { 7294 ObjectVisitor* v) {
7419 if (!FLAG_unbox_double_fields || 7295 v->VisitPointers(HeapObject::RawField(obj, start_offset),
7420 obj->map()->layout_descriptor()->IsFastPointerLayout()) { 7296 HeapObject::RawField(obj, object_size));
7421 v->VisitPointers(HeapObject::RawField(obj, start_offset),
7422 HeapObject::RawField(obj, object_size));
7423 } else {
7424 IterateBodyUsingLayoutDescriptor(obj, start_offset, object_size, v);
7425 }
7426 } 7297 }
7427 7298
7428 7299
7429 template<class Derived, class TableType> 7300 template<class Derived, class TableType>
7430 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { 7301 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
7431 TableType* table(TableType::cast(this->table())); 7302 TableType* table(TableType::cast(this->table()));
7432 int index = Smi::cast(this->index())->value(); 7303 int index = Smi::cast(this->index())->value();
7433 Object* key = table->KeyAt(index); 7304 Object* key = table->KeyAt(index);
7434 DCHECK(!key->IsTheHole()); 7305 DCHECK(!key->IsTheHole());
7435 return key; 7306 return key;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
7485 #undef READ_SHORT_FIELD 7356 #undef READ_SHORT_FIELD
7486 #undef WRITE_SHORT_FIELD 7357 #undef WRITE_SHORT_FIELD
7487 #undef READ_BYTE_FIELD 7358 #undef READ_BYTE_FIELD
7488 #undef WRITE_BYTE_FIELD 7359 #undef WRITE_BYTE_FIELD
7489 #undef NOBARRIER_READ_BYTE_FIELD 7360 #undef NOBARRIER_READ_BYTE_FIELD
7490 #undef NOBARRIER_WRITE_BYTE_FIELD 7361 #undef NOBARRIER_WRITE_BYTE_FIELD
7491 7362
7492 } } // namespace v8::internal 7363 } } // namespace v8::internal
7493 7364
7494 #endif // V8_OBJECTS_INL_H_ 7365 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698