Index: test/cctest/test-cpu-profiler.cc |
diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc |
index 52e0fd652122e2b4137e06101f97367f28846f85..ce422b5b6ba179f257743a2d169ee5b81c1ee97e 100644 |
--- a/test/cctest/test-cpu-profiler.cc |
+++ b/test/cctest/test-cpu-profiler.cc |
@@ -587,6 +587,72 @@ TEST(CollectCpuProfile) { |
} |
+static const char* hot_deopt_no_frame_entry_test_source = |
+"function foo(a, b) {\n" |
+" try {\n" |
+" return a + b;\n" |
+" } catch (e) { }\n" |
+"}\n" |
+"function start(timeout) {\n" |
+" var start = Date.now();\n" |
+" do {\n" |
+" for (var i = 1; i < 1000; ++i) foo(1, i);\n" |
+" var duration = Date.now() - start;\n" |
+" } while (duration < timeout);\n" |
+" return duration;\n" |
+"}\n"; |
+ |
+// Check that the profile tree for the script above will look like the |
+// following: |
+// |
+// [Top down]: |
+// 1062 0 (root) [-1] |
+// 1054 0 start [-1] |
+// 1054 1 foo [-1] |
+// 2 2 (program) [-1] |
+// 6 6 (garbage collector) [-1] |
+// |
+// The test checks no FP ranges are present in a deoptimized funcion. |
+// If 'foo' has no ranges the samples falling into the prologue will miss the |
+// 'start' function on the stack, so 'foo' will be attached to the (root). |
+TEST(HotDeoptNoFrameEntry) { |
+ LocalContext env; |
+ v8::HandleScope scope(env->GetIsolate()); |
+ |
+ v8::Script::Compile(v8::String::NewFromUtf8( |
+ env->GetIsolate(), |
+ hot_deopt_no_frame_entry_test_source))->Run(); |
+ v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast( |
+ env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "start"))); |
+ |
+ int32_t profiling_interval_ms = 200; |
+ v8::Handle<v8::Value> args[] = { |
+ v8::Integer::New(env->GetIsolate(), profiling_interval_ms) |
+ }; |
+ v8::CpuProfile* profile = |
+ RunProfiler(env.local(), function, args, ARRAY_SIZE(args), 200); |
+ function->Call(env->Global(), ARRAY_SIZE(args), args); |
+ |
+ const v8::CpuProfileNode* root = profile->GetTopDownRoot(); |
+ |
+ ScopedVector<v8::Handle<v8::String> > names(3); |
+ names[0] = v8::String::NewFromUtf8( |
+ env->GetIsolate(), ProfileGenerator::kGarbageCollectorEntryName); |
+ names[1] = v8::String::NewFromUtf8(env->GetIsolate(), |
+ ProfileGenerator::kProgramEntryName); |
+ names[2] = v8::String::NewFromUtf8(env->GetIsolate(), "start"); |
+ CheckChildrenNames(root, names); |
+ |
+ const v8::CpuProfileNode* startNode = |
+ GetChild(env->GetIsolate(), root, "start"); |
+ CHECK_EQ(1, startNode->GetChildrenCount()); |
+ |
+ GetChild(env->GetIsolate(), startNode, "foo"); |
+ |
+ profile->Delete(); |
+} |
+ |
+ |
TEST(CollectCpuProfileSamples) { |
LocalContext env; |
v8::HandleScope scope(env->GetIsolate()); |