Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index 13622d6e046e59adf3ae13b15af36f757eb4e0d9..3ee38026d3b7881f073fa4b77612644111cf91ad 100644 |
--- a/src/heap/spaces.cc |
+++ b/src/heap/spaces.cc |
@@ -2017,7 +2017,6 @@ void SemiSpaceIterator::Initialize(Address start, Address end) { |
limit_ = end; |
} |
- |
#ifdef DEBUG |
// heap_histograms is shared, always clear it before using it. |
static void ClearHistograms(Isolate* isolate) { |
@@ -2035,25 +2034,22 @@ static void ClearHistograms(Isolate* isolate) { |
static void ClearCodeKindStatistics(int* code_kind_statistics) { |
- for (int i = 0; i < Code::NUMBER_OF_KINDS; i++) { |
+ for (int i = 0; i < AbstractCode::NUMBER_OF_KINDS; i++) { |
code_kind_statistics[i] = 0; |
} |
} |
- |
- |
static void ReportCodeKindStatistics(int* code_kind_statistics) { |
PrintF("\n Code kind histograms: \n"); |
- for (int i = 0; i < Code::NUMBER_OF_KINDS; i++) { |
+ for (int i = 0; i < AbstractCode::NUMBER_OF_KINDS; i++) { |
if (code_kind_statistics[i] > 0) { |
PrintF(" %-20s: %10d bytes\n", |
- Code::Kind2String(static_cast<Code::Kind>(i)), |
+ AbstractCode::Kind2String(static_cast<AbstractCode::Kind>(i)), |
code_kind_statistics[i]); |
} |
} |
PrintF("\n"); |
} |
- |
static int CollectHistogramInfo(HeapObject* obj) { |
Isolate* isolate = obj->GetIsolate(); |
InstanceType type = obj->map()->instance_type(); |
@@ -2749,12 +2745,15 @@ HeapObject* PagedSpace::SlowAllocateRaw(int size_in_bytes) { |
return SweepAndRetryAllocation(size_in_bytes); |
} |
- |
#ifdef DEBUG |
void PagedSpace::ReportCodeStatistics(Isolate* isolate) { |
CommentStatistic* comments_statistics = |
isolate->paged_space_comments_statistics(); |
ReportCodeKindStatistics(isolate->code_kind_statistics()); |
+ PrintF("Code size including metadata : %10d bytes\n", |
+ isolate->code_and_metadata_size()); |
+ PrintF("Bytecode size including metadata: %10d bytes\n", |
+ isolate->bytecode_and_metadata_size()); |
PrintF( |
"Code comment statistics (\" [ comment-txt : size/ " |
"count (average)\"):\n"); |
@@ -2768,7 +2767,6 @@ void PagedSpace::ReportCodeStatistics(Isolate* isolate) { |
PrintF("\n"); |
} |
- |
void PagedSpace::ResetCodeStatistics(Isolate* isolate) { |
CommentStatistic* comments_statistics = |
isolate->paged_space_comments_statistics(); |
@@ -2844,40 +2842,28 @@ static void CollectCommentStatistics(Isolate* isolate, RelocIterator* it) { |
EnterComment(isolate, comment_txt, flat_delta); |
} |
- |
-// Collects code size statistics: |
-// - by code kind |
-// - by code comment |
-void PagedSpace::CollectCodeStatistics() { |
- Isolate* isolate = heap()->isolate(); |
- HeapObjectIterator obj_it(this); |
- for (HeapObject* obj = obj_it.Next(); obj != NULL; obj = obj_it.Next()) { |
- if (obj->IsAbstractCode()) { |
- AbstractCode* code = AbstractCode::cast(obj); |
- isolate->code_kind_statistics()[code->kind()] += code->Size(); |
- } |
- if (obj->IsCode()) { |
- // TODO(mythria): Also enable this for BytecodeArray when it supports |
- // RelocInformation. |
- Code* code = Code::cast(obj); |
- RelocIterator it(code); |
- int delta = 0; |
- const byte* prev_pc = code->instruction_start(); |
- while (!it.done()) { |
- if (it.rinfo()->rmode() == RelocInfo::COMMENT) { |
- delta += static_cast<int>(it.rinfo()->pc() - prev_pc); |
- CollectCommentStatistics(isolate, &it); |
- prev_pc = it.rinfo()->pc(); |
- } |
- it.next(); |
- } |
- |
- DCHECK(code->instruction_start() <= prev_pc && |
- prev_pc <= code->instruction_end()); |
- delta += static_cast<int>(code->instruction_end() - prev_pc); |
- EnterComment(isolate, "NoComment", delta); |
+// Collects code comment statistics |
+static void CollectCodeCommentStatistics(HeapObject* obj, Isolate* isolate) { |
+ if (!obj->IsCode()) { |
+ return; |
+ } |
+ Code* code = Code::cast(obj); |
+ RelocIterator it(code); |
+ int delta = 0; |
+ const byte* prev_pc = code->instruction_start(); |
+ while (!it.done()) { |
+ if (it.rinfo()->rmode() == RelocInfo::COMMENT) { |
+ delta += static_cast<int>(it.rinfo()->pc() - prev_pc); |
+ CollectCommentStatistics(isolate, &it); |
+ prev_pc = it.rinfo()->pc(); |
} |
+ it.next(); |
} |
+ |
+ DCHECK(code->instruction_start() <= prev_pc && |
+ prev_pc <= code->instruction_end()); |
+ delta += static_cast<int>(code->instruction_end() - prev_pc); |
+ EnterComment(isolate, "NoComment", delta); |
} |
@@ -2898,6 +2884,44 @@ void PagedSpace::ReportStatistics() { |
} |
#endif |
+static void RecordCodeSizeIncludingMetadata(AbstractCode* abstract_code, |
+ Isolate* isolate) { |
+ int size = abstract_code->SizeIncludingMetadata(); |
+ if (abstract_code->IsCode()) { |
+ size += isolate->code_and_metadata_size(); |
+ isolate->set_code_and_metadata_size(size); |
+ } else { |
+ size += isolate->bytecode_and_metadata_size(); |
+ isolate->set_bytecode_and_metadata_size(size); |
+ } |
+} |
+ |
+// Collects code size statistics: |
+// - code and metadata size |
+// - by code kind (only in debug mode) |
+// - by code comment (only in debug mode) |
+void PagedSpace::CollectCodeStatistics() { |
+ Isolate* isolate = heap()->isolate(); |
+ HeapObjectIterator obj_it(this); |
+ for (HeapObject* obj = obj_it.Next(); obj != NULL; obj = obj_it.Next()) { |
+ if (obj->IsAbstractCode()) { |
+ AbstractCode* code = AbstractCode::cast(obj); |
+ RecordCodeSizeIncludingMetadata(code, isolate); |
+#ifdef DEBUG |
+ isolate->code_kind_statistics()[code->kind()] += code->Size(); |
+ CollectCodeCommentStatistics(obj, isolate); |
+#endif |
+ } |
+ } |
+} |
+ |
+void PagedSpace::ResetCodeAndMetadataStatistics(Isolate* isolate) { |
+ isolate->set_code_and_metadata_size(0); |
+ isolate->set_bytecode_and_metadata_size(0); |
+#ifdef DEBUG |
+ ResetCodeStatistics(isolate); |
+#endif |
+} |
// ----------------------------------------------------------------------------- |
// MapSpace implementation |
@@ -3168,6 +3192,20 @@ void LargeObjectSpace::Verify() { |
} |
#endif |
+void LargeObjectSpace::CollectCodeStatistics() { |
+ Isolate* isolate = heap()->isolate(); |
+ LargeObjectIterator obj_it(this); |
+ for (HeapObject* obj = obj_it.Next(); obj != NULL; obj = obj_it.Next()) { |
+ if (obj->IsAbstractCode()) { |
+ AbstractCode* code = AbstractCode::cast(obj); |
+ RecordCodeSizeIncludingMetadata(code, isolate); |
+#ifdef DEBUG |
+ isolate->code_kind_statistics()[code->kind()] += code->Size(); |
+ CollectCodeCommentStatistics(obj, isolate); |
+#endif |
+ } |
+ } |
+} |
#ifdef DEBUG |
void LargeObjectSpace::Print() { |
@@ -3197,18 +3235,6 @@ void LargeObjectSpace::ReportStatistics() { |
} |
-void LargeObjectSpace::CollectCodeStatistics() { |
- Isolate* isolate = heap()->isolate(); |
- LargeObjectIterator obj_it(this); |
- for (HeapObject* obj = obj_it.Next(); obj != NULL; obj = obj_it.Next()) { |
- if (obj->IsAbstractCode()) { |
- AbstractCode* code = AbstractCode::cast(obj); |
- isolate->code_kind_statistics()[code->kind()] += code->Size(); |
- } |
- } |
-} |
- |
- |
void Page::Print() { |
// Make a best-effort to print the objects in the page. |
PrintF("Page@%p in %s\n", this->address(), |