Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index c7f363821fcb25ea226bbaa8f6456078ed8551a5..6482baa1f4a3d459c70c7acada713bd1d6c44d81 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -4192,28 +4192,8 @@ void Heap::InitializeAllocationMemento(AllocationMemento* memento, |
} |
-MaybeObject* Heap::AllocateWithAllocationSite(Map* map, AllocationSpace space, |
- Handle<AllocationSite> allocation_site) { |
- ASSERT(gc_state_ == NOT_IN_GC); |
- ASSERT(map->instance_type() != MAP_TYPE); |
- // If allocation failures are disallowed, we may allocate in a different |
- // space when new space is full and the object is not a large object. |
- AllocationSpace retry_space = |
- (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); |
- int size = map->instance_size() + AllocationMemento::kSize; |
- Object* result; |
- MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
- // No need for write barrier since object is white and map is in old space. |
- HeapObject::cast(result)->set_map_no_write_barrier(map); |
- AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( |
- reinterpret_cast<Address>(result) + map->instance_size()); |
- InitializeAllocationMemento(alloc_memento, *allocation_site); |
- return result; |
-} |
- |
- |
-MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) { |
+MaybeObject* Heap::Allocate(Map* map, AllocationSpace space, |
+ AllocationSite* allocation_site) { |
ASSERT(gc_state_ == NOT_IN_GC); |
ASSERT(map->instance_type() != MAP_TYPE); |
// If allocation failures are disallowed, we may allocate in a different |
@@ -4221,11 +4201,19 @@ MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) { |
AllocationSpace retry_space = |
(space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); |
int size = map->instance_size(); |
+ if (allocation_site != NULL) { |
+ size += AllocationMemento::kSize; |
+ } |
Object* result; |
MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); |
if (!maybe_result->ToObject(&result)) return maybe_result; |
// No need for write barrier since object is white and map is in old space. |
HeapObject::cast(result)->set_map_no_write_barrier(map); |
+ if (allocation_site != NULL) { |
+ AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( |
+ reinterpret_cast<Address>(result) + map->instance_size()); |
+ InitializeAllocationMemento(alloc_memento, allocation_site); |
+ } |
return result; |
} |
@@ -4349,7 +4337,10 @@ void Heap::InitializeJSObjectFromMap(JSObject* obj, |
MaybeObject* Heap::AllocateJSObjectFromMap( |
- Map* map, PretenureFlag pretenure, bool allocate_properties) { |
+ Map* map, |
+ PretenureFlag pretenure, |
+ bool allocate_properties, |
+ AllocationSite* allocation_site) { |
// JSFunctions should be allocated using AllocateFunction to be |
// properly initialized. |
ASSERT(map->instance_type() != JS_FUNCTION_TYPE); |
@@ -4375,7 +4366,7 @@ MaybeObject* Heap::AllocateJSObjectFromMap( |
int size = map->instance_size(); |
AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); |
Object* obj; |
- MaybeObject* maybe_obj = Allocate(map, space); |
+ MaybeObject* maybe_obj = Allocate(map, space, allocation_site); |
if (!maybe_obj->To(&obj)) return maybe_obj; |
// Initialize the JSObject. |
@@ -4386,79 +4377,16 @@ MaybeObject* Heap::AllocateJSObjectFromMap( |
} |
-MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite( |
- Map* map, Handle<AllocationSite> allocation_site) { |
- // JSFunctions should be allocated using AllocateFunction to be |
- // properly initialized. |
- ASSERT(map->instance_type() != JS_FUNCTION_TYPE); |
- |
- // Both types of global objects should be allocated using |
- // AllocateGlobalObject to be properly initialized. |
- ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); |
- ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); |
- |
- // Allocate the backing storage for the properties. |
- int prop_size = map->InitialPropertiesLength(); |
- ASSERT(prop_size >= 0); |
- FixedArray* properties; |
- { MaybeObject* maybe_properties = AllocateFixedArray(prop_size); |
- if (!maybe_properties->To(&properties)) return maybe_properties; |
- } |
- |
- // Allocate the JSObject. |
- int size = map->instance_size(); |
- AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, NOT_TENURED); |
- Object* obj; |
- MaybeObject* maybe_obj = |
- AllocateWithAllocationSite(map, space, allocation_site); |
- if (!maybe_obj->To(&obj)) return maybe_obj; |
- |
- // Initialize the JSObject. |
- InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); |
- ASSERT(JSObject::cast(obj)->HasFastElements()); |
- return obj; |
-} |
- |
- |
MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, |
- PretenureFlag pretenure) { |
+ PretenureFlag pretenure, |
+ AllocationSite* allocation_site) { |
ASSERT(constructor->has_initial_map()); |
- // Allocate the object based on the constructors initial map. |
- MaybeObject* result = AllocateJSObjectFromMap( |
- constructor->initial_map(), pretenure); |
-#ifdef DEBUG |
- // Make sure result is NOT a global object if valid. |
- Object* non_failure; |
- ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); |
-#endif |
- return result; |
-} |
- |
-MaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor, |
- Handle<AllocationSite> allocation_site) { |
- ASSERT(constructor->has_initial_map()); |
- // Allocate the object based on the constructors initial map, or the payload |
- // advice |
- Map* initial_map = constructor->initial_map(); |
- |
- ElementsKind to_kind = allocation_site->GetElementsKind(); |
- AllocationSiteMode mode = TRACK_ALLOCATION_SITE; |
- if (to_kind != initial_map->elements_kind()) { |
- MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind); |
- if (!maybe_new_map->To(&initial_map)) return maybe_new_map; |
- // Possibly alter the mode, since we found an updated elements kind |
- // in the type info cell. |
- mode = AllocationSite::GetMode(to_kind); |
- } |
- |
- MaybeObject* result; |
- if (mode == TRACK_ALLOCATION_SITE) { |
- result = AllocateJSObjectFromMapWithAllocationSite(initial_map, |
- allocation_site); |
- } else { |
- result = AllocateJSObjectFromMap(initial_map, NOT_TENURED); |
- } |
+ // Allocate the object based on the constructors initial map. |
+ MaybeObject* result = AllocateJSObjectFromMap(constructor->initial_map(), |
+ pretenure, |
+ true, |
+ allocation_site); |
#ifdef DEBUG |
// Make sure result is NOT a global object if valid. |
Object* non_failure; |