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

Side by Side Diff: src/objects.cc

Issue 10412030: Merging ContentArray into DescriptorArray (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: merged patchset Created 8 years, 6 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 5098 matching lines...) Expand 10 before | Expand all | Expand 10 after
5109 ASSERT(IsIterating()); 5109 ASSERT(IsIterating());
5110 // Attention, tricky index manipulation ahead: Two consecutive indices are 5110 // Attention, tricky index manipulation ahead: Two consecutive indices are
5111 // assigned to each descriptor. Most descriptors directly advance to the 5111 // assigned to each descriptor. Most descriptors directly advance to the
5112 // next descriptor by adding 2 to the index. The exceptions are the 5112 // next descriptor by adding 2 to the index. The exceptions are the
5113 // CALLBACKS entries: An even index means we look at its getter, and an odd 5113 // CALLBACKS entries: An even index means we look at its getter, and an odd
5114 // index means we look at its setter. 5114 // index means we look at its setter.
5115 int raw_index = Smi::cast(*DescriptorArrayHeader())->value(); 5115 int raw_index = Smi::cast(*DescriptorArrayHeader())->value();
5116 int index = raw_index / 2; 5116 int index = raw_index / 2;
5117 int number_of_descriptors = descriptor_array_->number_of_descriptors(); 5117 int number_of_descriptors = descriptor_array_->number_of_descriptors();
5118 while (index < number_of_descriptors) { 5118 while (index < number_of_descriptors) {
5119 PropertyDetails details(RawGetDetails(index)); 5119 PropertyDetails details(descriptor_array_->GetDetails(index));
5120 switch (details.type()) { 5120 switch (details.type()) {
5121 case MAP_TRANSITION: 5121 case MAP_TRANSITION:
5122 case CONSTANT_TRANSITION: 5122 case CONSTANT_TRANSITION:
5123 case ELEMENTS_TRANSITION: 5123 case ELEMENTS_TRANSITION:
5124 // We definitely have a map transition. 5124 // We definitely have a map transition.
5125 *DescriptorArrayHeader() = Smi::FromInt(raw_index + 2); 5125 *DescriptorArrayHeader() = Smi::FromInt(raw_index + 2);
5126 return static_cast<Map*>(RawGetValue(index)); 5126 return static_cast<Map*>(descriptor_array_->GetValue(index));
5127 case CALLBACKS: { 5127 case CALLBACKS: {
5128 // We might have a map transition in a getter or in a setter. 5128 // We might have a map transition in a getter or in a setter.
5129 AccessorPair* accessors = 5129 AccessorPair* accessors =
5130 static_cast<AccessorPair*>(RawGetValue(index)); 5130 static_cast<AccessorPair*>(descriptor_array_->GetValue(index));
5131 Object* accessor; 5131 Object* accessor;
5132 if ((raw_index & 1) == 0) { 5132 if ((raw_index & 1) == 0) {
5133 accessor = accessors->setter(); 5133 accessor = accessors->setter();
5134 } else { 5134 } else {
5135 ++index; 5135 ++index;
5136 accessor = accessors->getter(); 5136 accessor = accessors->getter();
5137 } 5137 }
5138 ++raw_index; 5138 ++raw_index;
5139 if (accessor->IsMap()) { 5139 if (accessor->IsMap()) {
5140 *DescriptorArrayHeader() = Smi::FromInt(raw_index); 5140 *DescriptorArrayHeader() = Smi::FromInt(raw_index);
(...skipping 19 matching lines...) Expand all
5160 5160
5161 private: 5161 private:
5162 bool HasDescriptors() { 5162 bool HasDescriptors() {
5163 return descriptor_array_->length() > DescriptorArray::kFirstIndex; 5163 return descriptor_array_->length() > DescriptorArray::kFirstIndex;
5164 } 5164 }
5165 5165
5166 Object** DescriptorArrayHeader() { 5166 Object** DescriptorArrayHeader() {
5167 return HeapObject::RawField(descriptor_array_, DescriptorArray::kMapOffset); 5167 return HeapObject::RawField(descriptor_array_, DescriptorArray::kMapOffset);
5168 } 5168 }
5169 5169
5170 FixedArray* RawGetContentArray() {
5171 Object* array =
5172 descriptor_array_->get(DescriptorArray::kContentArrayIndex);
5173 return static_cast<FixedArray*>(array);
5174 }
5175
5176 Object* RawGetValue(int descriptor_number) {
5177 return RawGetContentArray()->get(
5178 DescriptorArray::ToValueIndex(descriptor_number));
5179 }
5180
5181 PropertyDetails RawGetDetails(int descriptor_number) {
5182 Object* details = RawGetContentArray()->get(
5183 DescriptorArray::ToDetailsIndex(descriptor_number));
5184 return PropertyDetails(Smi::cast(details));
5185 }
5186
5187
5188 DescriptorArray* descriptor_array_; 5170 DescriptorArray* descriptor_array_;
5189 }; 5171 };
5190 5172
5191 5173
5192 // An iterator over all prototype transitions, reusing the map field of the 5174 // An iterator over all prototype transitions, reusing the map field of the
5193 // underlying array while it is running. 5175 // underlying array while it is running.
5194 class IntrusivePrototypeTransitionIterator { 5176 class IntrusivePrototypeTransitionIterator {
5195 public: 5177 public:
5196 explicit IntrusivePrototypeTransitionIterator(HeapObject* proto_trans) 5178 explicit IntrusivePrototypeTransitionIterator(HeapObject* proto_trans)
5197 : proto_trans_(proto_trans) { } 5179 : proto_trans_(proto_trans) { }
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
5876 } 5858 }
5877 // Allocate the array of keys. 5859 // Allocate the array of keys.
5878 Object* array; 5860 Object* array;
5879 { MaybeObject* maybe_array = 5861 { MaybeObject* maybe_array =
5880 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); 5862 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors));
5881 if (!maybe_array->ToObject(&array)) return maybe_array; 5863 if (!maybe_array->ToObject(&array)) return maybe_array;
5882 } 5864 }
5883 // Do not use DescriptorArray::cast on incomplete object. 5865 // Do not use DescriptorArray::cast on incomplete object.
5884 FixedArray* result = FixedArray::cast(array); 5866 FixedArray* result = FixedArray::cast(array);
5885 5867
5886 // Allocate the content array and set it in the descriptor array.
5887 { MaybeObject* maybe_array =
5888 heap->AllocateFixedArray(number_of_descriptors << 1);
5889 if (!maybe_array->ToObject(&array)) return maybe_array;
5890 }
5891 result->set(kBitField3StorageIndex, Smi::FromInt(0)); 5868 result->set(kBitField3StorageIndex, Smi::FromInt(0));
5892 result->set(kContentArrayIndex, array);
5893 result->set(kEnumerationIndexIndex, 5869 result->set(kEnumerationIndexIndex,
5894 Smi::FromInt(PropertyDetails::kInitialIndex)); 5870 Smi::FromInt(PropertyDetails::kInitialIndex));
5895 return result; 5871 return result;
5896 } 5872 }
5897 5873
5898 5874
5899 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, 5875 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
5900 FixedArray* new_cache, 5876 FixedArray* new_cache,
5901 Object* new_index_cache) { 5877 Object* new_index_cache) {
5902 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); 5878 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength);
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
6209 pretenure); 6185 pretenure);
6210 } 6186 }
6211 6187
6212 6188
6213 #ifdef DEBUG 6189 #ifdef DEBUG
6214 bool DescriptorArray::IsEqualTo(DescriptorArray* other) { 6190 bool DescriptorArray::IsEqualTo(DescriptorArray* other) {
6215 if (IsEmpty()) return other->IsEmpty(); 6191 if (IsEmpty()) return other->IsEmpty();
6216 if (other->IsEmpty()) return false; 6192 if (other->IsEmpty()) return false;
6217 if (length() != other->length()) return false; 6193 if (length() != other->length()) return false;
6218 for (int i = 0; i < length(); ++i) { 6194 for (int i = 0; i < length(); ++i) {
6219 if (get(i) != other->get(i) && i != kContentArrayIndex) return false; 6195 if (get(i) != other->get(i)) return false;
6220 } 6196 }
6221 return GetContentArray()->IsEqualTo(other->GetContentArray()); 6197 return true;
6222 } 6198 }
6223 #endif 6199 #endif
6224 6200
6225 6201
6226 bool String::LooksValid() { 6202 bool String::LooksValid() {
6227 if (!Isolate::Current()->heap()->Contains(this)) return false; 6203 if (!Isolate::Current()->heap()->Contains(this)) return false;
6228 return true; 6204 return true;
6229 } 6205 }
6230 6206
6231 6207
(...skipping 7009 matching lines...) Expand 10 before | Expand all | Expand 10 after
13241 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13217 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13242 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13218 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13243 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13219 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13244 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13220 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13245 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13221 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13246 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13222 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13247 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13223 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13248 } 13224 }
13249 13225
13250 } } // namespace v8::internal 13226 } } // namespace v8::internal
OLDNEW
« src/mark-compact.cc ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698