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

Side by Side Diff: src/heap.cc

Issue 170703002: Refactoring to clean up duplicate code in Heap::Allocate methods. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Comment response. Created 6 years, 9 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/heap.h ('k') | src/runtime.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 // 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 4174 matching lines...) Expand 10 before | Expand all | Expand 10 after
4185 AllocationSite* allocation_site) { 4185 AllocationSite* allocation_site) {
4186 memento->set_map_no_write_barrier(allocation_memento_map()); 4186 memento->set_map_no_write_barrier(allocation_memento_map());
4187 ASSERT(allocation_site->map() == allocation_site_map()); 4187 ASSERT(allocation_site->map() == allocation_site_map());
4188 memento->set_allocation_site(allocation_site, SKIP_WRITE_BARRIER); 4188 memento->set_allocation_site(allocation_site, SKIP_WRITE_BARRIER);
4189 if (FLAG_allocation_site_pretenuring) { 4189 if (FLAG_allocation_site_pretenuring) {
4190 allocation_site->IncrementMementoCreateCount(); 4190 allocation_site->IncrementMementoCreateCount();
4191 } 4191 }
4192 } 4192 }
4193 4193
4194 4194
4195 MaybeObject* Heap::AllocateWithAllocationSite(Map* map, AllocationSpace space, 4195 MaybeObject* Heap::Allocate(Map* map, AllocationSpace space,
4196 Handle<AllocationSite> allocation_site) { 4196 AllocationSite* allocation_site) {
4197 ASSERT(gc_state_ == NOT_IN_GC); 4197 ASSERT(gc_state_ == NOT_IN_GC);
4198 ASSERT(map->instance_type() != MAP_TYPE); 4198 ASSERT(map->instance_type() != MAP_TYPE);
4199 // If allocation failures are disallowed, we may allocate in a different 4199 // If allocation failures are disallowed, we may allocate in a different
4200 // space when new space is full and the object is not a large object.
4201 AllocationSpace retry_space =
4202 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type());
4203 int size = map->instance_size() + AllocationMemento::kSize;
4204 Object* result;
4205 MaybeObject* maybe_result = AllocateRaw(size, space, retry_space);
4206 if (!maybe_result->ToObject(&result)) return maybe_result;
4207 // No need for write barrier since object is white and map is in old space.
4208 HeapObject::cast(result)->set_map_no_write_barrier(map);
4209 AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>(
4210 reinterpret_cast<Address>(result) + map->instance_size());
4211 InitializeAllocationMemento(alloc_memento, *allocation_site);
4212 return result;
4213 }
4214
4215
4216 MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) {
4217 ASSERT(gc_state_ == NOT_IN_GC);
4218 ASSERT(map->instance_type() != MAP_TYPE);
4219 // If allocation failures are disallowed, we may allocate in a different
4220 // space when new space is full and the object is not a large object. 4200 // space when new space is full and the object is not a large object.
4221 AllocationSpace retry_space = 4201 AllocationSpace retry_space =
4222 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); 4202 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type());
4223 int size = map->instance_size(); 4203 int size = map->instance_size();
4204 if (allocation_site != NULL) {
4205 size += AllocationMemento::kSize;
4206 }
4224 Object* result; 4207 Object* result;
4225 MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); 4208 MaybeObject* maybe_result = AllocateRaw(size, space, retry_space);
4226 if (!maybe_result->ToObject(&result)) return maybe_result; 4209 if (!maybe_result->ToObject(&result)) return maybe_result;
4227 // No need for write barrier since object is white and map is in old space. 4210 // No need for write barrier since object is white and map is in old space.
4228 HeapObject::cast(result)->set_map_no_write_barrier(map); 4211 HeapObject::cast(result)->set_map_no_write_barrier(map);
4212 if (allocation_site != NULL) {
4213 AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>(
4214 reinterpret_cast<Address>(result) + map->instance_size());
4215 InitializeAllocationMemento(alloc_memento, allocation_site);
4216 }
4229 return result; 4217 return result;
4230 } 4218 }
4231 4219
4232 4220
4233 void Heap::InitializeFunction(JSFunction* function, 4221 void Heap::InitializeFunction(JSFunction* function,
4234 SharedFunctionInfo* shared, 4222 SharedFunctionInfo* shared,
4235 Object* prototype) { 4223 Object* prototype) {
4236 ASSERT(!prototype->IsMap()); 4224 ASSERT(!prototype->IsMap());
4237 function->initialize_properties(); 4225 function->initialize_properties();
4238 function->initialize_elements(); 4226 function->initialize_elements();
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4342 ASSERT(obj->GetInternalFieldCount() == 0); 4330 ASSERT(obj->GetInternalFieldCount() == 0);
4343 filler = Heap::one_pointer_filler_map(); 4331 filler = Heap::one_pointer_filler_map();
4344 } else { 4332 } else {
4345 filler = Heap::undefined_value(); 4333 filler = Heap::undefined_value();
4346 } 4334 }
4347 obj->InitializeBody(map, Heap::undefined_value(), filler); 4335 obj->InitializeBody(map, Heap::undefined_value(), filler);
4348 } 4336 }
4349 4337
4350 4338
4351 MaybeObject* Heap::AllocateJSObjectFromMap( 4339 MaybeObject* Heap::AllocateJSObjectFromMap(
4352 Map* map, PretenureFlag pretenure, bool allocate_properties) { 4340 Map* map,
4341 PretenureFlag pretenure,
4342 bool allocate_properties,
4343 AllocationSite* allocation_site) {
4353 // JSFunctions should be allocated using AllocateFunction to be 4344 // JSFunctions should be allocated using AllocateFunction to be
4354 // properly initialized. 4345 // properly initialized.
4355 ASSERT(map->instance_type() != JS_FUNCTION_TYPE); 4346 ASSERT(map->instance_type() != JS_FUNCTION_TYPE);
4356 4347
4357 // Both types of global objects should be allocated using 4348 // Both types of global objects should be allocated using
4358 // AllocateGlobalObject to be properly initialized. 4349 // AllocateGlobalObject to be properly initialized.
4359 ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); 4350 ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE);
4360 ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); 4351 ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE);
4361 4352
4362 // Allocate the backing storage for the properties. 4353 // Allocate the backing storage for the properties.
4363 FixedArray* properties; 4354 FixedArray* properties;
4364 if (allocate_properties) { 4355 if (allocate_properties) {
4365 int prop_size = map->InitialPropertiesLength(); 4356 int prop_size = map->InitialPropertiesLength();
4366 ASSERT(prop_size >= 0); 4357 ASSERT(prop_size >= 0);
4367 { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure); 4358 { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure);
4368 if (!maybe_properties->To(&properties)) return maybe_properties; 4359 if (!maybe_properties->To(&properties)) return maybe_properties;
4369 } 4360 }
4370 } else { 4361 } else {
4371 properties = empty_fixed_array(); 4362 properties = empty_fixed_array();
4372 } 4363 }
4373 4364
4374 // Allocate the JSObject. 4365 // Allocate the JSObject.
4375 int size = map->instance_size(); 4366 int size = map->instance_size();
4376 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 4367 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure);
4377 Object* obj; 4368 Object* obj;
4378 MaybeObject* maybe_obj = Allocate(map, space); 4369 MaybeObject* maybe_obj = Allocate(map, space, allocation_site);
4379 if (!maybe_obj->To(&obj)) return maybe_obj; 4370 if (!maybe_obj->To(&obj)) return maybe_obj;
4380 4371
4381 // Initialize the JSObject. 4372 // Initialize the JSObject.
4382 InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); 4373 InitializeJSObjectFromMap(JSObject::cast(obj), properties, map);
4383 ASSERT(JSObject::cast(obj)->HasFastElements() || 4374 ASSERT(JSObject::cast(obj)->HasFastElements() ||
4384 JSObject::cast(obj)->HasExternalArrayElements()); 4375 JSObject::cast(obj)->HasExternalArrayElements());
4385 return obj; 4376 return obj;
4386 } 4377 }
4387 4378
4388 4379
4389 MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
4390 Map* map, Handle<AllocationSite> allocation_site) {
4391 // JSFunctions should be allocated using AllocateFunction to be
4392 // properly initialized.
4393 ASSERT(map->instance_type() != JS_FUNCTION_TYPE);
4394
4395 // Both types of global objects should be allocated using
4396 // AllocateGlobalObject to be properly initialized.
4397 ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE);
4398 ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE);
4399
4400 // Allocate the backing storage for the properties.
4401 int prop_size = map->InitialPropertiesLength();
4402 ASSERT(prop_size >= 0);
4403 FixedArray* properties;
4404 { MaybeObject* maybe_properties = AllocateFixedArray(prop_size);
4405 if (!maybe_properties->To(&properties)) return maybe_properties;
4406 }
4407
4408 // Allocate the JSObject.
4409 int size = map->instance_size();
4410 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, NOT_TENURED);
4411 Object* obj;
4412 MaybeObject* maybe_obj =
4413 AllocateWithAllocationSite(map, space, allocation_site);
4414 if (!maybe_obj->To(&obj)) return maybe_obj;
4415
4416 // Initialize the JSObject.
4417 InitializeJSObjectFromMap(JSObject::cast(obj), properties, map);
4418 ASSERT(JSObject::cast(obj)->HasFastElements());
4419 return obj;
4420 }
4421
4422
4423 MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, 4380 MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
4424 PretenureFlag pretenure) { 4381 PretenureFlag pretenure,
4382 AllocationSite* allocation_site) {
4425 ASSERT(constructor->has_initial_map()); 4383 ASSERT(constructor->has_initial_map());
4384
4426 // Allocate the object based on the constructors initial map. 4385 // Allocate the object based on the constructors initial map.
4427 MaybeObject* result = AllocateJSObjectFromMap( 4386 MaybeObject* result = AllocateJSObjectFromMap(constructor->initial_map(),
4428 constructor->initial_map(), pretenure); 4387 pretenure,
4388 true,
4389 allocation_site);
4429 #ifdef DEBUG 4390 #ifdef DEBUG
4430 // Make sure result is NOT a global object if valid. 4391 // Make sure result is NOT a global object if valid.
4431 Object* non_failure; 4392 Object* non_failure;
4432 ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject());
4433 #endif
4434 return result;
4435 }
4436
4437
4438 MaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor,
4439 Handle<AllocationSite> allocation_site) {
4440 ASSERT(constructor->has_initial_map());
4441 // Allocate the object based on the constructors initial map, or the payload
4442 // advice
4443 Map* initial_map = constructor->initial_map();
4444
4445 ElementsKind to_kind = allocation_site->GetElementsKind();
4446 AllocationSiteMode mode = TRACK_ALLOCATION_SITE;
4447 if (to_kind != initial_map->elements_kind()) {
4448 MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind);
4449 if (!maybe_new_map->To(&initial_map)) return maybe_new_map;
4450 // Possibly alter the mode, since we found an updated elements kind
4451 // in the type info cell.
4452 mode = AllocationSite::GetMode(to_kind);
4453 }
4454
4455 MaybeObject* result;
4456 if (mode == TRACK_ALLOCATION_SITE) {
4457 result = AllocateJSObjectFromMapWithAllocationSite(initial_map,
4458 allocation_site);
4459 } else {
4460 result = AllocateJSObjectFromMap(initial_map, NOT_TENURED);
4461 }
4462 #ifdef DEBUG
4463 // Make sure result is NOT a global object if valid.
4464 Object* non_failure;
4465 ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); 4393 ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject());
4466 #endif 4394 #endif
4467 return result; 4395 return result;
4468 } 4396 }
4469 4397
4470 4398
4471 MaybeObject* Heap::AllocateJSModule(Context* context, ScopeInfo* scope_info) { 4399 MaybeObject* Heap::AllocateJSModule(Context* context, ScopeInfo* scope_info) {
4472 // Allocate a fresh map. Modules do not have a prototype. 4400 // Allocate a fresh map. Modules do not have a prototype.
4473 Map* map; 4401 Map* map;
4474 MaybeObject* maybe_map = AllocateMap(JS_MODULE_TYPE, JSModule::kSize); 4402 MaybeObject* maybe_map = AllocateMap(JS_MODULE_TYPE, JSModule::kSize);
(...skipping 3273 matching lines...) Expand 10 before | Expand all | Expand 10 after
7748 static_cast<int>(object_sizes_last_time_[index])); 7676 static_cast<int>(object_sizes_last_time_[index]));
7749 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 7677 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
7750 #undef ADJUST_LAST_TIME_OBJECT_COUNT 7678 #undef ADJUST_LAST_TIME_OBJECT_COUNT
7751 7679
7752 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 7680 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
7753 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 7681 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
7754 ClearObjectStats(); 7682 ClearObjectStats();
7755 } 7683 }
7756 7684
7757 } } // namespace v8::internal 7685 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698