Index: runtime/vm/profiler_test.cc |
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc |
index b4b9080ca64ac5dd03e43faae6a35cba397ce199..5a8e5378cfd61739917790ad7ab478255dfb9b13 100644 |
--- a/runtime/vm/profiler_test.cc |
+++ b/runtime/vm/profiler_test.cc |
@@ -314,6 +314,81 @@ TEST_CASE(Profiler_ToggleRecordAllocation) { |
} |
+TEST_CASE(Profiler_CodeTicks) { |
+ const char* kScript = |
+ "class A {\n" |
+ " var a;\n" |
+ " var b;\n" |
+ "}\n" |
+ "class B {\n" |
+ " static boo() {\n" |
+ " return new A();\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " B.boo();\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
+ EXPECT_VALID(lib); |
+ Library& root_library = Library::Handle(); |
+ root_library ^= Api::UnwrapHandle(lib); |
+ |
+ const Class& class_a = Class::Handle(GetClass(root_library, "A")); |
+ EXPECT(!class_a.IsNull()); |
+ |
+ Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
+ EXPECT_VALID(result); |
+ |
+ { |
+ Isolate* isolate = Isolate::Current(); |
+ StackZone zone(isolate); |
+ HANDLESCOPE(isolate); |
+ Profile profile(isolate); |
+ AllocationFilter filter(isolate, class_a.id()); |
+ profile.Build(&filter, Profile::kNoTags); |
+ // We should have no allocation samples. |
+ EXPECT_EQ(0, profile.sample_count()); |
+ } |
+ |
+ // Turn on allocation tracing for A. |
+ class_a.SetTraceAllocation(true); |
+ |
+ // Allocate three times. |
+ result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
+ EXPECT_VALID(result); |
+ result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
+ EXPECT_VALID(result); |
+ result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
+ EXPECT_VALID(result); |
+ |
+ { |
+ Isolate* isolate = Isolate::Current(); |
+ StackZone zone(isolate); |
+ HANDLESCOPE(isolate); |
+ Profile profile(isolate); |
+ AllocationFilter filter(isolate, class_a.id()); |
+ profile.Build(&filter, Profile::kNoTags); |
+ // We should have one allocation sample. |
+ EXPECT_EQ(3, profile.sample_count()); |
+ ProfileTrieWalker walker(&profile); |
+ |
+ // Exclusive code: B.boo -> main. |
+ walker.Reset(Profile::kExclusiveCode); |
rmacnak
2015/07/28 00:11:44
Seems weird to create a walker for exclusive code
|
+ // Move down from the root. |
+ EXPECT(walker.Down()); |
+ EXPECT_STREQ("B.boo", walker.CurrentName()); |
+ EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
+ EXPECT_EQ(3, walker.CurrentExclusiveTicks()); |
+ EXPECT(walker.Down()); |
+ EXPECT_STREQ("main", walker.CurrentName()); |
+ EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
+ EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
+ EXPECT(!walker.Down()); |
+ } |
+} |
+ |
+ |
TEST_CASE(Profiler_IntrinsicAllocation) { |
const char* kScript = "double foo(double a, double b) => a + b;"; |
Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |