Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: test/cctest/test-cpu-profiler.cc

Issue 2117343006: Introduce v8::CpuProfiler::New and v8::CpuProfiler::Dispose API. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove ProfilerExtension::Scope Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/test-api.cc ('k') | test/cctest/test-profile-generator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 CHECK_EQ(0, top_down_ddd_children->length()); 271 CHECK_EQ(0, top_down_ddd_children->length());
272 272
273 isolate->code_event_dispatcher()->RemoveListener(&profiler_listener); 273 isolate->code_event_dispatcher()->RemoveListener(&profiler_listener);
274 } 274 }
275 275
276 // http://crbug/51594 276 // http://crbug/51594
277 // This test must not crash. 277 // This test must not crash.
278 TEST(CrashIfStoppingLastNonExistentProfile) { 278 TEST(CrashIfStoppingLastNonExistentProfile) {
279 CcTest::InitializeVM(); 279 CcTest::InitializeVM();
280 TestSetup test_setup; 280 TestSetup test_setup;
281 CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler(); 281 std::unique_ptr<CpuProfiler> profiler(new CpuProfiler(CcTest::i_isolate()));
282 profiler->StartProfiling("1"); 282 profiler->StartProfiling("1");
283 profiler->StopProfiling("2"); 283 profiler->StopProfiling("2");
284 profiler->StartProfiling("1"); 284 profiler->StartProfiling("1");
285 profiler->StopProfiling(""); 285 profiler->StopProfiling("");
286 } 286 }
287 287
288 // http://code.google.com/p/v8/issues/detail?id=1398 288 // http://code.google.com/p/v8/issues/detail?id=1398
289 // Long stacks (exceeding max frames limit) must not be erased. 289 // Long stacks (exceeding max frames limit) must not be erased.
290 TEST(Issue1398) { 290 TEST(Issue1398) {
291 TestSetup test_setup; 291 TestSetup test_setup;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 node = node->children()->last(); 330 node = node->children()->last();
331 ++actual_depth; 331 ++actual_depth;
332 } 332 }
333 333
334 CHECK_EQ(1 + v8::TickSample::kMaxFramesCount, actual_depth); // +1 for PC. 334 CHECK_EQ(1 + v8::TickSample::kMaxFramesCount, actual_depth); // +1 for PC.
335 } 335 }
336 336
337 TEST(DeleteAllCpuProfiles) { 337 TEST(DeleteAllCpuProfiles) {
338 CcTest::InitializeVM(); 338 CcTest::InitializeVM();
339 TestSetup test_setup; 339 TestSetup test_setup;
340 CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler(); 340 std::unique_ptr<CpuProfiler> profiler(new CpuProfiler(CcTest::i_isolate()));
341 CHECK_EQ(0, profiler->GetProfilesCount()); 341 CHECK_EQ(0, profiler->GetProfilesCount());
342 profiler->DeleteAllProfiles(); 342 profiler->DeleteAllProfiles();
343 CHECK_EQ(0, profiler->GetProfilesCount()); 343 CHECK_EQ(0, profiler->GetProfilesCount());
344 344
345 profiler->StartProfiling("1"); 345 profiler->StartProfiling("1");
346 profiler->StopProfiling("1"); 346 profiler->StopProfiling("1");
347 CHECK_EQ(1, profiler->GetProfilesCount()); 347 CHECK_EQ(1, profiler->GetProfilesCount());
348 profiler->DeleteAllProfiles(); 348 profiler->DeleteAllProfiles();
349 CHECK_EQ(0, profiler->GetProfilesCount()); 349 CHECK_EQ(0, profiler->GetProfilesCount());
350 profiler->StartProfiling("1"); 350 profiler->StartProfiling("1");
(...skipping 23 matching lines...) Expand all
374 if (profile == profiler->GetProfile(i)) 374 if (profile == profiler->GetProfile(i))
375 return true; 375 return true;
376 } 376 }
377 return false; 377 return false;
378 } 378 }
379 379
380 380
381 TEST(DeleteCpuProfile) { 381 TEST(DeleteCpuProfile) {
382 LocalContext env; 382 LocalContext env;
383 v8::HandleScope scope(env->GetIsolate()); 383 v8::HandleScope scope(env->GetIsolate());
384 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); 384 v8::CpuProfiler* cpu_profiler = v8::CpuProfiler::New(env->GetIsolate());
385 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(cpu_profiler); 385 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(cpu_profiler);
386 386
387 CHECK_EQ(0, iprofiler->GetProfilesCount()); 387 CHECK_EQ(0, iprofiler->GetProfilesCount());
388 v8::Local<v8::String> name1 = v8_str("1"); 388 v8::Local<v8::String> name1 = v8_str("1");
389 cpu_profiler->StartProfiling(name1); 389 cpu_profiler->StartProfiling(name1);
390 v8::CpuProfile* p1 = cpu_profiler->StopProfiling(name1); 390 v8::CpuProfile* p1 = cpu_profiler->StopProfiling(name1);
391 CHECK(p1); 391 CHECK(p1);
392 CHECK_EQ(1, iprofiler->GetProfilesCount()); 392 CHECK_EQ(1, iprofiler->GetProfilesCount());
393 CHECK(FindCpuProfile(cpu_profiler, p1)); 393 CHECK(FindCpuProfile(cpu_profiler, p1));
394 p1->Delete(); 394 p1->Delete();
(...skipping 12 matching lines...) Expand all
407 CHECK_EQ(2, iprofiler->GetProfilesCount()); 407 CHECK_EQ(2, iprofiler->GetProfilesCount());
408 CHECK_NE(p2, p3); 408 CHECK_NE(p2, p3);
409 CHECK(FindCpuProfile(cpu_profiler, p3)); 409 CHECK(FindCpuProfile(cpu_profiler, p3));
410 CHECK(FindCpuProfile(cpu_profiler, p2)); 410 CHECK(FindCpuProfile(cpu_profiler, p2));
411 p2->Delete(); 411 p2->Delete();
412 CHECK_EQ(1, iprofiler->GetProfilesCount()); 412 CHECK_EQ(1, iprofiler->GetProfilesCount());
413 CHECK(!FindCpuProfile(cpu_profiler, p2)); 413 CHECK(!FindCpuProfile(cpu_profiler, p2));
414 CHECK(FindCpuProfile(cpu_profiler, p3)); 414 CHECK(FindCpuProfile(cpu_profiler, p3));
415 p3->Delete(); 415 p3->Delete();
416 CHECK_EQ(0, iprofiler->GetProfilesCount()); 416 CHECK_EQ(0, iprofiler->GetProfilesCount());
417 cpu_profiler->Dispose();
417 } 418 }
418 419
419 420
420 TEST(ProfileStartEndTime) { 421 TEST(ProfileStartEndTime) {
421 LocalContext env; 422 LocalContext env;
422 v8::HandleScope scope(env->GetIsolate()); 423 v8::HandleScope scope(env->GetIsolate());
423 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); 424 v8::CpuProfiler* cpu_profiler = v8::CpuProfiler::New(env->GetIsolate());
424 425
425 v8::Local<v8::String> profile_name = v8_str("test"); 426 v8::Local<v8::String> profile_name = v8_str("test");
426 cpu_profiler->StartProfiling(profile_name); 427 cpu_profiler->StartProfiling(profile_name);
427 const v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name); 428 const v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name);
428 CHECK(profile->GetStartTime() <= profile->GetEndTime()); 429 CHECK(profile->GetStartTime() <= profile->GetEndTime());
430 cpu_profiler->Dispose();
429 } 431 }
430 432
431 static v8::CpuProfile* RunProfiler(v8::Local<v8::Context> env, 433 class ProfilerHelper {
432 v8::Local<v8::Function> function, 434 public:
433 v8::Local<v8::Value> argv[], int argc, 435 explicit ProfilerHelper(const v8::Local<v8::Context>& context)
434 unsigned min_js_samples = 0, 436 : context_(context),
435 unsigned min_external_samples = 0, 437 profiler_(v8::CpuProfiler::New(context->GetIsolate())) {
436 bool collect_samples = false) { 438 i::ProfilerExtension::set_profiler(profiler_);
437 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); 439 }
440 ~ProfilerHelper() {
441 i::ProfilerExtension::set_profiler(static_cast<CpuProfiler*>(nullptr));
442 profiler_->Dispose();
443 }
444
445 v8::CpuProfile* Run(v8::Local<v8::Function> function,
446 v8::Local<v8::Value> argv[], int argc,
447 unsigned min_js_samples = 0,
448 unsigned min_external_samples = 0,
449 bool collect_samples = false);
450
451 v8::CpuProfiler* profiler() { return profiler_; }
452
453 private:
454 v8::Local<v8::Context> context_;
455 v8::CpuProfiler* profiler_;
456 };
457
458 v8::CpuProfile* ProfilerHelper::Run(v8::Local<v8::Function> function,
459 v8::Local<v8::Value> argv[], int argc,
460 unsigned min_js_samples,
461 unsigned min_external_samples,
462 bool collect_samples) {
438 v8::Local<v8::String> profile_name = v8_str("my_profile"); 463 v8::Local<v8::String> profile_name = v8_str("my_profile");
439 464
440 cpu_profiler->SetSamplingInterval(100); 465 profiler_->SetSamplingInterval(100);
441 cpu_profiler->StartProfiling(profile_name, collect_samples); 466 profiler_->StartProfiling(profile_name, collect_samples);
442 467
443 v8::internal::CpuProfiler* i_cpu_profiler = 468 v8::internal::CpuProfiler* iprofiler =
444 reinterpret_cast<v8::internal::CpuProfiler*>(cpu_profiler); 469 reinterpret_cast<v8::internal::CpuProfiler*>(profiler_);
445 v8::sampler::Sampler* sampler = i_cpu_profiler->processor()->sampler(); 470 v8::sampler::Sampler* sampler = iprofiler->processor()->sampler();
446 sampler->StartCountingSamples(); 471 sampler->StartCountingSamples();
447 do { 472 do {
448 function->Call(env, env->Global(), argc, argv).ToLocalChecked(); 473 function->Call(context_, context_->Global(), argc, argv).ToLocalChecked();
449 } while (sampler->js_sample_count() < min_js_samples || 474 } while (sampler->js_sample_count() < min_js_samples ||
450 sampler->external_sample_count() < min_external_samples); 475 sampler->external_sample_count() < min_external_samples);
451 476
452 v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name); 477 v8::CpuProfile* profile = profiler_->StopProfiling(profile_name);
453 478
454 CHECK(profile); 479 CHECK(profile);
455 // Dump collected profile to have a better diagnostic in case of failure. 480 // Dump collected profile to have a better diagnostic in case of failure.
456 reinterpret_cast<i::CpuProfile*>(profile)->Print(); 481 reinterpret_cast<i::CpuProfile*>(profile)->Print();
457 482
458 return profile; 483 return profile;
459 } 484 }
460 485
461
462 static const v8::CpuProfileNode* FindChild(v8::Local<v8::Context> context, 486 static const v8::CpuProfileNode* FindChild(v8::Local<v8::Context> context,
463 const v8::CpuProfileNode* node, 487 const v8::CpuProfileNode* node,
464 const char* name) { 488 const char* name) {
465 int count = node->GetChildrenCount(); 489 int count = node->GetChildrenCount();
466 v8::Local<v8::String> name_handle = v8_str(name); 490 v8::Local<v8::String> name_handle = v8_str(name);
467 for (int i = 0; i < count; i++) { 491 for (int i = 0; i < count; i++) {
468 const v8::CpuProfileNode* child = node->GetChild(i); 492 const v8::CpuProfileNode* child = node->GetChild(i);
469 if (name_handle->Equals(context, child->GetFunctionName()).FromJust()) { 493 if (name_handle->Equals(context, child->GetFunctionName()).FromJust()) {
470 return child; 494 return child;
471 } 495 }
(...skipping 28 matching lines...) Expand all
500 static const ProfileNode* GetSimpleBranch(v8::Local<v8::Context> context, 524 static const ProfileNode* GetSimpleBranch(v8::Local<v8::Context> context,
501 v8::CpuProfile* profile, 525 v8::CpuProfile* profile,
502 const char* names[], int length) { 526 const char* names[], int length) {
503 const v8::CpuProfileNode* node = profile->GetTopDownRoot(); 527 const v8::CpuProfileNode* node = profile->GetTopDownRoot();
504 for (int i = 0; i < length; i++) { 528 for (int i = 0; i < length; i++) {
505 node = GetChild(context, node, names[i]); 529 node = GetChild(context, node, names[i]);
506 } 530 }
507 return reinterpret_cast<const ProfileNode*>(node); 531 return reinterpret_cast<const ProfileNode*>(node);
508 } 532 }
509 533
510 static void CallCollectSample(const v8::FunctionCallbackInfo<v8::Value>& info) {
511 info.GetIsolate()->GetCpuProfiler()->CollectSample();
512 }
513
514 static const char* cpu_profiler_test_source = 534 static const char* cpu_profiler_test_source =
515 "%NeverOptimizeFunction(loop);\n" 535 "%NeverOptimizeFunction(loop);\n"
516 "%NeverOptimizeFunction(delay);\n" 536 "%NeverOptimizeFunction(delay);\n"
517 "%NeverOptimizeFunction(bar);\n" 537 "%NeverOptimizeFunction(bar);\n"
518 "%NeverOptimizeFunction(baz);\n" 538 "%NeverOptimizeFunction(baz);\n"
519 "%NeverOptimizeFunction(foo);\n" 539 "%NeverOptimizeFunction(foo);\n"
520 "%NeverOptimizeFunction(start);\n" 540 "%NeverOptimizeFunction(start);\n"
521 "function loop(timeout) {\n" 541 "function loop(timeout) {\n"
522 " this.mmm = 0;\n" 542 " this.mmm = 0;\n"
523 " var start = Date.now();\n" 543 " var start = Date.now();\n"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 i::FLAG_allow_natives_syntax = true; 586 i::FLAG_allow_natives_syntax = true;
567 LocalContext env; 587 LocalContext env;
568 v8::HandleScope scope(env->GetIsolate()); 588 v8::HandleScope scope(env->GetIsolate());
569 589
570 CompileRun(cpu_profiler_test_source); 590 CompileRun(cpu_profiler_test_source);
571 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 591 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
572 592
573 int32_t profiling_interval_ms = 200; 593 int32_t profiling_interval_ms = 200;
574 v8::Local<v8::Value> args[] = { 594 v8::Local<v8::Value> args[] = {
575 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)}; 595 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)};
576 v8::CpuProfile* profile = 596 ProfilerHelper helper(env.local());
577 RunProfiler(env.local(), function, args, arraysize(args), 1000); 597 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 1000);
578 598
579 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 599 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
580 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 600 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
581 const v8::CpuProfileNode* foo_node = GetChild(env.local(), start_node, "foo"); 601 const v8::CpuProfileNode* foo_node = GetChild(env.local(), start_node, "foo");
582 602
583 const char* bar_branch[] = {"bar", "delay", "loop"}; 603 const char* bar_branch[] = {"bar", "delay", "loop"};
584 CheckSimpleBranch(env.local(), foo_node, bar_branch, arraysize(bar_branch)); 604 CheckSimpleBranch(env.local(), foo_node, bar_branch, arraysize(bar_branch));
585 const char* baz_branch[] = {"baz", "delay", "loop"}; 605 const char* baz_branch[] = {"baz", "delay", "loop"};
586 CheckSimpleBranch(env.local(), foo_node, baz_branch, arraysize(baz_branch)); 606 CheckSimpleBranch(env.local(), foo_node, baz_branch, arraysize(baz_branch));
587 const char* delay_branch[] = {"delay", "loop"}; 607 const char* delay_branch[] = {"delay", "loop"};
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 i::FLAG_allow_natives_syntax = true; 643 i::FLAG_allow_natives_syntax = true;
624 LocalContext env; 644 LocalContext env;
625 v8::HandleScope scope(env->GetIsolate()); 645 v8::HandleScope scope(env->GetIsolate());
626 646
627 CompileRun(hot_deopt_no_frame_entry_test_source); 647 CompileRun(hot_deopt_no_frame_entry_test_source);
628 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 648 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
629 649
630 int32_t profiling_interval_ms = 200; 650 int32_t profiling_interval_ms = 200;
631 v8::Local<v8::Value> args[] = { 651 v8::Local<v8::Value> args[] = {
632 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)}; 652 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)};
633 v8::CpuProfile* profile = 653 ProfilerHelper helper(env.local());
634 RunProfiler(env.local(), function, args, arraysize(args), 1000); 654 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 1000);
635 function->Call(env.local(), env->Global(), arraysize(args), args) 655 function->Call(env.local(), env->Global(), arraysize(args), args)
636 .ToLocalChecked(); 656 .ToLocalChecked();
637 657
638 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 658 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
639 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 659 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
640 GetChild(env.local(), start_node, "foo"); 660 GetChild(env.local(), start_node, "foo");
641 661
642 profile->Delete(); 662 profile->Delete();
643 } 663 }
644 664
645 TEST(CollectCpuProfileSamples) { 665 TEST(CollectCpuProfileSamples) {
646 i::FLAG_allow_natives_syntax = true; 666 i::FLAG_allow_natives_syntax = true;
647 LocalContext env; 667 LocalContext env;
648 v8::HandleScope scope(env->GetIsolate()); 668 v8::HandleScope scope(env->GetIsolate());
649 669
650 CompileRun(cpu_profiler_test_source); 670 CompileRun(cpu_profiler_test_source);
651 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 671 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
652 672
653 int32_t profiling_interval_ms = 200; 673 int32_t profiling_interval_ms = 200;
654 v8::Local<v8::Value> args[] = { 674 v8::Local<v8::Value> args[] = {
655 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)}; 675 v8::Integer::New(env->GetIsolate(), profiling_interval_ms)};
676 ProfilerHelper helper(env.local());
656 v8::CpuProfile* profile = 677 v8::CpuProfile* profile =
657 RunProfiler(env.local(), function, args, arraysize(args), 1000, 0, true); 678 helper.Run(function, args, arraysize(args), 1000, 0, true);
658 679
659 CHECK_LE(200, profile->GetSamplesCount()); 680 CHECK_LE(200, profile->GetSamplesCount());
660 uint64_t end_time = profile->GetEndTime(); 681 uint64_t end_time = profile->GetEndTime();
661 uint64_t current_time = profile->GetStartTime(); 682 uint64_t current_time = profile->GetStartTime();
662 CHECK_LE(current_time, end_time); 683 CHECK_LE(current_time, end_time);
663 for (int i = 0; i < profile->GetSamplesCount(); i++) { 684 for (int i = 0; i < profile->GetSamplesCount(); i++) {
664 CHECK(profile->GetSample(i)); 685 CHECK(profile->GetSample(i));
665 uint64_t timestamp = profile->GetSampleTimestamp(i); 686 uint64_t timestamp = profile->GetSampleTimestamp(i);
666 CHECK_LE(current_time, timestamp); 687 CHECK_LE(current_time, timestamp);
667 CHECK_LE(timestamp, end_time); 688 CHECK_LE(timestamp, end_time);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 i::FLAG_allow_natives_syntax = true; 720 i::FLAG_allow_natives_syntax = true;
700 LocalContext env; 721 LocalContext env;
701 v8::HandleScope scope(env->GetIsolate()); 722 v8::HandleScope scope(env->GetIsolate());
702 723
703 CompileRun(cpu_profiler_test_source2); 724 CompileRun(cpu_profiler_test_source2);
704 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 725 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
705 726
706 int32_t duration_ms = 100; 727 int32_t duration_ms = 100;
707 v8::Local<v8::Value> args[] = { 728 v8::Local<v8::Value> args[] = {
708 v8::Integer::New(env->GetIsolate(), duration_ms)}; 729 v8::Integer::New(env->GetIsolate(), duration_ms)};
709 v8::CpuProfile* profile = 730 ProfilerHelper helper(env.local());
710 RunProfiler(env.local(), function, args, arraysize(args), 1000); 731 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 1000);
711 732
712 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 733 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
713 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 734 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
714 const v8::CpuProfileNode* delay_node = 735 const v8::CpuProfileNode* delay_node =
715 GetChild(env.local(), start_node, "delay"); 736 GetChild(env.local(), start_node, "delay");
716 GetChild(env.local(), delay_node, "loop"); 737 GetChild(env.local(), delay_node, "loop");
717 738
718 profile->Delete(); 739 profile->Delete();
719 } 740 }
720 741
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 LocalContext env; 802 LocalContext env;
782 v8::Isolate* isolate = env->GetIsolate(); 803 v8::Isolate* isolate = env->GetIsolate();
783 v8::HandleScope scope(isolate); 804 v8::HandleScope scope(isolate);
784 805
785 v8::Local<v8::FunctionTemplate> func_template = 806 v8::Local<v8::FunctionTemplate> func_template =
786 v8::FunctionTemplate::New(isolate); 807 v8::FunctionTemplate::New(isolate);
787 v8::Local<v8::ObjectTemplate> instance_template = 808 v8::Local<v8::ObjectTemplate> instance_template =
788 func_template->InstanceTemplate(); 809 func_template->InstanceTemplate();
789 810
790 TestApiCallbacks accessors(100); 811 TestApiCallbacks accessors(100);
791 v8::Local<v8::External> data = 812 v8::Local<v8::External> data = v8::External::New(isolate, &accessors);
792 v8::External::New(isolate, &accessors);
793 instance_template->SetAccessor(v8_str("foo"), &TestApiCallbacks::Getter, 813 instance_template->SetAccessor(v8_str("foo"), &TestApiCallbacks::Getter,
794 &TestApiCallbacks::Setter, data); 814 &TestApiCallbacks::Setter, data);
795 v8::Local<v8::Function> func = 815 v8::Local<v8::Function> func =
796 func_template->GetFunction(env.local()).ToLocalChecked(); 816 func_template->GetFunction(env.local()).ToLocalChecked();
797 v8::Local<v8::Object> instance = 817 v8::Local<v8::Object> instance =
798 func->NewInstance(env.local()).ToLocalChecked(); 818 func->NewInstance(env.local()).ToLocalChecked();
799 env->Global()->Set(env.local(), v8_str("instance"), instance).FromJust(); 819 env->Global()->Set(env.local(), v8_str("instance"), instance).FromJust();
800 820
801 CompileRun(native_accessor_test_source); 821 CompileRun(native_accessor_test_source);
802 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 822 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
803 823
824 ProfilerHelper helper(env.local());
804 int32_t repeat_count = 1; 825 int32_t repeat_count = 1;
805 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)}; 826 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)};
806 v8::CpuProfile* profile = 827 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 0, 100);
807 RunProfiler(env.local(), function, args, arraysize(args), 0, 100);
808 828
809 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 829 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
810 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 830 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
811 GetChild(env.local(), start_node, "get foo"); 831 GetChild(env.local(), start_node, "get foo");
812 GetChild(env.local(), start_node, "set foo"); 832 GetChild(env.local(), start_node, "set foo");
813 833
814 profile->Delete(); 834 profile->Delete();
815 } 835 }
816 836
817 837
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 int32_t warm_up_iterations = 3; 869 int32_t warm_up_iterations = 3;
850 v8::Local<v8::Value> args[] = { 870 v8::Local<v8::Value> args[] = {
851 v8::Integer::New(isolate, warm_up_iterations)}; 871 v8::Integer::New(isolate, warm_up_iterations)};
852 function->Call(env.local(), env->Global(), arraysize(args), args) 872 function->Call(env.local(), env->Global(), arraysize(args), args)
853 .ToLocalChecked(); 873 .ToLocalChecked();
854 accessors.set_warming_up(false); 874 accessors.set_warming_up(false);
855 } 875 }
856 876
857 int32_t repeat_count = 100; 877 int32_t repeat_count = 100;
858 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)}; 878 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)};
859 v8::CpuProfile* profile = 879 ProfilerHelper helper(env.local());
860 RunProfiler(env.local(), function, args, arraysize(args), 0, 100); 880 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 0, 100);
861 881
862 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 882 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
863 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 883 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
864 GetChild(env.local(), start_node, "get foo"); 884 GetChild(env.local(), start_node, "get foo");
865 GetChild(env.local(), start_node, "set foo"); 885 GetChild(env.local(), start_node, "set foo");
866 886
867 profile->Delete(); 887 profile->Delete();
868 } 888 }
869 889
870 890
871 static const char* native_method_test_source = "function start(count) {\n" 891 static const char* native_method_test_source = "function start(count) {\n"
872 " for (var i = 0; i < count; i++) {\n" 892 " for (var i = 0; i < count; i++) {\n"
873 " instance.fooMethod();\n" 893 " instance.fooMethod();\n"
874 " }\n" 894 " }\n"
875 "}\n"; 895 "}\n";
876 896
877 897
878 TEST(NativeMethodUninitializedIC) { 898 TEST(NativeMethodUninitializedIC) {
879 LocalContext env; 899 LocalContext env;
880 v8::Isolate* isolate = env->GetIsolate(); 900 v8::Isolate* isolate = env->GetIsolate();
881 v8::HandleScope scope(isolate); 901 v8::HandleScope scope(isolate);
882 902
883 TestApiCallbacks callbacks(100); 903 TestApiCallbacks callbacks(100);
884 v8::Local<v8::External> data = 904 v8::Local<v8::External> data = v8::External::New(isolate, &callbacks);
885 v8::External::New(isolate, &callbacks);
886 905
887 v8::Local<v8::FunctionTemplate> func_template = 906 v8::Local<v8::FunctionTemplate> func_template =
888 v8::FunctionTemplate::New(isolate); 907 v8::FunctionTemplate::New(isolate);
889 func_template->SetClassName(v8_str("Test_InstanceCostructor")); 908 func_template->SetClassName(v8_str("Test_InstanceConstructor"));
890 v8::Local<v8::ObjectTemplate> proto_template = 909 v8::Local<v8::ObjectTemplate> proto_template =
891 func_template->PrototypeTemplate(); 910 func_template->PrototypeTemplate();
892 v8::Local<v8::Signature> signature = 911 v8::Local<v8::Signature> signature =
893 v8::Signature::New(isolate, func_template); 912 v8::Signature::New(isolate, func_template);
894 proto_template->Set( 913 proto_template->Set(
895 v8_str("fooMethod"), 914 v8_str("fooMethod"),
896 v8::FunctionTemplate::New(isolate, &TestApiCallbacks::Callback, data, 915 v8::FunctionTemplate::New(isolate, &TestApiCallbacks::Callback, data,
897 signature, 0)); 916 signature, 0));
898 917
899 v8::Local<v8::Function> func = 918 v8::Local<v8::Function> func =
900 func_template->GetFunction(env.local()).ToLocalChecked(); 919 func_template->GetFunction(env.local()).ToLocalChecked();
901 v8::Local<v8::Object> instance = 920 v8::Local<v8::Object> instance =
902 func->NewInstance(env.local()).ToLocalChecked(); 921 func->NewInstance(env.local()).ToLocalChecked();
903 env->Global()->Set(env.local(), v8_str("instance"), instance).FromJust(); 922 env->Global()->Set(env.local(), v8_str("instance"), instance).FromJust();
904 923
905 CompileRun(native_method_test_source); 924 CompileRun(native_method_test_source);
906 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 925 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
907 926
927 ProfilerHelper helper(env.local());
908 int32_t repeat_count = 1; 928 int32_t repeat_count = 1;
909 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)}; 929 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)};
910 v8::CpuProfile* profile = 930 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 0, 100);
911 RunProfiler(env.local(), function, args, arraysize(args), 0, 100);
912 931
913 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 932 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
914 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 933 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
915 GetChild(env.local(), start_node, "fooMethod"); 934 GetChild(env.local(), start_node, "fooMethod");
916 935
917 profile->Delete(); 936 profile->Delete();
918 } 937 }
919 938
920 939
921 TEST(NativeMethodMonomorphicIC) { 940 TEST(NativeMethodMonomorphicIC) {
(...skipping 30 matching lines...) Expand all
952 // profiling. 971 // profiling.
953 callbacks.set_warming_up(true); 972 callbacks.set_warming_up(true);
954 int32_t warm_up_iterations = 3; 973 int32_t warm_up_iterations = 3;
955 v8::Local<v8::Value> args[] = { 974 v8::Local<v8::Value> args[] = {
956 v8::Integer::New(isolate, warm_up_iterations)}; 975 v8::Integer::New(isolate, warm_up_iterations)};
957 function->Call(env.local(), env->Global(), arraysize(args), args) 976 function->Call(env.local(), env->Global(), arraysize(args), args)
958 .ToLocalChecked(); 977 .ToLocalChecked();
959 callbacks.set_warming_up(false); 978 callbacks.set_warming_up(false);
960 } 979 }
961 980
981 ProfilerHelper helper(env.local());
962 int32_t repeat_count = 100; 982 int32_t repeat_count = 100;
963 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)}; 983 v8::Local<v8::Value> args[] = {v8::Integer::New(isolate, repeat_count)};
964 v8::CpuProfile* profile = 984 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 0, 200);
965 RunProfiler(env.local(), function, args, arraysize(args), 0, 200);
966 985
967 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 986 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
968 GetChild(env.local(), root, "start"); 987 GetChild(env.local(), root, "start");
969 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 988 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
970 GetChild(env.local(), start_node, "fooMethod"); 989 GetChild(env.local(), start_node, "fooMethod");
971 990
972 profile->Delete(); 991 profile->Delete();
973 } 992 }
974 993
975 994
976 static const char* bound_function_test_source = 995 static const char* bound_function_test_source =
977 "function foo() {\n" 996 "function foo() {\n"
978 " startProfiling('my_profile');\n" 997 " startProfiling('my_profile');\n"
979 "}\n" 998 "}\n"
980 "function start() {\n" 999 "function start() {\n"
981 " var callback = foo.bind(this);\n" 1000 " var callback = foo.bind(this);\n"
982 " callback();\n" 1001 " callback();\n"
983 "}"; 1002 "}";
984 1003
985 1004
986 TEST(BoundFunctionCall) { 1005 TEST(BoundFunctionCall) {
987 v8::HandleScope scope(CcTest::isolate()); 1006 v8::HandleScope scope(CcTest::isolate());
988 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1007 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
989 v8::Context::Scope context_scope(env); 1008 v8::Context::Scope context_scope(env);
990 1009
991 CompileRun(bound_function_test_source); 1010 CompileRun(bound_function_test_source);
992 v8::Local<v8::Function> function = GetFunction(env, "start"); 1011 v8::Local<v8::Function> function = GetFunction(env, "start");
993 1012
994 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0); 1013 ProfilerHelper helper(env);
1014 v8::CpuProfile* profile = helper.Run(function, nullptr, 0);
995 1015
996 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1016 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
997 1017
998 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1018 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
999 GetChild(env, start_node, "foo"); 1019 GetChild(env, start_node, "foo");
1000 1020
1001 profile->Delete(); 1021 profile->Delete();
1002 } 1022 }
1003 1023
1004 // This tests checks distribution of the samples through the source lines. 1024 // This tests checks distribution of the samples through the source lines.
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 LocalContext env; 1159 LocalContext env;
1140 v8::HandleScope scope(env->GetIsolate()); 1160 v8::HandleScope scope(env->GetIsolate());
1141 1161
1142 // Collect garbage that might have be generated while installing 1162 // Collect garbage that might have be generated while installing
1143 // extensions. 1163 // extensions.
1144 CcTest::heap()->CollectAllGarbage(); 1164 CcTest::heap()->CollectAllGarbage();
1145 1165
1146 CompileRun(call_function_test_source); 1166 CompileRun(call_function_test_source);
1147 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 1167 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
1148 1168
1169 ProfilerHelper helper(env.local());
1149 int32_t duration_ms = 100; 1170 int32_t duration_ms = 100;
1150 v8::Local<v8::Value> args[] = { 1171 v8::Local<v8::Value> args[] = {
1151 v8::Integer::New(env->GetIsolate(), duration_ms)}; 1172 v8::Integer::New(env->GetIsolate(), duration_ms)};
1152 v8::CpuProfile* profile = 1173 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 1000);
1153 RunProfiler(env.local(), function, args, arraysize(args), 1000);
1154 1174
1155 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1175 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1156 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 1176 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
1157 GetChild(env.local(), start_node, "bar"); 1177 GetChild(env.local(), start_node, "bar");
1158 1178
1159 const v8::CpuProfileNode* unresolved_node = 1179 const v8::CpuProfileNode* unresolved_node =
1160 FindChild(env.local(), root, i::CodeEntry::kUnresolvedFunctionName); 1180 FindChild(env.local(), root, i::CodeEntry::kUnresolvedFunctionName);
1161 CHECK(!unresolved_node || GetChild(env.local(), unresolved_node, "call")); 1181 CHECK(!unresolved_node || GetChild(env.local(), unresolved_node, "call"));
1162 1182
1163 profile->Delete(); 1183 profile->Delete();
(...skipping 28 matching lines...) Expand all
1192 // 2 2 bar [-1] #16 6 1212 // 2 2 bar [-1] #16 6
1193 // 10 10 (program) [-1] #0 2 1213 // 10 10 (program) [-1] #0 2
1194 TEST(FunctionApplySample) { 1214 TEST(FunctionApplySample) {
1195 i::FLAG_allow_natives_syntax = true; 1215 i::FLAG_allow_natives_syntax = true;
1196 LocalContext env; 1216 LocalContext env;
1197 v8::HandleScope scope(env->GetIsolate()); 1217 v8::HandleScope scope(env->GetIsolate());
1198 1218
1199 CompileRun(function_apply_test_source); 1219 CompileRun(function_apply_test_source);
1200 v8::Local<v8::Function> function = GetFunction(env.local(), "start"); 1220 v8::Local<v8::Function> function = GetFunction(env.local(), "start");
1201 1221
1222 ProfilerHelper helper(env.local());
1202 int32_t duration_ms = 100; 1223 int32_t duration_ms = 100;
1203 v8::Local<v8::Value> args[] = { 1224 v8::Local<v8::Value> args[] = {
1204 v8::Integer::New(env->GetIsolate(), duration_ms)}; 1225 v8::Integer::New(env->GetIsolate(), duration_ms)};
1205 1226 v8::CpuProfile* profile = helper.Run(function, args, arraysize(args), 1000);
1206 v8::CpuProfile* profile =
1207 RunProfiler(env.local(), function, args, arraysize(args), 1000);
1208 1227
1209 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1228 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1210 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start"); 1229 const v8::CpuProfileNode* start_node = GetChild(env.local(), root, "start");
1211 const v8::CpuProfileNode* test_node = 1230 const v8::CpuProfileNode* test_node =
1212 GetChild(env.local(), start_node, "test"); 1231 GetChild(env.local(), start_node, "test");
1213 GetChild(env.local(), test_node, "bar"); 1232 GetChild(env.local(), test_node, "bar");
1214 1233
1215 const v8::CpuProfileNode* unresolved_node = 1234 const v8::CpuProfileNode* unresolved_node =
1216 FindChild(env.local(), start_node, CodeEntry::kUnresolvedFunctionName); 1235 FindChild(env.local(), start_node, CodeEntry::kUnresolvedFunctionName);
1217 CHECK(!unresolved_node || GetChild(env.local(), unresolved_node, "apply")); 1236 CHECK(!unresolved_node || GetChild(env.local(), unresolved_node, "apply"));
(...skipping 20 matching lines...) Expand all
1238 // 2 (program) 0 #2 1257 // 2 (program) 0 #2
1239 // 0 start 21 #3 no reason 1258 // 0 start 21 #3 no reason
1240 // 0 foo 21 #4 no reason 1259 // 0 foo 21 #4 no reason
1241 // 0 foo 21 #5 no reason 1260 // 0 foo 21 #5 no reason
1242 // .... 1261 // ....
1243 // 0 foo 21 #254 no reason 1262 // 0 foo 21 #254 no reason
1244 TEST(CpuProfileDeepStack) { 1263 TEST(CpuProfileDeepStack) {
1245 v8::HandleScope scope(CcTest::isolate()); 1264 v8::HandleScope scope(CcTest::isolate());
1246 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1265 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1247 v8::Context::Scope context_scope(env); 1266 v8::Context::Scope context_scope(env);
1267 ProfilerHelper helper(env);
1248 1268
1249 CompileRun(cpu_profiler_deep_stack_test_source); 1269 CompileRun(cpu_profiler_deep_stack_test_source);
1250 v8::Local<v8::Function> function = GetFunction(env, "start"); 1270 v8::Local<v8::Function> function = GetFunction(env, "start");
1251 1271
1252 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
1253 v8::Local<v8::String> profile_name = v8_str("my_profile"); 1272 v8::Local<v8::String> profile_name = v8_str("my_profile");
1254 function->Call(env, env->Global(), 0, NULL).ToLocalChecked(); 1273 function->Call(env, env->Global(), 0, NULL).ToLocalChecked();
1255 v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name); 1274 v8::CpuProfile* profile = helper.profiler()->StopProfiling(profile_name);
1256 CHECK(profile); 1275 CHECK(profile);
1257 // Dump collected profile to have a better diagnostic in case of failure. 1276 // Dump collected profile to have a better diagnostic in case of failure.
1258 reinterpret_cast<i::CpuProfile*>(profile)->Print(); 1277 reinterpret_cast<i::CpuProfile*>(profile)->Print();
1259 1278
1260 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1279 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1261 const v8::CpuProfileNode* node = GetChild(env, root, "start"); 1280 const v8::CpuProfileNode* node = GetChild(env, root, "start");
1262 for (int i = 0; i <= 250; ++i) { 1281 for (int i = 0; i <= 250; ++i) {
1263 node = GetChild(env, node, "foo"); 1282 node = GetChild(env, node, "foo");
1264 } 1283 }
1265 CHECK(!FindChild(env, node, "foo")); 1284 CHECK(!FindChild(env, node, "foo"));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 v8::Local<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New( 1326 v8::Local<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(
1308 env->GetIsolate(), CallJsFunction); 1327 env->GetIsolate(), CallJsFunction);
1309 v8::Local<v8::Function> func = 1328 v8::Local<v8::Function> func =
1310 func_template->GetFunction(env).ToLocalChecked(); 1329 func_template->GetFunction(env).ToLocalChecked();
1311 func->SetName(v8_str("CallJsFunction")); 1330 func->SetName(v8_str("CallJsFunction"));
1312 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust(); 1331 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust();
1313 1332
1314 CompileRun(js_native_js_test_source); 1333 CompileRun(js_native_js_test_source);
1315 v8::Local<v8::Function> function = GetFunction(env, "start"); 1334 v8::Local<v8::Function> function = GetFunction(env, "start");
1316 1335
1317 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 1000); 1336 ProfilerHelper helper(env);
1337 v8::CpuProfile* profile = helper.Run(function, nullptr, 0, 1000);
1318 1338
1319 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1339 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1320 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1340 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1321 const v8::CpuProfileNode* native_node = 1341 const v8::CpuProfileNode* native_node =
1322 GetChild(env, start_node, "CallJsFunction"); 1342 GetChild(env, start_node, "CallJsFunction");
1323 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar"); 1343 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar");
1324 GetChild(env, bar_node, "foo"); 1344 GetChild(env, bar_node, "foo");
1325 1345
1326 profile->Delete(); 1346 profile->Delete();
1327 } 1347 }
(...skipping 29 matching lines...) Expand all
1357 v8::Context::Scope context_scope(env); 1377 v8::Context::Scope context_scope(env);
1358 1378
1359 v8::Local<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New( 1379 v8::Local<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(
1360 env->GetIsolate(), CallJsFunction); 1380 env->GetIsolate(), CallJsFunction);
1361 v8::Local<v8::Function> func = 1381 v8::Local<v8::Function> func =
1362 func_template->GetFunction(env).ToLocalChecked(); 1382 func_template->GetFunction(env).ToLocalChecked();
1363 func->SetName(v8_str("CallJsFunction")); 1383 func->SetName(v8_str("CallJsFunction"));
1364 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust(); 1384 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust();
1365 1385
1366 CompileRun(js_native_js_runtime_js_test_source); 1386 CompileRun(js_native_js_runtime_js_test_source);
1387 ProfilerHelper helper(env);
1367 v8::Local<v8::Function> function = GetFunction(env, "start"); 1388 v8::Local<v8::Function> function = GetFunction(env, "start");
1368 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 1000); 1389 v8::CpuProfile* profile = helper.Run(function, nullptr, 0, 1000);
1369 1390
1370 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1391 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1371 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1392 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1372 const v8::CpuProfileNode* native_node = 1393 const v8::CpuProfileNode* native_node =
1373 GetChild(env, start_node, "CallJsFunction"); 1394 GetChild(env, start_node, "CallJsFunction");
1374 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar"); 1395 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar");
1375 GetChild(env, bar_node, "foo"); 1396 GetChild(env, bar_node, "foo");
1376 1397
1377 profile->Delete(); 1398 profile->Delete();
1378 } 1399 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 env->Global()->Set(env, v8_str("CallJsFunction1"), func1).FromJust(); 1441 env->Global()->Set(env, v8_str("CallJsFunction1"), func1).FromJust();
1421 1442
1422 v8::Local<v8::Function> func2 = 1443 v8::Local<v8::Function> func2 =
1423 v8::FunctionTemplate::New(env->GetIsolate(), CallJsFunction2) 1444 v8::FunctionTemplate::New(env->GetIsolate(), CallJsFunction2)
1424 ->GetFunction(env) 1445 ->GetFunction(env)
1425 .ToLocalChecked(); 1446 .ToLocalChecked();
1426 func2->SetName(v8_str("CallJsFunction2")); 1447 func2->SetName(v8_str("CallJsFunction2"));
1427 env->Global()->Set(env, v8_str("CallJsFunction2"), func2).FromJust(); 1448 env->Global()->Set(env, v8_str("CallJsFunction2"), func2).FromJust();
1428 1449
1429 CompileRun(js_native1_js_native2_js_test_source); 1450 CompileRun(js_native1_js_native2_js_test_source);
1451
1452 ProfilerHelper helper(env);
1430 v8::Local<v8::Function> function = GetFunction(env, "start"); 1453 v8::Local<v8::Function> function = GetFunction(env, "start");
1431 1454 v8::CpuProfile* profile = helper.Run(function, nullptr, 0, 1000);
1432 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 1000);
1433 1455
1434 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1456 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1435 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1457 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1436 const v8::CpuProfileNode* native_node1 = 1458 const v8::CpuProfileNode* native_node1 =
1437 GetChild(env, start_node, "CallJsFunction1"); 1459 GetChild(env, start_node, "CallJsFunction1");
1438 const v8::CpuProfileNode* bar_node = GetChild(env, native_node1, "bar"); 1460 const v8::CpuProfileNode* bar_node = GetChild(env, native_node1, "bar");
1439 const v8::CpuProfileNode* native_node2 = 1461 const v8::CpuProfileNode* native_node2 =
1440 GetChild(env, bar_node, "CallJsFunction2"); 1462 GetChild(env, bar_node, "CallJsFunction2");
1441 GetChild(env, native_node2, "foo"); 1463 GetChild(env, native_node2, "foo");
1442 1464
1443 profile->Delete(); 1465 profile->Delete();
1444 } 1466 }
1445 1467
1446 static const char* js_force_collect_sample_source = 1468 static const char* js_force_collect_sample_source =
1447 "function start() {\n" 1469 "function start() {\n"
1448 " CallCollectSample();\n" 1470 " CallCollectSample();\n"
1449 "}"; 1471 "}";
1450 1472
1473 static void CallCollectSample(const v8::FunctionCallbackInfo<v8::Value>& info) {
1474 i::ProfilerExtension::profiler()->CollectSample();
1475 }
1476
1451 TEST(CollectSampleAPI) { 1477 TEST(CollectSampleAPI) {
1452 v8::HandleScope scope(CcTest::isolate()); 1478 v8::HandleScope scope(CcTest::isolate());
1453 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1479 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1454 v8::Context::Scope context_scope(env); 1480 v8::Context::Scope context_scope(env);
1455 1481
1456 v8::Local<v8::FunctionTemplate> func_template = 1482 v8::Local<v8::FunctionTemplate> func_template =
1457 v8::FunctionTemplate::New(env->GetIsolate(), CallCollectSample); 1483 v8::FunctionTemplate::New(env->GetIsolate(), CallCollectSample);
1458 v8::Local<v8::Function> func = 1484 v8::Local<v8::Function> func =
1459 func_template->GetFunction(env).ToLocalChecked(); 1485 func_template->GetFunction(env).ToLocalChecked();
1460 func->SetName(v8_str("CallCollectSample")); 1486 func->SetName(v8_str("CallCollectSample"));
1461 env->Global()->Set(env, v8_str("CallCollectSample"), func).FromJust(); 1487 env->Global()->Set(env, v8_str("CallCollectSample"), func).FromJust();
1462 1488
1463 CompileRun(js_force_collect_sample_source); 1489 CompileRun(js_force_collect_sample_source);
1490 ProfilerHelper helper(env);
1464 v8::Local<v8::Function> function = GetFunction(env, "start"); 1491 v8::Local<v8::Function> function = GetFunction(env, "start");
1465 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0); 1492 v8::CpuProfile* profile = helper.Run(function, nullptr, 0, 0);
1466 1493
1467 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1494 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1468 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1495 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1469 CHECK_LE(1, start_node->GetChildrenCount()); 1496 CHECK_LE(1, start_node->GetChildrenCount());
1470 GetChild(env, start_node, "CallCollectSample"); 1497 GetChild(env, start_node, "CallCollectSample");
1471 1498
1472 profile->Delete(); 1499 profile->Delete();
1473 } 1500 }
1474 1501
1475 static const char* js_native_js_runtime_multiple_test_source = 1502 static const char* js_native_js_runtime_multiple_test_source =
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1507 v8::Context::Scope context_scope(env); 1534 v8::Context::Scope context_scope(env);
1508 1535
1509 v8::Local<v8::FunctionTemplate> func_template = 1536 v8::Local<v8::FunctionTemplate> func_template =
1510 v8::FunctionTemplate::New(env->GetIsolate(), CallJsFunction); 1537 v8::FunctionTemplate::New(env->GetIsolate(), CallJsFunction);
1511 v8::Local<v8::Function> func = 1538 v8::Local<v8::Function> func =
1512 func_template->GetFunction(env).ToLocalChecked(); 1539 func_template->GetFunction(env).ToLocalChecked();
1513 func->SetName(v8_str("CallJsFunction")); 1540 func->SetName(v8_str("CallJsFunction"));
1514 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust(); 1541 env->Global()->Set(env, v8_str("CallJsFunction"), func).FromJust();
1515 1542
1516 CompileRun(js_native_js_runtime_multiple_test_source); 1543 CompileRun(js_native_js_runtime_multiple_test_source);
1544
1545 ProfilerHelper helper(env);
1517 v8::Local<v8::Function> function = GetFunction(env, "start"); 1546 v8::Local<v8::Function> function = GetFunction(env, "start");
1518 1547 v8::CpuProfile* profile = helper.Run(function, nullptr, 0, 500, 500);
1519 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 500, 500);
1520 1548
1521 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1549 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1522 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1550 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1523 const v8::CpuProfileNode* native_node = 1551 const v8::CpuProfileNode* native_node =
1524 GetChild(env, start_node, "CallJsFunction"); 1552 GetChild(env, start_node, "CallJsFunction");
1525 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar"); 1553 const v8::CpuProfileNode* bar_node = GetChild(env, native_node, "bar");
1526 GetChild(env, bar_node, "foo"); 1554 GetChild(env, bar_node, "foo");
1527 1555
1528 profile->Delete(); 1556 profile->Delete();
1529 } 1557 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 // level1 #0 4 1589 // level1 #0 4
1562 // level2 #16 5 1590 // level2 #16 5
1563 // level3 #16 6 1591 // level3 #16 6
1564 // action #16 7 1592 // action #16 7
1565 // (program) #0 2 1593 // (program) #0 2
1566 TEST(Inlining) { 1594 TEST(Inlining) {
1567 i::FLAG_allow_natives_syntax = true; 1595 i::FLAG_allow_natives_syntax = true;
1568 v8::HandleScope scope(CcTest::isolate()); 1596 v8::HandleScope scope(CcTest::isolate());
1569 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1597 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1570 v8::Context::Scope context_scope(env); 1598 v8::Context::Scope context_scope(env);
1599 ProfilerHelper helper(env);
1571 1600
1572 CompileRun(inlining_test_source); 1601 CompileRun(inlining_test_source);
1573 v8::Local<v8::Function> function = GetFunction(env, "start"); 1602 v8::Local<v8::Function> function = GetFunction(env, "start");
1574 1603
1575 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
1576 v8::Local<v8::String> profile_name = v8_str("my_profile"); 1604 v8::Local<v8::String> profile_name = v8_str("my_profile");
1577 function->Call(env, env->Global(), 0, NULL).ToLocalChecked(); 1605 function->Call(env, env->Global(), 0, NULL).ToLocalChecked();
1578 v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name); 1606 v8::CpuProfile* profile = helper.profiler()->StopProfiling(profile_name);
1579 CHECK(profile); 1607 CHECK(profile);
1580 // Dump collected profile to have a better diagnostic in case of failure. 1608 // Dump collected profile to have a better diagnostic in case of failure.
1581 reinterpret_cast<i::CpuProfile*>(profile)->Print(); 1609 reinterpret_cast<i::CpuProfile*>(profile)->Print();
1582 1610
1583 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1611 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1584 const v8::CpuProfileNode* start_node = GetChild(env, root, "start"); 1612 const v8::CpuProfileNode* start_node = GetChild(env, root, "start");
1585 const v8::CpuProfileNode* level1_node = GetChild(env, start_node, "level1"); 1613 const v8::CpuProfileNode* level1_node = GetChild(env, start_node, "level1");
1586 const v8::CpuProfileNode* level2_node = GetChild(env, level1_node, "level2"); 1614 const v8::CpuProfileNode* level2_node = GetChild(env, level1_node, "level2");
1587 const v8::CpuProfileNode* level3_node = GetChild(env, level2_node, "level3"); 1615 const v8::CpuProfileNode* level3_node = GetChild(env, level2_node, "level3");
1588 GetChild(env, level3_node, "action"); 1616 GetChild(env, level3_node, "action");
1589 1617
1590 profile->Delete(); 1618 profile->Delete();
1591 } 1619 }
1592 1620
1593 // [Top down]: 1621 // [Top down]:
1594 // 0 (root) #0 1 1622 // 0 (root) #0 1
1595 // 2 (program) #0 2 1623 // 2 (program) #0 2
1596 // 3 (idle) #0 3 1624 // 3 (idle) #0 3
1597 TEST(IdleTime) { 1625 TEST(IdleTime) {
1598 LocalContext env; 1626 LocalContext env;
1599 v8::HandleScope scope(env->GetIsolate()); 1627 v8::HandleScope scope(env->GetIsolate());
1600 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); 1628 v8::CpuProfiler* cpu_profiler = v8::CpuProfiler::New(env->GetIsolate());
1601 1629
1602 v8::Local<v8::String> profile_name = v8_str("my_profile"); 1630 v8::Local<v8::String> profile_name = v8_str("my_profile");
1603 cpu_profiler->StartProfiling(profile_name); 1631 cpu_profiler->StartProfiling(profile_name);
1604 1632
1605 i::Isolate* isolate = CcTest::i_isolate(); 1633 i::Isolate* isolate = CcTest::i_isolate();
1606 i::ProfilerEventsProcessor* processor = isolate->cpu_profiler()->processor(); 1634 i::ProfilerEventsProcessor* processor =
1635 reinterpret_cast<i::CpuProfiler*>(cpu_profiler)->processor();
1607 1636
1608 processor->AddCurrentStack(isolate, true); 1637 processor->AddCurrentStack(isolate, true);
1609 cpu_profiler->SetIdle(true); 1638 cpu_profiler->SetIdle(true);
1610 for (int i = 0; i < 3; i++) { 1639 for (int i = 0; i < 3; i++) {
1611 processor->AddCurrentStack(isolate, true); 1640 processor->AddCurrentStack(isolate, true);
1612 } 1641 }
1613 cpu_profiler->SetIdle(false); 1642 cpu_profiler->SetIdle(false);
1614 processor->AddCurrentStack(isolate, true); 1643 processor->AddCurrentStack(isolate, true);
1615 1644
1616 v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name); 1645 v8::CpuProfile* profile = cpu_profiler->StopProfiling(profile_name);
1617 CHECK(profile); 1646 CHECK(profile);
1618 // Dump collected profile to have a better diagnostic in case of failure. 1647 // Dump collected profile to have a better diagnostic in case of failure.
1619 reinterpret_cast<i::CpuProfile*>(profile)->Print(); 1648 reinterpret_cast<i::CpuProfile*>(profile)->Print();
1620 1649
1621 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1650 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1622 const v8::CpuProfileNode* program_node = 1651 const v8::CpuProfileNode* program_node =
1623 GetChild(env.local(), root, CodeEntry::kProgramEntryName); 1652 GetChild(env.local(), root, CodeEntry::kProgramEntryName);
1624 CHECK_EQ(0, program_node->GetChildrenCount()); 1653 CHECK_EQ(0, program_node->GetChildrenCount());
1625 CHECK_GE(program_node->GetHitCount(), 2u); 1654 CHECK_GE(program_node->GetHitCount(), 2u);
1626 1655
1627 const v8::CpuProfileNode* idle_node = 1656 const v8::CpuProfileNode* idle_node =
1628 GetChild(env.local(), root, CodeEntry::kIdleEntryName); 1657 GetChild(env.local(), root, CodeEntry::kIdleEntryName);
1629 CHECK_EQ(0, idle_node->GetChildrenCount()); 1658 CHECK_EQ(0, idle_node->GetChildrenCount());
1630 CHECK_GE(idle_node->GetHitCount(), 3u); 1659 CHECK_GE(idle_node->GetHitCount(), 3u);
1631 1660
1632 profile->Delete(); 1661 profile->Delete();
1662 cpu_profiler->Dispose();
1633 } 1663 }
1634 1664
1635 static void CheckFunctionDetails(v8::Isolate* isolate, 1665 static void CheckFunctionDetails(v8::Isolate* isolate,
1636 const v8::CpuProfileNode* node, 1666 const v8::CpuProfileNode* node,
1637 const char* name, const char* script_name, 1667 const char* name, const char* script_name,
1638 int script_id, int line, int column) { 1668 int script_id, int line, int column) {
1639 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 1669 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1640 CHECK(v8_str(name)->Equals(context, node->GetFunctionName()).FromJust()); 1670 CHECK(v8_str(name)->Equals(context, node->GetFunctionName()).FromJust());
1641 CHECK(v8_str(script_name) 1671 CHECK(v8_str(script_name)
1642 ->Equals(context, node->GetScriptResourceName()) 1672 ->Equals(context, node->GetScriptResourceName())
1643 .FromJust()); 1673 .FromJust());
1644 CHECK_EQ(script_id, node->GetScriptId()); 1674 CHECK_EQ(script_id, node->GetScriptId());
1645 CHECK_EQ(line, node->GetLineNumber()); 1675 CHECK_EQ(line, node->GetLineNumber());
1646 CHECK_EQ(column, node->GetColumnNumber()); 1676 CHECK_EQ(column, node->GetColumnNumber());
1647 } 1677 }
1648 1678
1649 1679
1650 TEST(FunctionDetails) { 1680 TEST(FunctionDetails) {
1651 i::FLAG_allow_natives_syntax = true; 1681 i::FLAG_allow_natives_syntax = true;
1652 v8::HandleScope scope(CcTest::isolate()); 1682 v8::HandleScope scope(CcTest::isolate());
1653 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1683 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1654 v8::Context::Scope context_scope(env); 1684 v8::Context::Scope context_scope(env);
1685 ProfilerHelper helper(env);
1655 1686
1656 v8::Local<v8::Script> script_a = CompileWithOrigin( 1687 v8::Local<v8::Script> script_a = CompileWithOrigin(
1657 "%NeverOptimizeFunction(foo);\n" 1688 "%NeverOptimizeFunction(foo);\n"
1658 "%NeverOptimizeFunction(bar);\n" 1689 "%NeverOptimizeFunction(bar);\n"
1659 " function foo\n() { bar(); }\n" 1690 " function foo\n() { bar(); }\n"
1660 " function bar() { startProfiling(); }\n", 1691 " function bar() { startProfiling(); }\n",
1661 "script_a"); 1692 "script_a");
1662 script_a->Run(env).ToLocalChecked(); 1693 script_a->Run(env).ToLocalChecked();
1663 v8::Local<v8::Script> script_b = CompileWithOrigin( 1694 v8::Local<v8::Script> script_b = CompileWithOrigin(
1664 "%NeverOptimizeFunction(baz);" 1695 "%NeverOptimizeFunction(baz);"
(...skipping 26 matching lines...) Expand all
1691 CheckFunctionDetails(env->GetIsolate(), bar, "bar", "script_a", 1722 CheckFunctionDetails(env->GetIsolate(), bar, "bar", "script_a",
1692 script_a->GetUnboundScript()->GetId(), 5, 14); 1723 script_a->GetUnboundScript()->GetId(), 5, 14);
1693 } 1724 }
1694 1725
1695 1726
1696 TEST(DontStopOnFinishedProfileDelete) { 1727 TEST(DontStopOnFinishedProfileDelete) {
1697 v8::HandleScope scope(CcTest::isolate()); 1728 v8::HandleScope scope(CcTest::isolate());
1698 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1729 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1699 v8::Context::Scope context_scope(env); 1730 v8::Context::Scope context_scope(env);
1700 1731
1701 v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler(); 1732 v8::CpuProfiler* profiler = v8::CpuProfiler::New(env->GetIsolate());
1702 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 1733 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler);
1703 1734
1704 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1735 CHECK_EQ(0, iprofiler->GetProfilesCount());
1705 v8::Local<v8::String> outer = v8_str("outer"); 1736 v8::Local<v8::String> outer = v8_str("outer");
1706 profiler->StartProfiling(outer); 1737 profiler->StartProfiling(outer);
1707 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1738 CHECK_EQ(0, iprofiler->GetProfilesCount());
1708 1739
1709 v8::Local<v8::String> inner = v8_str("inner"); 1740 v8::Local<v8::String> inner = v8_str("inner");
1710 profiler->StartProfiling(inner); 1741 profiler->StartProfiling(inner);
1711 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1742 CHECK_EQ(0, iprofiler->GetProfilesCount());
1712 1743
1713 v8::CpuProfile* inner_profile = profiler->StopProfiling(inner); 1744 v8::CpuProfile* inner_profile = profiler->StopProfiling(inner);
1714 CHECK(inner_profile); 1745 CHECK(inner_profile);
1715 CHECK_EQ(1, iprofiler->GetProfilesCount()); 1746 CHECK_EQ(1, iprofiler->GetProfilesCount());
1716 inner_profile->Delete(); 1747 inner_profile->Delete();
1717 inner_profile = NULL; 1748 inner_profile = NULL;
1718 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1749 CHECK_EQ(0, iprofiler->GetProfilesCount());
1719 1750
1720 v8::CpuProfile* outer_profile = profiler->StopProfiling(outer); 1751 v8::CpuProfile* outer_profile = profiler->StopProfiling(outer);
1721 CHECK(outer_profile); 1752 CHECK(outer_profile);
1722 CHECK_EQ(1, iprofiler->GetProfilesCount()); 1753 CHECK_EQ(1, iprofiler->GetProfilesCount());
1723 outer_profile->Delete(); 1754 outer_profile->Delete();
1724 outer_profile = NULL; 1755 outer_profile = NULL;
1725 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1756 CHECK_EQ(0, iprofiler->GetProfilesCount());
1757 profiler->Dispose();
1726 } 1758 }
1727 1759
1728 1760
1729 const char* GetBranchDeoptReason(v8::Local<v8::Context> context, 1761 const char* GetBranchDeoptReason(v8::Local<v8::Context> context,
1730 i::CpuProfile* iprofile, const char* branch[], 1762 i::CpuProfile* iprofile, const char* branch[],
1731 int length) { 1763 int length) {
1732 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); 1764 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile);
1733 const ProfileNode* iopt_function = NULL; 1765 const ProfileNode* iopt_function = NULL;
1734 iopt_function = GetSimpleBranch(context, profile, branch, length); 1766 iopt_function = GetSimpleBranch(context, profile, branch, length);
1735 CHECK_EQ(1U, iopt_function->deopt_infos().size()); 1767 CHECK_EQ(1U, iopt_function->deopt_infos().size());
1736 return iopt_function->deopt_infos()[0].deopt_reason; 1768 return iopt_function->deopt_infos()[0].deopt_reason;
1737 } 1769 }
1738 1770
1739 1771
1740 // deopt at top function 1772 // deopt at top function
1741 TEST(CollectDeoptEvents) { 1773 TEST(CollectDeoptEvents) {
1742 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; 1774 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
1743 i::FLAG_allow_natives_syntax = true; 1775 i::FLAG_allow_natives_syntax = true;
1744 v8::HandleScope scope(CcTest::isolate()); 1776 v8::HandleScope scope(CcTest::isolate());
1745 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1777 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1746 v8::Context::Scope context_scope(env); 1778 v8::Context::Scope context_scope(env);
1747 v8::Isolate* isolate = env->GetIsolate(); 1779 ProfilerHelper helper(env);
1748 v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); 1780 i::CpuProfiler* iprofiler =
1749 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 1781 reinterpret_cast<i::CpuProfiler*>(helper.profiler());
1750 1782
1751 const char opt_source[] = 1783 const char opt_source[] =
1752 "function opt_function%d(value, depth) {\n" 1784 "function opt_function%d(value, depth) {\n"
1753 " if (depth) return opt_function%d(value, depth - 1);\n" 1785 " if (depth) return opt_function%d(value, depth - 1);\n"
1754 "\n" 1786 "\n"
1755 " return 10 / value;\n" 1787 " return 10 / value;\n"
1756 "}\n" 1788 "}\n"
1757 "\n"; 1789 "\n";
1758 1790
1759 for (int i = 0; i < 3; ++i) { 1791 for (int i = 0; i < 3; ++i) {
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 // 0.........1.........2.........3.........4....*....5.........6......*..7 1899 // 0.........1.........2.........3.........4....*....5.........6......*..7
1868 1900
1869 1901
1870 // deopt at the first level inlined function 1902 // deopt at the first level inlined function
1871 TEST(DeoptAtFirstLevelInlinedSource) { 1903 TEST(DeoptAtFirstLevelInlinedSource) {
1872 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; 1904 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
1873 i::FLAG_allow_natives_syntax = true; 1905 i::FLAG_allow_natives_syntax = true;
1874 v8::HandleScope scope(CcTest::isolate()); 1906 v8::HandleScope scope(CcTest::isolate());
1875 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1907 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1876 v8::Context::Scope context_scope(env); 1908 v8::Context::Scope context_scope(env);
1877 v8::Isolate* isolate = env->GetIsolate(); 1909 ProfilerHelper helper(env);
1878 v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); 1910 i::CpuProfiler* iprofiler =
1879 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 1911 reinterpret_cast<i::CpuProfiler*>(helper.profiler());
1880 1912
1881 // 0.........1.........2.........3.........4.........5.........6.........7 1913 // 0.........1.........2.........3.........4.........5.........6.........7
1882 const char* source = 1914 const char* source =
1883 "function test(left, right) { return opt_function(left, right); }\n" 1915 "function test(left, right) { return opt_function(left, right); }\n"
1884 "\n" 1916 "\n"
1885 "startProfiling();\n" 1917 "startProfiling();\n"
1886 "\n" 1918 "\n"
1887 "test(10, 10);\n" 1919 "test(10, 10);\n"
1888 "\n" 1920 "\n"
1889 "%OptimizeFunctionOnNextCall(test)\n" 1921 "%OptimizeFunctionOnNextCall(test)\n"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1936 } 1968 }
1937 1969
1938 1970
1939 // deopt at the second level inlined function 1971 // deopt at the second level inlined function
1940 TEST(DeoptAtSecondLevelInlinedSource) { 1972 TEST(DeoptAtSecondLevelInlinedSource) {
1941 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; 1973 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
1942 i::FLAG_allow_natives_syntax = true; 1974 i::FLAG_allow_natives_syntax = true;
1943 v8::HandleScope scope(CcTest::isolate()); 1975 v8::HandleScope scope(CcTest::isolate());
1944 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1976 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1945 v8::Context::Scope context_scope(env); 1977 v8::Context::Scope context_scope(env);
1946 v8::Isolate* isolate = env->GetIsolate(); 1978 ProfilerHelper helper(env);
1947 v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); 1979 i::CpuProfiler* iprofiler =
1948 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 1980 reinterpret_cast<i::CpuProfiler*>(helper.profiler());
1949 1981
1950 // 0.........1.........2.........3.........4.........5.........6.........7 1982 // 0.........1.........2.........3.........4.........5.........6.........7
1951 const char* source = 1983 const char* source =
1952 "function test2(left, right) { return opt_function(left, right); }\n" 1984 "function test2(left, right) { return opt_function(left, right); }\n"
1953 "function test1(left, right) { return test2(left, right); }\n" 1985 "function test1(left, right) { return test2(left, right); }\n"
1954 "\n" 1986 "\n"
1955 "startProfiling();\n" 1987 "startProfiling();\n"
1956 "\n" 1988 "\n"
1957 "test1(10, 10);\n" 1989 "test1(10, 10);\n"
1958 "\n" 1990 "\n"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2010 } 2042 }
2011 2043
2012 2044
2013 // deopt in untracked function 2045 // deopt in untracked function
2014 TEST(DeoptUntrackedFunction) { 2046 TEST(DeoptUntrackedFunction) {
2015 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; 2047 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2016 i::FLAG_allow_natives_syntax = true; 2048 i::FLAG_allow_natives_syntax = true;
2017 v8::HandleScope scope(CcTest::isolate()); 2049 v8::HandleScope scope(CcTest::isolate());
2018 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 2050 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
2019 v8::Context::Scope context_scope(env); 2051 v8::Context::Scope context_scope(env);
2020 v8::Isolate* isolate = env->GetIsolate(); 2052 ProfilerHelper helper(env);
2021 v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); 2053 i::CpuProfiler* iprofiler =
2022 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 2054 reinterpret_cast<i::CpuProfiler*>(helper.profiler());
2023 2055
2024 // 0.........1.........2.........3.........4.........5.........6.........7 2056 // 0.........1.........2.........3.........4.........5.........6.........7
2025 const char* source = 2057 const char* source =
2026 "function test(left, right) { return opt_function(left, right); }\n" 2058 "function test(left, right) { return opt_function(left, right); }\n"
2027 "\n" 2059 "\n"
2028 "test(10, 10);\n" 2060 "test(10, 10);\n"
2029 "\n" 2061 "\n"
2030 "%OptimizeFunctionOnNextCall(test)\n" 2062 "%OptimizeFunctionOnNextCall(test)\n"
2031 "\n" 2063 "\n"
2032 "test(10, 10);\n" 2064 "test(10, 10);\n"
(...skipping 15 matching lines...) Expand all
2048 iprofile->Print(); 2080 iprofile->Print();
2049 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); 2081 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile);
2050 2082
2051 const char* branch[] = {"", "test"}; 2083 const char* branch[] = {"", "test"};
2052 const ProfileNode* itest_node = 2084 const ProfileNode* itest_node =
2053 GetSimpleBranch(env, profile, branch, arraysize(branch)); 2085 GetSimpleBranch(env, profile, branch, arraysize(branch));
2054 CHECK_EQ(0U, itest_node->deopt_infos().size()); 2086 CHECK_EQ(0U, itest_node->deopt_infos().size());
2055 2087
2056 iprofiler->DeleteProfile(iprofile); 2088 iprofiler->DeleteProfile(iprofile);
2057 } 2089 }
OLDNEW
« no previous file with comments | « test/cctest/test-api.cc ('k') | test/cctest/test-profile-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698