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

Unified Diff: src/heap.cc

Issue 11818021: Allocation Info Tracking, continued. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap.h ('k') | src/ia32/code-stubs-ia32.cc » ('j') | src/objects.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index 0245cf7ee4b250e7c67630aecc00580669b76742..4c4d740bc0fe9d77755144ab00c7f7a980bdae3f 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -3910,50 +3910,36 @@ MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) {
}
-MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) {
+MaybeObject* Heap::Allocate(Map* map, AllocationSpace space,
+ AllocationSiteMode mode,
+ Handle<Object>* allocation_site_info_payload) {
ASSERT(gc_state_ == NOT_IN_GC);
ASSERT(map->instance_type() != MAP_TYPE);
+ ASSERT(allocation_site_info_payload != NULL ||
+ mode == DONT_TRACK_ALLOCATION_SITE);
+ ASSERT(space == NEW_SPACE || mode == DONT_TRACK_ALLOCATION_SITE);
// 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());
- Object* result;
- { MaybeObject* maybe_result =
- AllocateRaw(map->instance_size(), space, retry_space);
- if (!maybe_result->ToObject(&result)) return maybe_result;
+ int size = map->instance_size();
+ if (mode == TRACK_ALLOCATION_SITE) {
+ size += AllocationSiteInfo::kSize;
}
- // No need for write barrier since object is white and map is in old space.
- HeapObject::cast(result)->set_map_no_write_barrier(map);
- return result;
-}
-
-
-// TODO(mvstanton): consolidate this with the function above.
-MaybeObject* Heap::AllocateWithAllocationSiteInfo(Map* map,
- AllocationSpace space,
- Handle<Object>* allocation_site_info_payload) {
- 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());
Object* result;
- { MaybeObject* maybe_result =
- AllocateRaw(map->instance_size() + AllocationSiteInfo::kSize,
- space,
- retry_space);
- if (!maybe_result->ToObject(&result)) return maybe_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);
- Object* allocation_pointer = reinterpret_cast<Object*>(
- reinterpret_cast<Address>(result) + map->instance_size());
- HeapObject::cast(allocation_pointer)->set_map_no_write_barrier(
- allocation_site_info_map());
- AllocationSiteInfo* allocation_site_info =
- AllocationSiteInfo::cast(allocation_pointer);
- allocation_site_info->set_payload(**allocation_site_info_payload);
+ if (mode == TRACK_ALLOCATION_SITE) {
+ Object* allocation_pointer = reinterpret_cast<Object*>(
+ reinterpret_cast<Address>(result) + map->instance_size());
+ HeapObject::cast(allocation_pointer)->set_map_no_write_barrier(
+ allocation_site_info_map());
+ AllocationSiteInfo* allocation_site_info =
+ AllocationSiteInfo::cast(allocation_pointer);
+ allocation_site_info->set_payload(**allocation_site_info_payload);
+ }
return result;
}
@@ -4196,6 +4182,8 @@ void Heap::InitializeJSObjectFromMap(JSObject* obj,
MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure,
AllocationSiteMode mode,
Handle<Object>* allocation_site_info_payload) {
+ ASSERT(allocation_site_info_payload != NULL ||
+ mode == DONT_TRACK_ALLOCATION_SITE);
ASSERT(pretenure == NOT_TENURED || mode == DONT_TRACK_ALLOCATION_SITE);
// JSFunctions should be allocated using AllocateFunction to be
// properly initialized.
@@ -4222,16 +4210,9 @@ MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure,
(pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE;
if (map->instance_size() > Page::kMaxNonCodeHeapObjectSize) space = LO_SPACE;
Object* obj;
- {
- MaybeObject* maybe_obj;
- if (mode == TRACK_ALLOCATION_SITE) {
- maybe_obj = AllocateWithAllocationSiteInfo(map, space,
- allocation_site_info_payload);
- } else {
- maybe_obj = Allocate(map, space);
- }
- if (!maybe_obj->ToObject(&obj)) return maybe_obj;
- }
+ MaybeObject* maybe_obj = Allocate(map, space, mode,
+ allocation_site_info_payload);
+ if (!maybe_obj->To(&obj)) return maybe_obj;
// Initialize the JSObject.
InitializeJSObjectFromMap(JSObject::cast(obj),
@@ -4246,6 +4227,9 @@ MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
PretenureFlag pretenure,
AllocationSiteMode mode,
Handle<Object>* allocation_site_info_payload) {
+ ASSERT(allocation_site_info_payload != NULL ||
+ mode == DONT_TRACK_ALLOCATION_SITE);
+ ASSERT(pretenure == NOT_TENURED || mode == DONT_TRACK_ALLOCATION_SITE);
// Allocate the initial map if absent.
if (!constructor->has_initial_map()) {
Object* initial_map;
@@ -4259,20 +4243,16 @@ MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
// advice
Map* initial_map = constructor->initial_map();
if (mode == TRACK_ALLOCATION_SITE) {
- ASSERT(allocation_site_info_payload != NULL);
- ASSERT((*allocation_site_info_payload)->IsJSGlobalPropertyCell());
JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(
**allocation_site_info_payload);
- ASSERT(cell->value()->IsSmi());
Smi* smi = Smi::cast(cell->value());
ElementsKind to_kind = static_cast<ElementsKind>(smi->value());
if (to_kind != initial_map->elements_kind()) {
- initial_map = initial_map->LookupElementsTransitionMap(to_kind);
- // TODO(mvstanton): I may have to allocate this transition, right?
- ASSERT(initial_map != NULL);
- // constructor->set_initial_map(Map::cast(initial_map));
- // Map::cast(initial_map)->set_constructor(constructor);
- mode = DONT_TRACK_ALLOCATION_SITE;
+ MaybeObject* maybe_new_map = constructor->GetElementsTransitionMap(
+ isolate(), to_kind);
+ if (!maybe_new_map->To(&initial_map)) return maybe_new_map;
+ // TODO(mvstanton): Is the line below useful for performance?
+ // mode = DONT_TRACK_ALLOCATION_SITE;
Toon Verwaest 2013/02/21 12:13:03 Use GetMode(to_kind); here to decide whether or no
mvstanton 2013/02/27 14:37:07 Done.
}
}
@@ -4311,18 +4291,25 @@ MaybeObject* Heap::AllocateJSArrayAndStorage(
Handle<Object> *allocation_site_payload,
ArrayStorageAllocationMode mode,
PretenureFlag pretenure) {
- ASSERT(capacity >= length);
ASSERT(allocation_site_payload != NULL ||
allocation_site_info_mode == DONT_TRACK_ALLOCATION_SITE);
- if (pretenure == TENURED &&
- allocation_site_info_mode == TRACK_ALLOCATION_SITE) {
- PrintF("Sorry, can't track yet in tenured space\n");
- }
+ ASSERT(pretenure == NOT_TENURED ||
+ allocation_site_info_mode == DONT_TRACK_ALLOCATION_SITE);
MaybeObject* maybe_array = AllocateJSArray(elements_kind, pretenure,
allocation_site_info_mode,
allocation_site_payload);
JSArray* array;
if (!maybe_array->To(&array)) return maybe_array;
+ return AllocateJSArrayStorage(array, length, capacity, mode);
+}
+
+
+MaybeObject* Heap::AllocateJSArrayStorage(
+ JSArray* array,
+ int length,
+ int capacity,
+ ArrayStorageAllocationMode mode) {
+ ASSERT(capacity >= length);
if (capacity == 0) {
array->set_length(Smi::FromInt(0));
@@ -4332,6 +4319,7 @@ MaybeObject* Heap::AllocateJSArrayAndStorage(
FixedArrayBase* elms;
MaybeObject* maybe_elms = NULL;
+ ElementsKind elements_kind = array->GetElementsKind();
if (IsFastDoubleElementsKind(elements_kind)) {
if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
maybe_elms = AllocateUninitializedFixedDoubleArray(capacity);
« no previous file with comments | « src/heap.h ('k') | src/ia32/code-stubs-ia32.cc » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698