Index: test/cctest/test-heap-profiler.cc |
diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc |
index db2243a3f0445f847838d5bbe984ef6df5ffe7e9..bcf28ed85a9d6118c7c1bc239f663a0d44d782c9 100644 |
--- a/test/cctest/test-heap-profiler.cc |
+++ b/test/cctest/test-heap-profiler.cc |
@@ -2177,3 +2177,55 @@ TEST(TrackHeapAllocations) { |
CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
heap_profiler->StopRecordingHeapAllocations(); |
} |
+ |
+ |
+static const char* inline_heap_allocation_source = |
+"function f_0(x) {\n" |
+" try {\n" |
+" return f_1(x+1);\n" |
+" } catch (e) {}\n" |
+"}\n" |
+"function f_1(x) {\n" |
+" try {\n" |
+" return new f_2(x+1);\n" |
+" } catch (e) {}\n" |
+"}\n" |
+"function f_2(x) {\n" |
+" this.foo = x;\n" |
+"}\n" |
+"var instances = [];\n" |
+"function start() {\n" |
+" instances.push(f_0(0));\n" |
+"}\n" |
+"\n" |
+"for (var i = 0; i < 100; i++) start();\n"; |
+ |
+ |
+TEST(TrackInlineHeapAllocations) { |
+ v8::HandleScope scope(v8::Isolate::GetCurrent()); |
+ LocalContext env; |
+ |
+ v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
+ heap_profiler->StartRecordingHeapAllocations(); |
+ |
+ CompileRun(inline_heap_allocation_source); |
+ |
+ const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
+ v8::String::New("Test")); |
+ i::HeapSnapshotsCollection* collection = ToInternal(snapshot)->collection(); |
+ AllocationTracker* tracker = collection->allocation_tracker(); |
+ CHECK_NE(NULL, tracker); |
+ // Resolve all function locations. |
+ tracker->PrepareForSerialization(); |
+ // Print for better diagnostics in case of failure. |
+ tracker->trace_tree()->Print(tracker); |
+ |
+ const char* names[] = |
+ { "(anonymous function)", "start", "f_0", "f_1" }; |
+ AllocationTraceNode* node = |
+ FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); |
+ CHECK_NE(NULL, node); |
+ CHECK_GE(node->allocation_count(), 100); |
+ CHECK_GE(node->allocation_size(), 4 * node->allocation_count()); |
+ heap_profiler->StopRecordingHeapAllocations(); |
+} |