Index: test/cctest/test-heap-profiler.cc |
diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc |
index e5d2c6b48d4bd98fcf1d88bf376201541296a35b..23fe1c27e036e571abb23bdf7b4a90f0f3a4cfc1 100644 |
--- a/test/cctest/test-heap-profiler.cc |
+++ b/test/cctest/test-heap-profiler.cc |
@@ -2230,3 +2230,84 @@ 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" |
+" return f_1(x+1);\n" |
+"}\n" |
+"%NeverOptimizeFunction(f_0);\n" |
+"function f_1(x) {\n" |
+" return new f_2(x+1);\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(TrackBumpPointerAllocations) { |
+ i::FLAG_allow_natives_syntax = true; |
+ v8::HandleScope scope(v8::Isolate::GetCurrent()); |
+ LocalContext env; |
+ |
+ v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); |
+ const char* names[] = { "(anonymous function)", "start", "f_0", "f_1" }; |
+ // First check that normally all allocations are recorded. |
+ { |
+ heap_profiler->StartRecordingHeapAllocations(); |
+ |
+ CompileRun(inline_heap_allocation_source); |
+ |
+ const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
+ v8::String::New("Test2")); |
+ 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); |
+ |
+ 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(); |
+ } |
+ |
+ { |
+ heap_profiler->StartRecordingHeapAllocations(); |
+ |
+ // Now check that not all allocations are tracked if we manually reenable |
+ // inline allocations. |
+ CHECK(CcTest::heap()->inline_allocation_disabled()); |
+ CcTest::heap()->EnableInlineAllocation(); |
+ |
+ CompileRun(inline_heap_allocation_source); |
+ |
+ const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot( |
+ v8::String::New("Test1")); |
+ 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); |
+ |
+ AllocationTraceNode* node = |
+ FindNode(tracker, Vector<const char*>(names, ARRAY_SIZE(names))); |
+ CHECK_NE(NULL, node); |
+ CHECK_LT(node->allocation_count(), 100); |
+ |
+ CcTest::heap()->DisableInlineAllocation(); |
+ heap_profiler->StopRecordingHeapAllocations(); |
+ } |
+} |