| Index: test/cctest/test-cpu-profiler.cc
|
| diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc
|
| index 3fb5d3ae2cb636888b69e6acb52579ceafede81d..e24490a891db4ab0e0c156554644d4667c8a9329 100644
|
| --- a/test/cctest/test-cpu-profiler.cc
|
| +++ b/test/cctest/test-cpu-profiler.cc
|
| @@ -1360,3 +1360,56 @@ TEST(IdleTime) {
|
|
|
| cpu_profiler->DeleteAllCpuProfiles();
|
| }
|
| +
|
| +
|
| +static void CheckFunctionDetails(const v8::CpuProfileNode* node,
|
| + const char* name, const char* script_name, int script_id,
|
| + int line, int column) {
|
| + CHECK_EQ(v8::String::New(name), node->GetFunctionName());
|
| + CHECK_EQ(v8::String::New(script_name), node->GetScriptResourceName());
|
| + CHECK_EQ(script_id, node->GetScriptId());
|
| + CHECK_EQ(line, node->GetLineNumber());
|
| + CHECK_EQ(column, node->GetColumnNumber());
|
| +}
|
| +
|
| +
|
| +TEST(FunctionDetails) {
|
| + const char* extensions[] = { "v8/profiler" };
|
| + v8::ExtensionConfiguration config(1, extensions);
|
| + LocalContext env(&config);
|
| + v8::HandleScope handleScope(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 foo\n() { try { bar(); } catch(e) {} }\n"
|
| + " function bar() { startProfiling(); }\n"), v8::String::New("script_a"));
|
| + script_a->Run();
|
| + v8::Handle<v8::Script> script_b = v8::Script::Compile(v8::String::New(
|
| + "\n\n function baz() { try { foo(); } catch(e) {} }\n"
|
| + "\n\nbaz();\n"
|
| + "stopProfiling();\n"), v8::String::New("script_b"));
|
| + 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:
|
| + // 0 (root) 0 #1
|
| + // 0 (anonymous function) 19 #2 no reason script_b:1
|
| + // 0 baz 19 #3 TryCatchStatement script_b:3
|
| + // 0 foo 18 #4 TryCatchStatement script_a:2
|
| + // 1 bar 18 #5 no reason script_a:3
|
| + const v8::CpuProfileNode* root = profile->GetTopDownRoot();
|
| + const v8::CpuProfileNode* script = GetChild(root,
|
| + ProfileGenerator::kAnonymousFunctionName);
|
| + CheckFunctionDetails(script, ProfileGenerator::kAnonymousFunctionName,
|
| + "script_b", script_b->GetId(), 1, 1);
|
| + const v8::CpuProfileNode* baz = GetChild(script, "baz");
|
| + CheckFunctionDetails(baz, "baz", "script_b", script_b->GetId(), 3, 16);
|
| + const v8::CpuProfileNode* foo = GetChild(baz, "foo");
|
| + CheckFunctionDetails(foo, "foo", "script_a", script_a->GetId(), 2, 1);
|
| + const v8::CpuProfileNode* bar = GetChild(foo, "bar");
|
| + CheckFunctionDetails(bar, "bar", "script_a", script_a->GetId(), 3, 14);
|
| +}
|
|
|