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

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

Issue 978203002: CpuProfiler: simplify test. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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 | « no previous file | no next file » | 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 using i::SmartPointer; 49 using i::SmartPointer;
50 using i::Vector; 50 using i::Vector;
51 51
52 52
53 // Helper methods 53 // Helper methods
54 static v8::Local<v8::Function> GetFunction(v8::Context* env, const char* name) { 54 static v8::Local<v8::Function> GetFunction(v8::Context* env, const char* name) {
55 return v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str(name))); 55 return v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str(name)));
56 } 56 }
57 57
58 58
59 static const char* reason(const i::Deoptimizer::DeoptReason reason) {
yurys 2015/03/05 09:56:07 style nit: GetReason but I'd rather you kept it in
loislo 2015/03/05 10:04:46 I don't see that it becomes less readable. Also th
60 return i::Deoptimizer::GetDeoptReason(reason);
61 }
62
63
59 TEST(StartStop) { 64 TEST(StartStop) {
60 i::Isolate* isolate = CcTest::i_isolate(); 65 i::Isolate* isolate = CcTest::i_isolate();
61 CpuProfilesCollection profiles(isolate->heap()); 66 CpuProfilesCollection profiles(isolate->heap());
62 ProfileGenerator generator(&profiles); 67 ProfileGenerator generator(&profiles);
63 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor( 68 SmartPointer<ProfilerEventsProcessor> processor(new ProfilerEventsProcessor(
64 &generator, NULL, v8::base::TimeDelta::FromMicroseconds(100))); 69 &generator, NULL, v8::base::TimeDelta::FromMicroseconds(100)));
65 processor->Start(); 70 processor->Start();
66 processor->StopSynchronously(); 71 processor->StopSynchronously();
67 } 72 }
68 73
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 CHECK(ContainsString(name, names)); 453 CHECK(ContainsString(name, names));
449 // Check that there are no duplicates. 454 // Check that there are no duplicates.
450 for (int j = 0; j < count; j++) { 455 for (int j = 0; j < count; j++) {
451 if (j == i) continue; 456 if (j == i) continue;
452 CHECK(!name->Equals(node->GetChild(j)->GetFunctionName())); 457 CHECK(!name->Equals(node->GetChild(j)->GetFunctionName()));
453 } 458 }
454 } 459 }
455 } 460 }
456 461
457 462
458 static const v8::CpuProfileNode* FindChild(v8::Isolate* isolate, 463 static const v8::CpuProfileNode* FindChild(const v8::CpuProfileNode* node,
459 const v8::CpuProfileNode* node,
460 const char* name) { 464 const char* name) {
461 int count = node->GetChildrenCount(); 465 int count = node->GetChildrenCount();
462 v8::Handle<v8::String> nameHandle = v8_str(name); 466 v8::Handle<v8::String> nameHandle = v8_str(name);
463 for (int i = 0; i < count; i++) { 467 for (int i = 0; i < count; i++) {
464 const v8::CpuProfileNode* child = node->GetChild(i); 468 const v8::CpuProfileNode* child = node->GetChild(i);
465 if (nameHandle->Equals(child->GetFunctionName())) return child; 469 if (nameHandle->Equals(child->GetFunctionName())) return child;
466 } 470 }
467 return NULL; 471 return NULL;
468 } 472 }
469 473
470 474
471 static const v8::CpuProfileNode* GetChild(v8::Isolate* isolate, 475 static const v8::CpuProfileNode* GetChild(const v8::CpuProfileNode* node,
472 const v8::CpuProfileNode* node,
473 const char* name) { 476 const char* name) {
474 const v8::CpuProfileNode* result = FindChild(isolate, node, name); 477 const v8::CpuProfileNode* result = FindChild(node, name);
475 if (!result) { 478 if (!result) {
476 char buffer[100]; 479 char buffer[100];
477 i::SNPrintF(Vector<char>(buffer, arraysize(buffer)), 480 i::SNPrintF(Vector<char>(buffer, arraysize(buffer)),
478 "Failed to GetChild: %s", name); 481 "Failed to GetChild: %s", name);
479 FATAL(buffer); 482 FATAL(buffer);
480 } 483 }
481 return result; 484 return result;
482 } 485 }
483 486
484 487
485 static void CheckSimpleBranch(v8::Isolate* isolate, 488 static void CheckSimpleBranch(const v8::CpuProfileNode* node,
486 const v8::CpuProfileNode* node,
487 const char* names[], int length) { 489 const char* names[], int length) {
488 for (int i = 0; i < length; i++) { 490 for (int i = 0; i < length; i++) {
489 const char* name = names[i]; 491 const char* name = names[i];
490 node = GetChild(isolate, node, name); 492 node = GetChild(node, name);
491 int expectedChildrenCount = (i == length - 1) ? 0 : 1; 493 int expectedChildrenCount = (i == length - 1) ? 0 : 1;
492 CHECK_EQ(expectedChildrenCount, node->GetChildrenCount()); 494 CHECK_EQ(expectedChildrenCount, node->GetChildrenCount());
493 } 495 }
494 } 496 }
495 497
496 498
497 static const v8::CpuProfileNode* GetSimpleBranch(v8::Isolate* isolate, 499 static const ProfileNode* GetSimpleBranch(v8::CpuProfile* profile,
498 const v8::CpuProfileNode* node, 500 const char* names[], int length) {
499 const char* names[], 501 const v8::CpuProfileNode* node = profile->GetTopDownRoot();
500 int length) { 502 for (int i = 0; i < length; i++) node = GetChild(node, names[i]);
yurys 2015/03/05 09:56:07 please use {}
loislo 2015/03/05 10:04:46 Done.
501 for (int i = 0; i < length; i++) { 503 return reinterpret_cast<const ProfileNode*>(node);
502 node = GetChild(isolate, node, names[i]);
503 }
504 return node;
505 } 504 }
506 505
507 506
508 static const char* cpu_profiler_test_source = "function loop(timeout) {\n" 507 static const char* cpu_profiler_test_source = "function loop(timeout) {\n"
509 " this.mmm = 0;\n" 508 " this.mmm = 0;\n"
510 " var start = Date.now();\n" 509 " var start = Date.now();\n"
511 " while (Date.now() - start < timeout) {\n" 510 " while (Date.now() - start < timeout) {\n"
512 " var n = 100*1000;\n" 511 " var n = 100*1000;\n"
513 " while(n > 1) {\n" 512 " while(n > 1) {\n"
514 " n--;\n" 513 " n--;\n"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 function->Call(env->Global(), arraysize(args), args); 569 function->Call(env->Global(), arraysize(args), args);
571 570
572 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 571 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
573 572
574 ScopedVector<v8::Handle<v8::String> > names(3); 573 ScopedVector<v8::Handle<v8::String> > names(3);
575 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 574 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
576 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 575 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
577 names[2] = v8_str("start"); 576 names[2] = v8_str("start");
578 CheckChildrenNames(root, names); 577 CheckChildrenNames(root, names);
579 578
580 const v8::CpuProfileNode* startNode = 579 const v8::CpuProfileNode* startNode = GetChild(root, "start");
581 GetChild(env->GetIsolate(), root, "start");
582 CHECK_EQ(1, startNode->GetChildrenCount()); 580 CHECK_EQ(1, startNode->GetChildrenCount());
583 581
584 const v8::CpuProfileNode* fooNode = 582 const v8::CpuProfileNode* fooNode = GetChild(startNode, "foo");
585 GetChild(env->GetIsolate(), startNode, "foo");
586 CHECK_EQ(3, fooNode->GetChildrenCount()); 583 CHECK_EQ(3, fooNode->GetChildrenCount());
587 584
588 const char* barBranch[] = { "bar", "delay", "loop" }; 585 const char* barBranch[] = { "bar", "delay", "loop" };
589 CheckSimpleBranch(env->GetIsolate(), fooNode, barBranch, 586 CheckSimpleBranch(fooNode, barBranch, arraysize(barBranch));
590 arraysize(barBranch));
591 const char* bazBranch[] = { "baz", "delay", "loop" }; 587 const char* bazBranch[] = { "baz", "delay", "loop" };
592 CheckSimpleBranch(env->GetIsolate(), fooNode, bazBranch, 588 CheckSimpleBranch(fooNode, bazBranch, arraysize(bazBranch));
593 arraysize(bazBranch));
594 const char* delayBranch[] = { "delay", "loop" }; 589 const char* delayBranch[] = { "delay", "loop" };
595 CheckSimpleBranch(env->GetIsolate(), fooNode, delayBranch, 590 CheckSimpleBranch(fooNode, delayBranch, arraysize(delayBranch));
596 arraysize(delayBranch));
597 591
598 profile->Delete(); 592 profile->Delete();
599 } 593 }
600 594
601 595
602 static const char* hot_deopt_no_frame_entry_test_source = 596 static const char* hot_deopt_no_frame_entry_test_source =
603 "function foo(a, b) {\n" 597 "function foo(a, b) {\n"
604 " try {\n" 598 " try {\n"
605 " return a + b;\n" 599 " return a + b;\n"
606 " } catch (e) { }\n" 600 " } catch (e) { }\n"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 function->Call(env->Global(), arraysize(args), args); 637 function->Call(env->Global(), arraysize(args), args);
644 638
645 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 639 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
646 640
647 ScopedVector<v8::Handle<v8::String> > names(3); 641 ScopedVector<v8::Handle<v8::String> > names(3);
648 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 642 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
649 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 643 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
650 names[2] = v8_str("start"); 644 names[2] = v8_str("start");
651 CheckChildrenNames(root, names); 645 CheckChildrenNames(root, names);
652 646
653 const v8::CpuProfileNode* startNode = 647 const v8::CpuProfileNode* startNode = GetChild(root, "start");
654 GetChild(env->GetIsolate(), root, "start");
655 CHECK_EQ(1, startNode->GetChildrenCount()); 648 CHECK_EQ(1, startNode->GetChildrenCount());
656 649
657 GetChild(env->GetIsolate(), startNode, "foo"); 650 GetChild(startNode, "foo");
658 651
659 profile->Delete(); 652 profile->Delete();
660 } 653 }
661 654
662 655
663 TEST(CollectCpuProfileSamples) { 656 TEST(CollectCpuProfileSamples) {
664 LocalContext env; 657 LocalContext env;
665 v8::HandleScope scope(env->GetIsolate()); 658 v8::HandleScope scope(env->GetIsolate());
666 659
667 CompileRun(cpu_profiler_test_source); 660 CompileRun(cpu_profiler_test_source);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 RunProfiler(env.local(), function, args, arraysize(args), 100); 722 RunProfiler(env.local(), function, args, arraysize(args), 100);
730 723
731 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 724 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
732 725
733 ScopedVector<v8::Handle<v8::String> > names(3); 726 ScopedVector<v8::Handle<v8::String> > names(3);
734 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 727 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
735 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 728 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
736 names[2] = v8_str("start"); 729 names[2] = v8_str("start");
737 CheckChildrenNames(root, names); 730 CheckChildrenNames(root, names);
738 731
739 const v8::CpuProfileNode* startNode = 732 const v8::CpuProfileNode* startNode = FindChild(root, "start");
740 FindChild(env->GetIsolate(), root, "start");
741 // On slow machines there may be no meaningfull samples at all, skip the 733 // On slow machines there may be no meaningfull samples at all, skip the
742 // check there. 734 // check there.
743 if (startNode && startNode->GetChildrenCount() > 0) { 735 if (startNode && startNode->GetChildrenCount() > 0) {
744 CHECK_EQ(1, startNode->GetChildrenCount()); 736 CHECK_EQ(1, startNode->GetChildrenCount());
745 const v8::CpuProfileNode* delayNode = 737 const v8::CpuProfileNode* delayNode = GetChild(startNode, "delay");
746 GetChild(env->GetIsolate(), startNode, "delay");
747 if (delayNode->GetChildrenCount() > 0) { 738 if (delayNode->GetChildrenCount() > 0) {
748 CHECK_EQ(1, delayNode->GetChildrenCount()); 739 CHECK_EQ(1, delayNode->GetChildrenCount());
749 GetChild(env->GetIsolate(), delayNode, "loop"); 740 GetChild(delayNode, "loop");
750 } 741 }
751 } 742 }
752 743
753 profile->Delete(); 744 profile->Delete();
754 } 745 }
755 746
756 747
757 static const char* native_accessor_test_source = "function start(count) {\n" 748 static const char* native_accessor_test_source = "function start(count) {\n"
758 " for (var i = 0; i < count; i++) {\n" 749 " for (var i = 0; i < count; i++) {\n"
759 " var o = instance.foo;\n" 750 " var o = instance.foo;\n"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 826
836 CompileRun(native_accessor_test_source); 827 CompileRun(native_accessor_test_source);
837 v8::Local<v8::Function> function = GetFunction(*env, "start"); 828 v8::Local<v8::Function> function = GetFunction(*env, "start");
838 829
839 int32_t repeat_count = 1; 830 int32_t repeat_count = 1;
840 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) }; 831 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) };
841 v8::CpuProfile* profile = 832 v8::CpuProfile* profile =
842 RunProfiler(env.local(), function, args, arraysize(args), 180); 833 RunProfiler(env.local(), function, args, arraysize(args), 180);
843 834
844 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 835 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
845 const v8::CpuProfileNode* startNode = 836 const v8::CpuProfileNode* startNode = GetChild(root, "start");
846 GetChild(isolate, root, "start"); 837 GetChild(startNode, "get foo");
847 GetChild(isolate, startNode, "get foo"); 838 GetChild(startNode, "set foo");
848 GetChild(isolate, startNode, "set foo");
849 839
850 profile->Delete(); 840 profile->Delete();
851 } 841 }
852 842
853 843
854 // Test that native accessors are properly reported in the CPU profile. 844 // Test that native accessors are properly reported in the CPU profile.
855 // This test makes sure that the accessors are called enough times to become 845 // This test makes sure that the accessors are called enough times to become
856 // hot and to trigger optimizations. 846 // hot and to trigger optimizations.
857 TEST(NativeAccessorMonomorphicIC) { 847 TEST(NativeAccessorMonomorphicIC) {
858 LocalContext env; 848 LocalContext env;
(...skipping 28 matching lines...) Expand all
887 function->Call(env->Global(), arraysize(args), args); 877 function->Call(env->Global(), arraysize(args), args);
888 accessors.set_warming_up(false); 878 accessors.set_warming_up(false);
889 } 879 }
890 880
891 int32_t repeat_count = 100; 881 int32_t repeat_count = 100;
892 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) }; 882 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) };
893 v8::CpuProfile* profile = 883 v8::CpuProfile* profile =
894 RunProfiler(env.local(), function, args, arraysize(args), 200); 884 RunProfiler(env.local(), function, args, arraysize(args), 200);
895 885
896 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 886 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
897 const v8::CpuProfileNode* startNode = 887 const v8::CpuProfileNode* startNode = GetChild(root, "start");
898 GetChild(isolate, root, "start"); 888 GetChild(startNode, "get foo");
899 GetChild(isolate, startNode, "get foo"); 889 GetChild(startNode, "set foo");
900 GetChild(isolate, startNode, "set foo");
901 890
902 profile->Delete(); 891 profile->Delete();
903 } 892 }
904 893
905 894
906 static const char* native_method_test_source = "function start(count) {\n" 895 static const char* native_method_test_source = "function start(count) {\n"
907 " for (var i = 0; i < count; i++) {\n" 896 " for (var i = 0; i < count; i++) {\n"
908 " instance.fooMethod();\n" 897 " instance.fooMethod();\n"
909 " }\n" 898 " }\n"
910 "}\n"; 899 "}\n";
(...skipping 26 matching lines...) Expand all
937 926
938 CompileRun(native_method_test_source); 927 CompileRun(native_method_test_source);
939 v8::Local<v8::Function> function = GetFunction(*env, "start"); 928 v8::Local<v8::Function> function = GetFunction(*env, "start");
940 929
941 int32_t repeat_count = 1; 930 int32_t repeat_count = 1;
942 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) }; 931 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) };
943 v8::CpuProfile* profile = 932 v8::CpuProfile* profile =
944 RunProfiler(env.local(), function, args, arraysize(args), 100); 933 RunProfiler(env.local(), function, args, arraysize(args), 100);
945 934
946 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 935 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
947 const v8::CpuProfileNode* startNode = 936 const v8::CpuProfileNode* startNode = GetChild(root, "start");
948 GetChild(isolate, root, "start"); 937 GetChild(startNode, "fooMethod");
949 GetChild(isolate, startNode, "fooMethod");
950 938
951 profile->Delete(); 939 profile->Delete();
952 } 940 }
953 941
954 942
955 TEST(NativeMethodMonomorphicIC) { 943 TEST(NativeMethodMonomorphicIC) {
956 LocalContext env; 944 LocalContext env;
957 v8::Isolate* isolate = env->GetIsolate(); 945 v8::Isolate* isolate = env->GetIsolate();
958 v8::HandleScope scope(isolate); 946 v8::HandleScope scope(isolate);
959 947
(...skipping 30 matching lines...) Expand all
990 function->Call(env->Global(), arraysize(args), args); 978 function->Call(env->Global(), arraysize(args), args);
991 callbacks.set_warming_up(false); 979 callbacks.set_warming_up(false);
992 } 980 }
993 981
994 int32_t repeat_count = 100; 982 int32_t repeat_count = 100;
995 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) }; 983 v8::Handle<v8::Value> args[] = { v8::Integer::New(isolate, repeat_count) };
996 v8::CpuProfile* profile = 984 v8::CpuProfile* profile =
997 RunProfiler(env.local(), function, args, arraysize(args), 100); 985 RunProfiler(env.local(), function, args, arraysize(args), 100);
998 986
999 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 987 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1000 GetChild(isolate, root, "start"); 988 GetChild(root, "start");
1001 const v8::CpuProfileNode* startNode = 989 const v8::CpuProfileNode* startNode = GetChild(root, "start");
1002 GetChild(isolate, root, "start"); 990 GetChild(startNode, "fooMethod");
1003 GetChild(isolate, startNode, "fooMethod");
1004 991
1005 profile->Delete(); 992 profile->Delete();
1006 } 993 }
1007 994
1008 995
1009 static const char* bound_function_test_source = 996 static const char* bound_function_test_source =
1010 "function foo() {\n" 997 "function foo() {\n"
1011 " startProfiling('my_profile');\n" 998 " startProfiling('my_profile');\n"
1012 "}\n" 999 "}\n"
1013 "function start() {\n" 1000 "function start() {\n"
(...skipping 13 matching lines...) Expand all
1027 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0); 1014 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0);
1028 1015
1029 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1016 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1030 ScopedVector<v8::Handle<v8::String> > names(3); 1017 ScopedVector<v8::Handle<v8::String> > names(3);
1031 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1018 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1032 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1019 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1033 names[2] = v8_str("start"); 1020 names[2] = v8_str("start");
1034 // Don't allow |foo| node to be at the top level. 1021 // Don't allow |foo| node to be at the top level.
1035 CheckChildrenNames(root, names); 1022 CheckChildrenNames(root, names);
1036 1023
1037 const v8::CpuProfileNode* startNode = 1024 const v8::CpuProfileNode* startNode = GetChild(root, "start");
1038 GetChild(env->GetIsolate(), root, "start"); 1025 GetChild(startNode, "foo");
1039 GetChild(env->GetIsolate(), startNode, "foo");
1040 1026
1041 profile->Delete(); 1027 profile->Delete();
1042 } 1028 }
1043 1029
1044 1030
1045 // This tests checks distribution of the samples through the source lines. 1031 // This tests checks distribution of the samples through the source lines.
1046 TEST(TickLines) { 1032 TEST(TickLines) {
1047 CcTest::InitializeVM(); 1033 CcTest::InitializeVM();
1048 LocalContext env; 1034 LocalContext env;
1049 i::FLAG_turbo_source_positions = true; 1035 i::FLAG_turbo_source_positions = true;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 names[2] = v8_str("start"); 1176 names[2] = v8_str("start");
1191 names[3] = v8_str(i::ProfileGenerator::kUnresolvedFunctionName); 1177 names[3] = v8_str(i::ProfileGenerator::kUnresolvedFunctionName);
1192 // Don't allow |bar| and |call| nodes to be at the top level. 1178 // Don't allow |bar| and |call| nodes to be at the top level.
1193 CheckChildrenNames(root, names); 1179 CheckChildrenNames(root, names);
1194 } 1180 }
1195 1181
1196 // In case of GC stress tests all samples may be in GC phase and there 1182 // In case of GC stress tests all samples may be in GC phase and there
1197 // won't be |start| node in the profiles. 1183 // won't be |start| node in the profiles.
1198 bool is_gc_stress_testing = 1184 bool is_gc_stress_testing =
1199 (i::FLAG_gc_interval != -1) || i::FLAG_stress_compaction; 1185 (i::FLAG_gc_interval != -1) || i::FLAG_stress_compaction;
1200 const v8::CpuProfileNode* startNode = 1186 const v8::CpuProfileNode* startNode = FindChild(root, "start");
1201 FindChild(env->GetIsolate(), root, "start");
1202 CHECK(is_gc_stress_testing || startNode); 1187 CHECK(is_gc_stress_testing || startNode);
1203 if (startNode) { 1188 if (startNode) {
1204 ScopedVector<v8::Handle<v8::String> > names(2); 1189 ScopedVector<v8::Handle<v8::String> > names(2);
1205 names[0] = v8_str("bar"); 1190 names[0] = v8_str("bar");
1206 names[1] = v8_str("call"); 1191 names[1] = v8_str("call");
1207 CheckChildrenNames(startNode, names); 1192 CheckChildrenNames(startNode, names);
1208 } 1193 }
1209 1194
1210 const v8::CpuProfileNode* unresolvedNode = FindChild( 1195 const v8::CpuProfileNode* unresolvedNode =
1211 env->GetIsolate(), root, i::ProfileGenerator::kUnresolvedFunctionName); 1196 FindChild(root, i::ProfileGenerator::kUnresolvedFunctionName);
1212 if (unresolvedNode) { 1197 if (unresolvedNode) {
1213 ScopedVector<v8::Handle<v8::String> > names(1); 1198 ScopedVector<v8::Handle<v8::String> > names(1);
1214 names[0] = v8_str("call"); 1199 names[0] = v8_str("call");
1215 CheckChildrenNames(unresolvedNode, names); 1200 CheckChildrenNames(unresolvedNode, names);
1216 } 1201 }
1217 1202
1218 profile->Delete(); 1203 profile->Delete();
1219 } 1204 }
1220 1205
1221 1206
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1263 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1248 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1264 { 1249 {
1265 ScopedVector<v8::Handle<v8::String> > names(3); 1250 ScopedVector<v8::Handle<v8::String> > names(3);
1266 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1251 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1267 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1252 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1268 names[2] = v8_str("start"); 1253 names[2] = v8_str("start");
1269 // Don't allow |test|, |bar| and |apply| nodes to be at the top level. 1254 // Don't allow |test|, |bar| and |apply| nodes to be at the top level.
1270 CheckChildrenNames(root, names); 1255 CheckChildrenNames(root, names);
1271 } 1256 }
1272 1257
1273 const v8::CpuProfileNode* startNode = 1258 const v8::CpuProfileNode* startNode = FindChild(root, "start");
1274 FindChild(env->GetIsolate(), root, "start");
1275 if (startNode) { 1259 if (startNode) {
1276 { 1260 {
1277 ScopedVector<v8::Handle<v8::String> > names(2); 1261 ScopedVector<v8::Handle<v8::String> > names(2);
1278 names[0] = v8_str("test"); 1262 names[0] = v8_str("test");
1279 names[1] = v8_str(ProfileGenerator::kUnresolvedFunctionName); 1263 names[1] = v8_str(ProfileGenerator::kUnresolvedFunctionName);
1280 CheckChildrenNames(startNode, names); 1264 CheckChildrenNames(startNode, names);
1281 } 1265 }
1282 1266
1283 const v8::CpuProfileNode* testNode = 1267 const v8::CpuProfileNode* testNode = FindChild(startNode, "test");
1284 FindChild(env->GetIsolate(), startNode, "test");
1285 if (testNode) { 1268 if (testNode) {
1286 ScopedVector<v8::Handle<v8::String> > names(3); 1269 ScopedVector<v8::Handle<v8::String> > names(3);
1287 names[0] = v8_str("bar"); 1270 names[0] = v8_str("bar");
1288 names[1] = v8_str("apply"); 1271 names[1] = v8_str("apply");
1289 // apply calls "get length" before invoking the function itself 1272 // apply calls "get length" before invoking the function itself
1290 // and we may get hit into it. 1273 // and we may get hit into it.
1291 names[2] = v8_str("get length"); 1274 names[2] = v8_str("get length");
1292 CheckChildrenNames(testNode, names); 1275 CheckChildrenNames(testNode, names);
1293 } 1276 }
1294 1277
1295 if (const v8::CpuProfileNode* unresolvedNode = 1278 if (const v8::CpuProfileNode* unresolvedNode =
1296 FindChild(env->GetIsolate(), startNode, 1279 FindChild(startNode, ProfileGenerator::kUnresolvedFunctionName)) {
1297 ProfileGenerator::kUnresolvedFunctionName)) {
1298 ScopedVector<v8::Handle<v8::String> > names(1); 1280 ScopedVector<v8::Handle<v8::String> > names(1);
1299 names[0] = v8_str("apply"); 1281 names[0] = v8_str("apply");
1300 CheckChildrenNames(unresolvedNode, names); 1282 CheckChildrenNames(unresolvedNode, names);
1301 GetChild(env->GetIsolate(), unresolvedNode, "apply"); 1283 GetChild(unresolvedNode, "apply");
1302 } 1284 }
1303 } 1285 }
1304 1286
1305 profile->Delete(); 1287 profile->Delete();
1306 } 1288 }
1307 1289
1308 1290
1309 static const char* cpu_profiler_deep_stack_test_source = 1291 static const char* cpu_profiler_deep_stack_test_source =
1310 "function foo(n) {\n" 1292 "function foo(n) {\n"
1311 " if (n)\n" 1293 " if (n)\n"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 1329
1348 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1330 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1349 { 1331 {
1350 ScopedVector<v8::Handle<v8::String> > names(3); 1332 ScopedVector<v8::Handle<v8::String> > names(3);
1351 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1333 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1352 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1334 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1353 names[2] = v8_str("start"); 1335 names[2] = v8_str("start");
1354 CheckChildrenNames(root, names); 1336 CheckChildrenNames(root, names);
1355 } 1337 }
1356 1338
1357 const v8::CpuProfileNode* node = 1339 const v8::CpuProfileNode* node = GetChild(root, "start");
1358 GetChild(env->GetIsolate(), root, "start");
1359 for (int i = 0; i < 250; ++i) { 1340 for (int i = 0; i < 250; ++i) {
1360 node = GetChild(env->GetIsolate(), node, "foo"); 1341 node = GetChild(node, "foo");
1361 } 1342 }
1362 // TODO(alph): 1343 // TODO(alph):
1363 // In theory there must be one more 'foo' and a 'startProfiling' nodes, 1344 // In theory there must be one more 'foo' and a 'startProfiling' nodes,
1364 // but due to unstable top frame extraction these might be missing. 1345 // but due to unstable top frame extraction these might be missing.
1365 1346
1366 profile->Delete(); 1347 profile->Delete();
1367 } 1348 }
1368 1349
1369 1350
1370 static const char* js_native_js_test_source = 1351 static const char* js_native_js_test_source =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 1393
1413 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1394 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1414 { 1395 {
1415 ScopedVector<v8::Handle<v8::String> > names(3); 1396 ScopedVector<v8::Handle<v8::String> > names(3);
1416 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1397 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1417 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1398 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1418 names[2] = v8_str("start"); 1399 names[2] = v8_str("start");
1419 CheckChildrenNames(root, names); 1400 CheckChildrenNames(root, names);
1420 } 1401 }
1421 1402
1422 const v8::CpuProfileNode* startNode = 1403 const v8::CpuProfileNode* startNode = GetChild(root, "start");
1423 GetChild(env->GetIsolate(), root, "start");
1424 CHECK_EQ(1, startNode->GetChildrenCount()); 1404 CHECK_EQ(1, startNode->GetChildrenCount());
1425 const v8::CpuProfileNode* nativeFunctionNode = 1405 const v8::CpuProfileNode* nativeFunctionNode =
1426 GetChild(env->GetIsolate(), startNode, "CallJsFunction"); 1406 GetChild(startNode, "CallJsFunction");
1427 1407
1428 CHECK_EQ(1, nativeFunctionNode->GetChildrenCount()); 1408 CHECK_EQ(1, nativeFunctionNode->GetChildrenCount());
1429 const v8::CpuProfileNode* barNode = 1409 const v8::CpuProfileNode* barNode = GetChild(nativeFunctionNode, "bar");
1430 GetChild(env->GetIsolate(), nativeFunctionNode, "bar");
1431 1410
1432 CHECK_EQ(1, barNode->GetChildrenCount()); 1411 CHECK_EQ(1, barNode->GetChildrenCount());
1433 GetChild(env->GetIsolate(), barNode, "foo"); 1412 GetChild(barNode, "foo");
1434 1413
1435 profile->Delete(); 1414 profile->Delete();
1436 } 1415 }
1437 1416
1438 1417
1439 static const char* js_native_js_runtime_js_test_source = 1418 static const char* js_native_js_runtime_js_test_source =
1440 "function foo() {\n" 1419 "function foo() {\n"
1441 " startProfiling('my_profile');\n" 1420 " startProfiling('my_profile');\n"
1442 "}\n" 1421 "}\n"
1443 "var bound = foo.bind(this);\n" 1422 "var bound = foo.bind(this);\n"
(...skipping 30 matching lines...) Expand all
1474 1453
1475 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0); 1454 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0);
1476 1455
1477 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1456 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1478 ScopedVector<v8::Handle<v8::String> > names(3); 1457 ScopedVector<v8::Handle<v8::String> > names(3);
1479 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1458 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1480 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1459 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1481 names[2] = v8_str("start"); 1460 names[2] = v8_str("start");
1482 CheckChildrenNames(root, names); 1461 CheckChildrenNames(root, names);
1483 1462
1484 const v8::CpuProfileNode* startNode = 1463 const v8::CpuProfileNode* startNode = GetChild(root, "start");
1485 GetChild(env->GetIsolate(), root, "start");
1486 CHECK_EQ(1, startNode->GetChildrenCount()); 1464 CHECK_EQ(1, startNode->GetChildrenCount());
1487 const v8::CpuProfileNode* nativeFunctionNode = 1465 const v8::CpuProfileNode* nativeFunctionNode =
1488 GetChild(env->GetIsolate(), startNode, "CallJsFunction"); 1466 GetChild(startNode, "CallJsFunction");
1489 1467
1490 CHECK_EQ(1, nativeFunctionNode->GetChildrenCount()); 1468 CHECK_EQ(1, nativeFunctionNode->GetChildrenCount());
1491 const v8::CpuProfileNode* barNode = 1469 const v8::CpuProfileNode* barNode = GetChild(nativeFunctionNode, "bar");
1492 GetChild(env->GetIsolate(), nativeFunctionNode, "bar");
1493 1470
1494 // The child is in fact a bound foo. 1471 // The child is in fact a bound foo.
1495 // A bound function has a wrapper that may make calls to 1472 // A bound function has a wrapper that may make calls to
1496 // other functions e.g. "get length". 1473 // other functions e.g. "get length".
1497 CHECK_LE(1, barNode->GetChildrenCount()); 1474 CHECK_LE(1, barNode->GetChildrenCount());
1498 CHECK_GE(2, barNode->GetChildrenCount()); 1475 CHECK_GE(2, barNode->GetChildrenCount());
1499 GetChild(env->GetIsolate(), barNode, "foo"); 1476 GetChild(barNode, "foo");
1500 1477
1501 profile->Delete(); 1478 profile->Delete();
1502 } 1479 }
1503 1480
1504 1481
1505 static void CallJsFunction2(const v8::FunctionCallbackInfo<v8::Value>& info) { 1482 static void CallJsFunction2(const v8::FunctionCallbackInfo<v8::Value>& info) {
1506 v8::base::OS::Print("In CallJsFunction2\n"); 1483 v8::base::OS::Print("In CallJsFunction2\n");
1507 CallJsFunction(info); 1484 CallJsFunction(info);
1508 } 1485 }
1509 1486
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 1530
1554 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0); 1531 v8::CpuProfile* profile = RunProfiler(env, function, NULL, 0, 0);
1555 1532
1556 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1533 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1557 ScopedVector<v8::Handle<v8::String> > names(3); 1534 ScopedVector<v8::Handle<v8::String> > names(3);
1558 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1535 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1559 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1536 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1560 names[2] = v8_str("start"); 1537 names[2] = v8_str("start");
1561 CheckChildrenNames(root, names); 1538 CheckChildrenNames(root, names);
1562 1539
1563 const v8::CpuProfileNode* startNode = 1540 const v8::CpuProfileNode* startNode = GetChild(root, "start");
1564 GetChild(env->GetIsolate(), root, "start");
1565 CHECK_EQ(1, startNode->GetChildrenCount()); 1541 CHECK_EQ(1, startNode->GetChildrenCount());
1566 const v8::CpuProfileNode* nativeNode1 = 1542 const v8::CpuProfileNode* nativeNode1 =
1567 GetChild(env->GetIsolate(), startNode, "CallJsFunction1"); 1543 GetChild(startNode, "CallJsFunction1");
1568 1544
1569 CHECK_EQ(1, nativeNode1->GetChildrenCount()); 1545 CHECK_EQ(1, nativeNode1->GetChildrenCount());
1570 const v8::CpuProfileNode* barNode = 1546 const v8::CpuProfileNode* barNode = GetChild(nativeNode1, "bar");
1571 GetChild(env->GetIsolate(), nativeNode1, "bar");
1572 1547
1573 CHECK_EQ(1, barNode->GetChildrenCount()); 1548 CHECK_EQ(1, barNode->GetChildrenCount());
1574 const v8::CpuProfileNode* nativeNode2 = 1549 const v8::CpuProfileNode* nativeNode2 = GetChild(barNode, "CallJsFunction2");
1575 GetChild(env->GetIsolate(), barNode, "CallJsFunction2");
1576 1550
1577 CHECK_EQ(1, nativeNode2->GetChildrenCount()); 1551 CHECK_EQ(1, nativeNode2->GetChildrenCount());
1578 GetChild(env->GetIsolate(), nativeNode2, "foo"); 1552 GetChild(nativeNode2, "foo");
1579 1553
1580 profile->Delete(); 1554 profile->Delete();
1581 } 1555 }
1582 1556
1583 1557
1584 // [Top down]: 1558 // [Top down]:
1585 // 6 0 (root) #0 1 1559 // 6 0 (root) #0 1
1586 // 3 3 (program) #0 2 1560 // 3 3 (program) #0 2
1587 // 3 3 (idle) #0 3 1561 // 3 3 (idle) #0 3
1588 TEST(IdleTime) { 1562 TEST(IdleTime) {
(...skipping 24 matching lines...) Expand all
1613 reinterpret_cast<i::CpuProfile*>(profile)->Print(); 1587 reinterpret_cast<i::CpuProfile*>(profile)->Print();
1614 1588
1615 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1589 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1616 ScopedVector<v8::Handle<v8::String> > names(3); 1590 ScopedVector<v8::Handle<v8::String> > names(3);
1617 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName); 1591 names[0] = v8_str(ProfileGenerator::kGarbageCollectorEntryName);
1618 names[1] = v8_str(ProfileGenerator::kProgramEntryName); 1592 names[1] = v8_str(ProfileGenerator::kProgramEntryName);
1619 names[2] = v8_str(ProfileGenerator::kIdleEntryName); 1593 names[2] = v8_str(ProfileGenerator::kIdleEntryName);
1620 CheckChildrenNames(root, names); 1594 CheckChildrenNames(root, names);
1621 1595
1622 const v8::CpuProfileNode* programNode = 1596 const v8::CpuProfileNode* programNode =
1623 GetChild(env->GetIsolate(), root, ProfileGenerator::kProgramEntryName); 1597 GetChild(root, ProfileGenerator::kProgramEntryName);
1624 CHECK_EQ(0, programNode->GetChildrenCount()); 1598 CHECK_EQ(0, programNode->GetChildrenCount());
1625 CHECK_GE(programNode->GetHitCount(), 3u); 1599 CHECK_GE(programNode->GetHitCount(), 3u);
1626 1600
1627 const v8::CpuProfileNode* idleNode = 1601 const v8::CpuProfileNode* idleNode =
1628 GetChild(env->GetIsolate(), root, ProfileGenerator::kIdleEntryName); 1602 GetChild(root, ProfileGenerator::kIdleEntryName);
1629 CHECK_EQ(0, idleNode->GetChildrenCount()); 1603 CHECK_EQ(0, idleNode->GetChildrenCount());
1630 CHECK_GE(idleNode->GetHitCount(), 3u); 1604 CHECK_GE(idleNode->GetHitCount(), 3u);
1631 1605
1632 profile->Delete(); 1606 profile->Delete();
1633 } 1607 }
1634 1608
1635 1609
1636 static void CheckFunctionDetails(v8::Isolate* isolate, 1610 static void CheckFunctionDetails(v8::Isolate* isolate,
1637 const v8::CpuProfileNode* node, 1611 const v8::CpuProfileNode* node,
1638 const char* name, const char* script_name, 1612 const char* name, const char* script_name,
(...skipping 26 matching lines...) Expand all
1665 const v8::CpuProfileNode* current = profile->GetTopDownRoot(); 1639 const v8::CpuProfileNode* current = profile->GetTopDownRoot();
1666 reinterpret_cast<ProfileNode*>( 1640 reinterpret_cast<ProfileNode*>(
1667 const_cast<v8::CpuProfileNode*>(current))->Print(0); 1641 const_cast<v8::CpuProfileNode*>(current))->Print(0);
1668 // The tree should look like this: 1642 // The tree should look like this:
1669 // 0 (root) 0 #1 1643 // 0 (root) 0 #1
1670 // 0 "" 19 #2 no reason script_b:1 1644 // 0 "" 19 #2 no reason script_b:1
1671 // 0 baz 19 #3 TryCatchStatement script_b:3 1645 // 0 baz 19 #3 TryCatchStatement script_b:3
1672 // 0 foo 18 #4 TryCatchStatement script_a:2 1646 // 0 foo 18 #4 TryCatchStatement script_a:2
1673 // 1 bar 18 #5 no reason script_a:3 1647 // 1 bar 18 #5 no reason script_a:3
1674 const v8::CpuProfileNode* root = profile->GetTopDownRoot(); 1648 const v8::CpuProfileNode* root = profile->GetTopDownRoot();
1675 const v8::CpuProfileNode* script = GetChild(env->GetIsolate(), root, ""); 1649 const v8::CpuProfileNode* script = GetChild(root, "");
1676 CheckFunctionDetails(env->GetIsolate(), script, "", "script_b", 1650 CheckFunctionDetails(env->GetIsolate(), script, "", "script_b",
1677 script_b->GetUnboundScript()->GetId(), 1, 1); 1651 script_b->GetUnboundScript()->GetId(), 1, 1);
1678 const v8::CpuProfileNode* baz = GetChild(env->GetIsolate(), script, "baz"); 1652 const v8::CpuProfileNode* baz = GetChild(script, "baz");
1679 CheckFunctionDetails(env->GetIsolate(), baz, "baz", "script_b", 1653 CheckFunctionDetails(env->GetIsolate(), baz, "baz", "script_b",
1680 script_b->GetUnboundScript()->GetId(), 3, 16); 1654 script_b->GetUnboundScript()->GetId(), 3, 16);
1681 const v8::CpuProfileNode* foo = GetChild(env->GetIsolate(), baz, "foo"); 1655 const v8::CpuProfileNode* foo = GetChild(baz, "foo");
1682 CheckFunctionDetails(env->GetIsolate(), foo, "foo", "script_a", 1656 CheckFunctionDetails(env->GetIsolate(), foo, "foo", "script_a",
1683 script_a->GetUnboundScript()->GetId(), 2, 1); 1657 script_a->GetUnboundScript()->GetId(), 2, 1);
1684 const v8::CpuProfileNode* bar = GetChild(env->GetIsolate(), foo, "bar"); 1658 const v8::CpuProfileNode* bar = GetChild(foo, "bar");
1685 CheckFunctionDetails(env->GetIsolate(), bar, "bar", "script_a", 1659 CheckFunctionDetails(env->GetIsolate(), bar, "bar", "script_a",
1686 script_a->GetUnboundScript()->GetId(), 3, 14); 1660 script_a->GetUnboundScript()->GetId(), 3, 14);
1687 } 1661 }
1688 1662
1689 1663
1690 TEST(DontStopOnFinishedProfileDelete) { 1664 TEST(DontStopOnFinishedProfileDelete) {
1691 v8::HandleScope scope(CcTest::isolate()); 1665 v8::HandleScope scope(CcTest::isolate());
1692 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1666 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1693 v8::Context::Scope context_scope(env); 1667 v8::Context::Scope context_scope(env);
1694 1668
(...skipping 18 matching lines...) Expand all
1713 1687
1714 v8::CpuProfile* outer_profile = profiler->StopProfiling(outer); 1688 v8::CpuProfile* outer_profile = profiler->StopProfiling(outer);
1715 CHECK(outer_profile); 1689 CHECK(outer_profile);
1716 CHECK_EQ(1, iprofiler->GetProfilesCount()); 1690 CHECK_EQ(1, iprofiler->GetProfilesCount());
1717 outer_profile->Delete(); 1691 outer_profile->Delete();
1718 outer_profile = NULL; 1692 outer_profile = NULL;
1719 CHECK_EQ(0, iprofiler->GetProfilesCount()); 1693 CHECK_EQ(0, iprofiler->GetProfilesCount());
1720 } 1694 }
1721 1695
1722 1696
1723 static const char* collect_deopt_events_test_source = 1697 // deopt at top function
1724 "function opt_function(left, right, depth) {\n"
1725 " if (depth) return opt_function(left, right, depth - 1);\n"
1726 "\n"
1727 " var k = left / 10;\n"
1728 " var r = 10 / right;\n"
1729 " return k + r;"
1730 "}\n"
1731 "\n"
1732 "function test(left, right) {\n"
1733 " return opt_function(left, right, 1);\n"
1734 "}\n"
1735 "\n"
1736 "startProfiling();\n"
1737 "\n"
1738 "test(10, 10);\n"
1739 "\n"
1740 "%OptimizeFunctionOnNextCall(opt_function)\n"
1741 "\n"
1742 "test(10, 10);\n"
1743 "\n"
1744 "test(undefined, 10);\n"
1745 "\n"
1746 "%OptimizeFunctionOnNextCall(opt_function)\n"
1747 "\n"
1748 "test(10, 10);\n"
1749 "\n"
1750 "test(10, 0);\n"
1751 "\n"
1752 "stopProfiling();\n"
1753 "\n";
1754
1755
1756 TEST(CollectDeoptEvents) { 1698 TEST(CollectDeoptEvents) {
1757 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; 1699 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
1758 i::FLAG_allow_natives_syntax = true; 1700 i::FLAG_allow_natives_syntax = true;
1759 v8::HandleScope scope(CcTest::isolate()); 1701 v8::HandleScope scope(CcTest::isolate());
1760 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION); 1702 v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
1761 v8::Context::Scope context_scope(env); 1703 v8::Context::Scope context_scope(env);
1762 v8::Isolate* isolate = env->GetIsolate(); 1704 v8::Isolate* isolate = env->GetIsolate();
1763 v8::CpuProfiler* profiler = isolate->GetCpuProfiler(); 1705 v8::CpuProfiler* profiler = isolate->GetCpuProfiler();
1764 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler); 1706 i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler);
1765 1707
1766 v8::Script::Compile(v8_str(collect_deopt_events_test_source))->Run(); 1708 const char* source =
1709 "function opt_function(left, right, depth) {\n"
1710 " if (depth) return opt_function(left, right, depth - 1);\n"
1711 "\n"
1712 " var k = left / 10;\n"
1713 " var r = 10 / right;\n"
1714 " return k + r;"
1715 "}\n"
1716 "\n"
1717 "function test(left, right) {\n"
1718 " return opt_function(left, right, 1);\n"
1719 "}\n"
1720 "\n"
1721 "startProfiling();\n"
1722 "\n"
1723 "test(10, 10);\n"
1724 "\n"
1725 "%OptimizeFunctionOnNextCall(opt_function)\n"
1726 "\n"
1727 "test(10, 10);\n"
1728 "\n"
1729 "test(undefined, 10);\n"
1730 "\n"
1731 "%OptimizeFunctionOnNextCall(opt_function)\n"
1732 "\n"
1733 "test(10, 10);\n"
1734 "\n"
1735 "test(10, 0);\n"
1736 "\n"
1737 "stopProfiling();\n"
1738 "\n";
1739
1740 v8::Script::Compile(v8_str(source))->Run();
1767 i::CpuProfile* iprofile = iprofiler->GetProfile(0); 1741 i::CpuProfile* iprofile = iprofiler->GetProfile(0);
1768 iprofile->Print(); 1742 iprofile->Print();
1769 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile); 1743 v8::CpuProfile* profile = reinterpret_cast<v8::CpuProfile*>(iprofile);
1770 const char* branch[] = {"", "test", "opt_function", "opt_function"}; 1744 const char* branch[] = {"", "test", "opt_function", "opt_function"};
1771 const v8::CpuProfileNode* opt_function = GetSimpleBranch( 1745 const ProfileNode* iopt_function =
1772 env->GetIsolate(), profile->GetTopDownRoot(), branch, arraysize(branch)); 1746 GetSimpleBranch(profile, branch, arraysize(branch));
1773 CHECK(opt_function);
1774 const i::ProfileNode* iopt_function =
1775 reinterpret_cast<const i::ProfileNode*>(opt_function);
1776 CHECK_EQ(2, iopt_function->deopt_infos().length()); 1747 CHECK_EQ(2, iopt_function->deopt_infos().length());
1777 CHECK_EQ(i::Deoptimizer::GetDeoptReason(i::Deoptimizer::kNotAHeapNumber), 1748 CHECK_EQ(reason(i::Deoptimizer::kNotAHeapNumber),
1778 iopt_function->deopt_infos()[0].deopt_reason); 1749 iopt_function->deopt_infos()[0].deopt_reason);
1779 CHECK_EQ(i::Deoptimizer::GetDeoptReason(i::Deoptimizer::kDivisionByZero), 1750 CHECK_EQ(reason(i::Deoptimizer::kDivisionByZero),
1780 iopt_function->deopt_infos()[1].deopt_reason); 1751 iopt_function->deopt_infos()[1].deopt_reason);
1781 iprofiler->DeleteProfile(iprofile); 1752 iprofiler->DeleteProfile(iprofile);
1782 } 1753 }
1783 1754
1784 1755
1785 TEST(SourceLocation) { 1756 TEST(SourceLocation) {
1786 i::FLAG_always_opt = true; 1757 i::FLAG_always_opt = true;
1787 i::FLAG_hydrogen_track_positions = true; 1758 i::FLAG_hydrogen_track_positions = true;
1788 LocalContext env; 1759 LocalContext env;
1789 v8::HandleScope scope(CcTest::isolate()); 1760 v8::HandleScope scope(CcTest::isolate());
1790 1761
1791 const char* source = 1762 const char* source =
1792 "function CompareStatementWithThis() {\n" 1763 "function CompareStatementWithThis() {\n"
1793 " if (this === 1) {}\n" 1764 " if (this === 1) {}\n"
1794 "}\n" 1765 "}\n"
1795 "CompareStatementWithThis();\n"; 1766 "CompareStatementWithThis();\n";
1796 1767
1797 v8::Script::Compile(v8_str(source))->Run(); 1768 v8::Script::Compile(v8_str(source))->Run();
1798 } 1769 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698