| 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()); | 
|  |