Index: test/cctest/test-profile-generator.cc |
diff --git a/test/cctest/test-profile-generator.cc b/test/cctest/test-profile-generator.cc |
index e9197896734da11548615e2424bafff2608e494f..dfcc75ce13ff1f117f88d85ad94001e71f6aab62 100644 |
--- a/test/cctest/test-profile-generator.cc |
+++ b/test/cctest/test-profile-generator.cc |
@@ -905,3 +905,62 @@ TEST(Issue51919) { |
for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) |
i::DeleteArray(titles[i]); |
} |
+ |
+ |
+static const v8::CpuProfileNode* PickChild(const v8::CpuProfileNode* parent, |
+ const char* name) { |
+ for (int i = 0; i < parent->GetChildrenCount(); ++i) { |
+ const v8::CpuProfileNode* child = parent->GetChild(i); |
+ v8::String::AsciiValue function_name(child->GetFunctionName()); |
+ if (strcmp(*function_name, name) == 0) return child; |
+ } |
+ return NULL; |
+} |
+ |
+ |
+TEST(ProfileNodeScriptId) { |
+ // This test does not pass with inlining enabled since inlined functions |
+ // don't appear in the stack trace. |
+ i::FLAG_use_inlining = false; |
+ |
+ const char* extensions[] = { "v8/profiler" }; |
+ v8::ExtensionConfiguration config(1, extensions); |
+ LocalContext env(&config); |
+ v8::HandleScope hs(env->GetIsolate()); |
+ |
+ v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler(); |
+ CHECK_EQ(0, profiler->GetProfileCount()); |
+ v8::Handle<v8::Script> script_a = v8::Script::Compile(v8::String::New( |
+ "function a() { startProfiling(); }\n")); |
+ script_a->Run(); |
+ v8::Handle<v8::Script> script_b = v8::Script::Compile(v8::String::New( |
+ "function b() { a(); }\n" |
+ "b();\n" |
+ "stopProfiling();\n")); |
+ script_b->Run(); |
+ CHECK_EQ(1, profiler->GetProfileCount()); |
+ const v8::CpuProfile* profile = profiler->GetCpuProfile(0); |
+ const v8::CpuProfileNode* current = profile->GetTopDownRoot(); |
+ reinterpret_cast<ProfileNode*>( |
+ const_cast<v8::CpuProfileNode*>(current))->Print(0); |
+ // The tree should look like this: |
+ // (root) |
+ // (anonymous function) |
+ // b |
+ // a |
+ // There can also be: |
+ // startProfiling |
+ // if the sampler managed to get a tick. |
+ current = PickChild(current, i::ProfileGenerator::kAnonymousFunctionName); |
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current)); |
+ |
+ current = PickChild(current, "b"); |
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current)); |
+ CHECK_EQ(script_b->GetId(), current->GetScriptId()); |
+ |
+ current = PickChild(current, "a"); |
+ CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current)); |
+ CHECK_EQ(script_a->GetId(), current->GetScriptId()); |
+} |
+ |
+ |