| Index: test/cctest/test-cpu-profiler.cc
|
| diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc
|
| index f5f5d65d6049de738f057f545bb83c434299bdd0..3d639771f803a1fb45e48bdc3c291f516362d4c6 100644
|
| --- a/test/cctest/test-cpu-profiler.cc
|
| +++ b/test/cctest/test-cpu-profiler.cc
|
| @@ -118,7 +118,8 @@ TEST(CodeEvents) {
|
| 0,
|
| ToAddress(0x1000),
|
| 0x100,
|
| - ToAddress(0x10000));
|
| + ToAddress(0x10000),
|
| + NULL);
|
| processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
| "bbb",
|
| ToAddress(0x1200),
|
| @@ -545,3 +546,68 @@ TEST(CollectCpuProfile) {
|
|
|
| cpu_profiler->DeleteAllCpuProfiles();
|
| }
|
| +
|
| +
|
| +
|
| +static const char* cpu_profiler_test_source2 = "function loop() {}\n"
|
| +"function delay() { loop(); }\n"
|
| +"function start(count) {\n"
|
| +" var k = 0;\n"
|
| +" do {\n"
|
| +" delay();\n"
|
| +" } while (++k < 10*1000*1000);\n"
|
| +"}\n";
|
| +
|
| +// Check that the profile tree doesn't contain unexpecte traces:
|
| +// - 'loop' can be called only by 'delay'
|
| +// - 'delay' may be called only by 'start'
|
| +// The profile will look like the following:
|
| +//
|
| +// [Top down]:
|
| +// 135 0 (root) [-1] #1
|
| +// 121 72 start [-1] #3
|
| +// 49 33 delay [-1] #4
|
| +// 16 16 loop [-1] #5
|
| +// 14 14 (program) [-1] #2
|
| +TEST(SampleWhenFrameIsNotSetup) {
|
| + LocalContext env;
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + v8::Script::Compile(v8::String::New(cpu_profiler_test_source2))->Run();
|
| + v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(
|
| + env->Global()->Get(v8::String::New("start")));
|
| +
|
| + v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
|
| + v8::Local<v8::String> profile_name = v8::String::New("my_profile");
|
| +
|
| + cpu_profiler->StartCpuProfiling(profile_name);
|
| + int32_t repeat_count = 10;
|
| + v8::Handle<v8::Value> args[] = { v8::Integer::New(repeat_count) };
|
| + function->Call(env->Global(), ARRAY_SIZE(args), args);
|
| + const v8::CpuProfile* profile = cpu_profiler->StopCpuProfiling(profile_name);
|
| +
|
| + CHECK_NE(NULL, profile);
|
| + // Dump collected profile to have a better diagnostic in case of failure.
|
| + reinterpret_cast<i::CpuProfile*>(
|
| + const_cast<v8::CpuProfile*>(profile))->Print();
|
| +
|
| + const v8::CpuProfileNode* root = profile->GetTopDownRoot();
|
| +
|
| + ScopedVector<v8::Handle<v8::String> > names(3);
|
| + names[0] = v8::String::New(ProfileGenerator::kGarbageCollectorEntryName);
|
| + names[1] = v8::String::New(ProfileGenerator::kProgramEntryName);
|
| + names[2] = v8::String::New("start");
|
| + CheckChildrenNames(root, names);
|
| +
|
| + const v8::CpuProfileNode* startNode = FindChild(root, "start");
|
| + if (startNode->GetChildrenCount() > 0) {
|
| + CHECK_EQ(1, startNode->GetChildrenCount());
|
| + const v8::CpuProfileNode* delayNode = FindChild(startNode, "delay");
|
| + if (delayNode->GetChildrenCount() > 0) {
|
| + CHECK_EQ(1, delayNode->GetChildrenCount());
|
| + FindChild(delayNode, "loop");
|
| + }
|
| + }
|
| +
|
| + cpu_profiler->DeleteAllCpuProfiles();
|
| +}
|
|
|