Chromium Code Reviews| Index: runtime/vm/profiler_test.cc |
| diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc |
| index 5763abd24fb203128f5bac07186139f2c726d81c..3ce1f0b16bf4d98592020fc0b98dbbac20406988 100644 |
| --- a/runtime/vm/profiler_test.cc |
| +++ b/runtime/vm/profiler_test.cc |
| @@ -1078,4 +1078,110 @@ TEST_CASE(Profiler_FunctionInline) { |
| } |
| } |
| + |
| +TEST_CASE(Profiler_ChainedSamples) { |
| + // Each sample holds 8 stack frames. |
| + // This chain is 20 stack frames deep. |
| + 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" |
| + "go() => init();\n" |
| + "init() => secondInit();\n" |
| + "secondInit() => apple();\n" |
| + "apple() => banana();\n" |
| + "banana() => cantaloupe();\n" |
| + "cantaloupe() => dog();\n" |
| + "dog() => elephant();\n" |
| + "elephant() => fred();\n" |
| + "fred() => granola();\n" |
| + "granola() => haystack();\n" |
| + "haystack() => ice();\n" |
| + "ice() => jeep();\n" |
| + "jeep() => kindle();\n" |
| + "kindle() => lemon();\n" |
| + "lemon() => mayo();\n" |
| + "mayo() => napkin();\n" |
| + "napkin() => orange();\n" |
| + "orange() => B.boo();\n" |
| + "main() {\n" |
| + " return go();\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()); |
| + class_a.SetTraceAllocation(true); |
| + |
| + Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| + EXPECT_VALID(result); |
| + |
| + |
| + { |
| + Isolate* isolate = Isolate::Current(); |
| + StackZone zone(isolate); |
| + HANDLESCOPE(isolate); |
|
siva
2015/08/04 21:33:09
We are trying to deprecate these APIs that use cur
Cutch
2015/08/05 13:49:13
Done here and elsewhere (in this file).
|
| + Profile profile(isolate); |
| + AllocationFilter filter(isolate, class_a.id()); |
| + profile.Build(&filter, Profile::kNoTags); |
| + // We should have 1 allocation sample. |
| + EXPECT_EQ(1, profile.sample_count()); |
| + ProfileTrieWalker walker(&profile); |
| + |
| + walker.Reset(Profile::kExclusiveCode); |
| + // Move down from the root. |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("B.boo", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("orange", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("napkin", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("mayo", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("lemon", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("kindle", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("jeep", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("ice", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("haystack", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("granola", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("fred", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("elephant", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("dog", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("cantaloupe", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("banana", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("apple", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("secondInit", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("init", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("go", walker.CurrentName()); |
| + EXPECT(walker.Down()); |
| + EXPECT_STREQ("main", walker.CurrentName()); |
| + EXPECT(!walker.Down()); |
| + } |
| +} |
| + |
| } // namespace dart |