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

Side by Side Diff: src/objects.cc

Issue 10822011: Limited the size of transition arrays so they never end up in the large object space. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 4 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('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 // 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 2103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2114 Object** zap = reinterpret_cast<Object**>(new_end); 2114 Object** zap = reinterpret_cast<Object**>(new_end);
2115 for (int i = 1; i < to_trim; i++) { 2115 for (int i = 1; i < to_trim; i++) {
2116 *zap++ = Smi::FromInt(0); 2116 *zap++ = Smi::FromInt(0);
2117 } 2117 }
2118 } 2118 }
2119 2119
2120 template<RightTrimMode trim_mode> 2120 template<RightTrimMode trim_mode>
2121 static void RightTrimFixedArray(Heap* heap, FixedArray* elms, int to_trim) { 2121 static void RightTrimFixedArray(Heap* heap, FixedArray* elms, int to_trim) {
2122 ASSERT(elms->map() != HEAP->fixed_cow_array_map()); 2122 ASSERT(elms->map() != HEAP->fixed_cow_array_map());
2123 // For now this trick is only applied to fixed arrays in new and paged space. 2123 // For now this trick is only applied to fixed arrays in new and paged space.
2124 // In large object space the object's start must coincide with chunk
2125 // and thus the trick is just not applicable.
2126 ASSERT(!HEAP->lo_space()->Contains(elms)); 2124 ASSERT(!HEAP->lo_space()->Contains(elms));
2127 2125
2128 const int len = elms->length(); 2126 const int len = elms->length();
2129 2127
2130 ASSERT(to_trim < len); 2128 ASSERT(to_trim < len);
2131 2129
2132 Address new_end = elms->address() + FixedArray::SizeFor(len - to_trim); 2130 Address new_end = elms->address() + FixedArray::SizeFor(len - to_trim);
2133 2131
2134 if (trim_mode == FROM_GC) { 2132 if (trim_mode == FROM_GC) {
2135 #ifdef DEBUG 2133 #ifdef DEBUG
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 } 2209 }
2212 2210
2213 int new_number_of_descriptors = map->NumberOfSetDescriptors(); 2211 int new_number_of_descriptors = map->NumberOfSetDescriptors();
2214 // Reinstall the original descriptor array if no new elements were added. 2212 // Reinstall the original descriptor array if no new elements were added.
2215 if (new_number_of_descriptors == descriptor_count) { 2213 if (new_number_of_descriptors == descriptor_count) {
2216 map->set_instance_descriptors(*array); 2214 map->set_instance_descriptors(*array);
2217 return; 2215 return;
2218 } 2216 }
2219 2217
2220 // If duplicates were detected, trim the descriptor array to the right size. 2218 // If duplicates were detected, trim the descriptor array to the right size.
2221 int new_array_size = DescriptorArray::SizeFor(new_number_of_descriptors); 2219 int new_array_size = DescriptorArray::LengthFor(new_number_of_descriptors);
2222 if (new_array_size < result->length()) { 2220 if (new_array_size < result->length()) {
2223 RightTrimFixedArray<FROM_MUTATOR>( 2221 RightTrimFixedArray<FROM_MUTATOR>(
2224 isolate->heap(), *result, result->length() - new_array_size); 2222 isolate->heap(), *result, result->length() - new_array_size);
2225 } 2223 }
2226 } 2224 }
2227 2225
2228 2226
2229 static bool ContainsMap(MapHandleList* maps, Handle<Map> map) { 2227 static bool ContainsMap(MapHandleList* maps, Handle<Map> map) {
2230 ASSERT(!map.is_null()); 2228 ASSERT(!map.is_null());
2231 for (int i = 0; i < maps->length(); ++i) { 2229 for (int i = 0; i < maps->length(); ++i) {
(...skipping 2645 matching lines...) Expand 10 before | Expand all | Expand 10 after
4877 4875
4878 if (last_added == kNoneAdded) { 4876 if (last_added == kNoneAdded) {
4879 ASSERT(descriptors->IsEmpty()); 4877 ASSERT(descriptors->IsEmpty());
4880 } else { 4878 } else {
4881 ASSERT(descriptors->GetDetails(last_added).index() == 4879 ASSERT(descriptors->GetDetails(last_added).index() ==
4882 descriptors->number_of_descriptors()); 4880 descriptors->number_of_descriptors());
4883 result->set_instance_descriptors(descriptors); 4881 result->set_instance_descriptors(descriptors);
4884 result->SetLastAdded(last_added); 4882 result->SetLastAdded(last_added);
4885 } 4883 }
4886 4884
4887 if (flag == INSERT_TRANSITION) { 4885 if (flag == INSERT_TRANSITION && CanHaveMoreTransitions()) {
4888 TransitionArray* transitions; 4886 TransitionArray* transitions;
4889 MaybeObject* maybe_transitions = AddTransition(name, result); 4887 MaybeObject* maybe_transitions = AddTransition(name, result);
4890 if (!maybe_transitions->To(&transitions)) return maybe_transitions; 4888 if (!maybe_transitions->To(&transitions)) return maybe_transitions;
4891 4889
4892 MaybeObject* maybe_set = set_transitions(transitions); 4890 MaybeObject* maybe_set = set_transitions(transitions);
4893 if (maybe_set->IsFailure()) return maybe_set; 4891 if (maybe_set->IsFailure()) return maybe_set;
4894 4892
4895 result->SetBackPointer(this); 4893 result->SetBackPointer(this);
4896 } 4894 }
4897 4895
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after
5837 MaybeObject* DescriptorArray::Allocate(int number_of_descriptors, 5835 MaybeObject* DescriptorArray::Allocate(int number_of_descriptors,
5838 SharedMode shared_mode) { 5836 SharedMode shared_mode) {
5839 Heap* heap = Isolate::Current()->heap(); 5837 Heap* heap = Isolate::Current()->heap();
5840 // Do not use DescriptorArray::cast on incomplete object. 5838 // Do not use DescriptorArray::cast on incomplete object.
5841 FixedArray* result; 5839 FixedArray* result;
5842 if (number_of_descriptors == 0 && shared_mode == MAY_BE_SHARED) { 5840 if (number_of_descriptors == 0 && shared_mode == MAY_BE_SHARED) {
5843 return heap->empty_descriptor_array(); 5841 return heap->empty_descriptor_array();
5844 } 5842 }
5845 // Allocate the array of keys. 5843 // Allocate the array of keys.
5846 MaybeObject* maybe_array = 5844 MaybeObject* maybe_array =
5847 heap->AllocateFixedArray(SizeFor(number_of_descriptors)); 5845 heap->AllocateFixedArray(LengthFor(number_of_descriptors));
5848 if (!maybe_array->To(&result)) return maybe_array; 5846 if (!maybe_array->To(&result)) return maybe_array;
5849 5847
5850 result->set(kEnumCacheIndex, Smi::FromInt(0)); 5848 result->set(kEnumCacheIndex, Smi::FromInt(0));
5851 result->set(kTransitionsIndex, Smi::FromInt(0)); 5849 result->set(kTransitionsIndex, Smi::FromInt(0));
5852 return result; 5850 return result;
5853 } 5851 }
5854 5852
5855 5853
5856 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, 5854 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
5857 FixedArray* new_cache, 5855 FixedArray* new_cache,
(...skipping 7276 matching lines...) Expand 10 before | Expand all | Expand 10 after
13134 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13132 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13135 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13133 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13136 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13134 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13137 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13135 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13138 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13136 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13139 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13137 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13140 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13138 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13141 } 13139 }
13142 13140
13143 } } // namespace v8::internal 13141 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698