Index: test/cctest/test-cpu-profiler.cc |
diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc |
index c6a31dd27ecdae11a5385e388cd05d04b838cc5b..1f768790939251725d1ffe772e0e755ffae0ddc2 100644 |
--- a/test/cctest/test-cpu-profiler.cc |
+++ b/test/cctest/test-cpu-profiler.cc |
@@ -493,6 +493,17 @@ static void CheckSimpleBranch(v8::Isolate* isolate, |
} |
+static const v8::CpuProfileNode* GetSimpleBranch(v8::Isolate* isolate, |
+ const v8::CpuProfileNode* node, |
+ const char* names[], |
+ int length) { |
+ for (int i = 0; i < length; i++) { |
+ node = GetChild(isolate, node, names[i]); |
+ } |
+ return node; |
+} |
+ |
+ |
static const char* cpu_profiler_test_source = "function loop(timeout) {\n" |
" this.mmm = 0;\n" |
" var start = Date.now();\n" |
@@ -1706,3 +1717,48 @@ TEST(DontStopOnFinishedProfileDelete) { |
outer_profile = NULL; |
CHECK_EQ(0, iprofiler->GetProfilesCount()); |
} |
+ |
+ |
+static const char* collect_deopt_events_test_source = |
+ "function opt_function(value) {\n" |
+ " return value / 10;\n" |
+ "}\n" |
+ "\n" |
+ "function test(value) {\n" |
+ " return opt_function(value);\n" |
+ "}\n" |
+ "\n" |
+ "startProfiling();\n" |
+ "\n" |
+ "for (var i = 0; i < 10; ++i) test(10);\n" |
+ "\n" |
+ "%OptimizeFunctionOnNextCall(opt_function)\n" |
+ "\n" |
+ "for (var i = 0; i < 10; ++i) test(10);\n" |
+ "\n" |
+ "for (var i = 0; i < 10; ++i) test(undefined);\n" |
+ "\n" |
+ "stopProfiling();\n" |
+ "\n"; |
+ |
+ |
+TEST(CollectDeoptEvents) { |
+ if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
+ i::FLAG_allow_natives_syntax = true; |
+ v8::HandleScope scope(CcTest::isolate()); |
+ v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); |
+ v8::Context::Scope context_scope(env); |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); |
+ i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); |
+ |
+ v8::Script::Compile(v8_str(collect_deopt_events_test_source))->Run(); |
+ i::CpuProfile* iprofile = iprofiler->GetProfile(0); |
+ iprofile->Print(); |
+ v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); |
+ const char* branch[] = {"", "test", "opt_function"}; |
+ const v8::CpuProfileNode* opt_function = GetSimpleBranch( |
+ env->GetIsolate(), profile->GetTopDownRoot(), branch, arraysize(branch)); |
+ CHECK(opt_function); |
+ iprofiler->DeleteProfile(iprofile); |
+} |