| Index: test/cctest/test-cpu-profiler.cc
|
| diff --git a/test/cctest/test-cpu-profiler.cc b/test/cctest/test-cpu-profiler.cc
|
| index ddd3152dc37c6f2ac6444d82408e552dd66a2748..cedec3858e88251eea6fc4b8e9a67ac520292336 100644
|
| --- a/test/cctest/test-cpu-profiler.cc
|
| +++ b/test/cctest/test-cpu-profiler.cc
|
| @@ -426,6 +426,7 @@ static v8::CpuProfile* RunProfiler(v8::Local<v8::Context> env,
|
| v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
|
| v8::Local<v8::String> profile_name = v8_str("my_profile");
|
|
|
| + cpu_profiler->SetSamplingInterval(100);
|
| cpu_profiler->StartProfiling(profile_name, collect_samples);
|
|
|
| i::Sampler* sampler =
|
| @@ -537,6 +538,9 @@ static const ProfileNode* GetSimpleBranch(v8::Local<v8::Context> context,
|
| return reinterpret_cast<const ProfileNode*>(node);
|
| }
|
|
|
| +static void CallCollectSample(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| + info.GetIsolate()->GetCpuProfiler()->CollectSample();
|
| +}
|
|
|
| static const char* cpu_profiler_test_source = "function loop(timeout) {\n"
|
| " this.mmm = 0;\n"
|
| @@ -1608,10 +1612,6 @@ static const char* js_force_collect_sample_source =
|
| " CallCollectSample();\n"
|
| "}";
|
|
|
| -static void CallCollectSample(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| - info.GetIsolate()->GetCpuProfiler()->CollectSample();
|
| -}
|
| -
|
| TEST(CollectSampleAPI) {
|
| v8::HandleScope scope(CcTest::isolate());
|
| v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
|
| @@ -1637,6 +1637,70 @@ TEST(CollectSampleAPI) {
|
| profile->Delete();
|
| }
|
|
|
| +static const char* js_native_js_runtime_multiple_test_source =
|
| + "function foo() {\n"
|
| + " CallCollectSample();"
|
| + " return Math.sin(Math.random());\n"
|
| + "}\n"
|
| + "var bound = foo.bind(this);\n"
|
| + "function bar() {\n"
|
| + " try { return bound(); } catch(e) {}\n"
|
| + "}\n"
|
| + "function start() {\n"
|
| + " try {\n"
|
| + " startProfiling('my_profile');\n"
|
| + " var startTime = Date.now();\n"
|
| + " do {\n"
|
| + " CallJsFunction(bar);\n"
|
| + " } while (Date.now() - startTime < 200);\n"
|
| + " } catch(e) {}\n"
|
| + "}";
|
| +
|
| +// The test check multiple entrances/exits between JS and native code.
|
| +//
|
| +// [Top down]:
|
| +// (root) #0 1
|
| +// start #16 3
|
| +// CallJsFunction #0 4
|
| +// bar #16 5
|
| +// foo #16 6
|
| +// CallCollectSample
|
| +// (program) #0 2
|
| +TEST(JsNativeJsRuntimeJsSampleMultiple) {
|
| + v8::HandleScope scope(CcTest::isolate());
|
| + v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
|
| + v8::Context::Scope context_scope(env);
|
| +
|
| + v8::Local<v8::FunctionTemplate> func_template =
|
| + v8::FunctionTemplate::New(env->GetIsolate(), CallJsFunction);
|
| + v8::Local<v8::Function> func =
|
| + func_template->GetFunction(env).ToLocalChecked();
|
| + func->SetName(v8_str("CallJsFunction"));
|
| + env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust();
|
| +
|
| + func_template =
|
| + v8::FunctionTemplate::New(env->GetIsolate(), CallCollectSample);
|
| + func = func_template->GetFunction(env).ToLocalChecked();
|
| + func->SetName(v8_str("CallCollectSample"));
|
| + env->Global()->Set(env, v8_str("CallCollectSample"), func).FromJust();
|
| +
|
| + CompileRun(js_native_js_runtime_multiple_test_source);
|
| + v8::Local<v8::Function> function = GetFunction(env, "start");
|
| +
|
| + v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 1000);
|
| +
|
| + const v8::CpuProfileNode* root = profile->GetTopDownRoot();
|
| + const v8::CpuProfileNode* startNode = GetChild(env, root, "start");
|
| + const v8::CpuProfileNode* nativeFunctionNode =
|
| + GetChild(env, startNode, "CallJsFunction");
|
| +
|
| + const v8::CpuProfileNode* barNode = GetChild(env, nativeFunctionNode, "bar");
|
| + const v8::CpuProfileNode* fooNode = GetChild(env, barNode, "foo");
|
| + GetChild(env, fooNode, "CallCollectSample");
|
| +
|
| + profile->Delete();
|
| +}
|
| +
|
| // [Top down]:
|
| // 0 (root) #0 1
|
| // 2 (program) #0 2
|
|
|