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

Side by Side Diff: test/cctest/test-debug.cc

Issue 21010: File missing from http://codereview.chromium.org/19753. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 10 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 | Annotate | Revision Log
« 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 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 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 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 CHECK(!HasDebugInfo(foo)); 816 CHECK(!HasDebugInfo(foo));
817 CHECK(!HasDebugInfo(bar)); 817 CHECK(!HasDebugInfo(bar));
818 } 818 }
819 819
820 820
821 // Test that a break point can be set at an IC store location. 821 // Test that a break point can be set at an IC store location.
822 TEST(BreakPointICStore) { 822 TEST(BreakPointICStore) {
823 break_point_hit_count = 0; 823 break_point_hit_count = 0;
824 v8::HandleScope scope; 824 v8::HandleScope scope;
825 DebugLocalContext env; 825 DebugLocalContext env;
826 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 826 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
827 v8::Undefined()); 827 v8::Undefined());
828 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run(); 828 v8::Script::Compile(v8::String::New("function foo(){bar=0;}"))->Run();
829 v8::Local<v8::Function> foo = 829 v8::Local<v8::Function> foo =
830 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 830 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
831 831
832 // Run without breakpoints. 832 // Run without breakpoints.
833 foo->Call(env->Global(), 0, NULL); 833 foo->Call(env->Global(), 0, NULL);
834 CHECK_EQ(0, break_point_hit_count); 834 CHECK_EQ(0, break_point_hit_count);
835 835
836 // Run with breakpoint 836 // Run with breakpoint
837 int bp = SetBreakPoint(foo, 0); 837 int bp = SetBreakPoint(foo, 0);
838 foo->Call(env->Global(), 0, NULL); 838 foo->Call(env->Global(), 0, NULL);
839 CHECK_EQ(1, break_point_hit_count); 839 CHECK_EQ(1, break_point_hit_count);
840 foo->Call(env->Global(), 0, NULL); 840 foo->Call(env->Global(), 0, NULL);
841 CHECK_EQ(2, break_point_hit_count); 841 CHECK_EQ(2, break_point_hit_count);
842 842
843 // Run without breakpoints. 843 // Run without breakpoints.
844 ClearBreakPoint(bp); 844 ClearBreakPoint(bp);
845 foo->Call(env->Global(), 0, NULL); 845 foo->Call(env->Global(), 0, NULL);
846 CHECK_EQ(2, break_point_hit_count); 846 CHECK_EQ(2, break_point_hit_count);
847 847
848 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 848 v8::Debug::SetDebugEventListener(NULL);
849 } 849 }
850 850
851 851
852 // Test that a break point can be set at an IC load location. 852 // Test that a break point can be set at an IC load location.
853 TEST(BreakPointICLoad) { 853 TEST(BreakPointICLoad) {
854 break_point_hit_count = 0; 854 break_point_hit_count = 0;
855 v8::HandleScope scope; 855 v8::HandleScope scope;
856 DebugLocalContext env; 856 DebugLocalContext env;
857 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 857 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
858 v8::Undefined()); 858 v8::Undefined());
859 v8::Script::Compile(v8::String::New("bar=1"))->Run(); 859 v8::Script::Compile(v8::String::New("bar=1"))->Run();
860 v8::Script::Compile(v8::String::New("function foo(){var x=bar;}"))->Run(); 860 v8::Script::Compile(v8::String::New("function foo(){var x=bar;}"))->Run();
861 v8::Local<v8::Function> foo = 861 v8::Local<v8::Function> foo =
862 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 862 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
863 863
864 // Run without breakpoints. 864 // Run without breakpoints.
865 foo->Call(env->Global(), 0, NULL); 865 foo->Call(env->Global(), 0, NULL);
866 CHECK_EQ(0, break_point_hit_count); 866 CHECK_EQ(0, break_point_hit_count);
867 867
868 // Run with breakpoint 868 // Run with breakpoint
869 int bp = SetBreakPoint(foo, 0); 869 int bp = SetBreakPoint(foo, 0);
870 foo->Call(env->Global(), 0, NULL); 870 foo->Call(env->Global(), 0, NULL);
871 CHECK_EQ(1, break_point_hit_count); 871 CHECK_EQ(1, break_point_hit_count);
872 foo->Call(env->Global(), 0, NULL); 872 foo->Call(env->Global(), 0, NULL);
873 CHECK_EQ(2, break_point_hit_count); 873 CHECK_EQ(2, break_point_hit_count);
874 874
875 // Run without breakpoints. 875 // Run without breakpoints.
876 ClearBreakPoint(bp); 876 ClearBreakPoint(bp);
877 foo->Call(env->Global(), 0, NULL); 877 foo->Call(env->Global(), 0, NULL);
878 CHECK_EQ(2, break_point_hit_count); 878 CHECK_EQ(2, break_point_hit_count);
879 879
880 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 880 v8::Debug::SetDebugEventListener(NULL);
881 } 881 }
882 882
883 883
884 // Test that a break point can be set at an IC call location. 884 // Test that a break point can be set at an IC call location.
885 TEST(BreakPointICCall) { 885 TEST(BreakPointICCall) {
886 break_point_hit_count = 0; 886 break_point_hit_count = 0;
887 v8::HandleScope scope; 887 v8::HandleScope scope;
888 DebugLocalContext env; 888 DebugLocalContext env;
889 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 889 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
890 v8::Undefined()); 890 v8::Undefined());
891 v8::Script::Compile(v8::String::New("function bar(){}"))->Run(); 891 v8::Script::Compile(v8::String::New("function bar(){}"))->Run();
892 v8::Script::Compile(v8::String::New("function foo(){bar();}"))->Run(); 892 v8::Script::Compile(v8::String::New("function foo(){bar();}"))->Run();
893 v8::Local<v8::Function> foo = 893 v8::Local<v8::Function> foo =
894 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 894 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
895 895
896 // Run without breakpoints. 896 // Run without breakpoints.
897 foo->Call(env->Global(), 0, NULL); 897 foo->Call(env->Global(), 0, NULL);
898 CHECK_EQ(0, break_point_hit_count); 898 CHECK_EQ(0, break_point_hit_count);
899 899
900 // Run with breakpoint 900 // Run with breakpoint
901 int bp = SetBreakPoint(foo, 0); 901 int bp = SetBreakPoint(foo, 0);
902 foo->Call(env->Global(), 0, NULL); 902 foo->Call(env->Global(), 0, NULL);
903 CHECK_EQ(1, break_point_hit_count); 903 CHECK_EQ(1, break_point_hit_count);
904 foo->Call(env->Global(), 0, NULL); 904 foo->Call(env->Global(), 0, NULL);
905 CHECK_EQ(2, break_point_hit_count); 905 CHECK_EQ(2, break_point_hit_count);
906 906
907 // Run without breakpoints. 907 // Run without breakpoints.
908 ClearBreakPoint(bp); 908 ClearBreakPoint(bp);
909 foo->Call(env->Global(), 0, NULL); 909 foo->Call(env->Global(), 0, NULL);
910 CHECK_EQ(2, break_point_hit_count); 910 CHECK_EQ(2, break_point_hit_count);
911 911
912 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 912 v8::Debug::SetDebugEventListener(NULL);
913 } 913 }
914 914
915 915
916 // Test that a break point can be set at a return store location. 916 // Test that a break point can be set at a return store location.
917 TEST(BreakPointReturn) { 917 TEST(BreakPointReturn) {
918 break_point_hit_count = 0; 918 break_point_hit_count = 0;
919 v8::HandleScope scope; 919 v8::HandleScope scope;
920 DebugLocalContext env; 920 DebugLocalContext env;
921 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 921 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
922 v8::Undefined()); 922 v8::Undefined());
923 v8::Script::Compile(v8::String::New("function foo(){}"))->Run(); 923 v8::Script::Compile(v8::String::New("function foo(){}"))->Run();
924 v8::Local<v8::Function> foo = 924 v8::Local<v8::Function> foo =
925 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 925 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
926 926
927 // Run without breakpoints. 927 // Run without breakpoints.
928 foo->Call(env->Global(), 0, NULL); 928 foo->Call(env->Global(), 0, NULL);
929 CHECK_EQ(0, break_point_hit_count); 929 CHECK_EQ(0, break_point_hit_count);
930 930
931 // Run with breakpoint 931 // Run with breakpoint
932 int bp = SetBreakPoint(foo, 0); 932 int bp = SetBreakPoint(foo, 0);
933 foo->Call(env->Global(), 0, NULL); 933 foo->Call(env->Global(), 0, NULL);
934 CHECK_EQ(1, break_point_hit_count); 934 CHECK_EQ(1, break_point_hit_count);
935 foo->Call(env->Global(), 0, NULL); 935 foo->Call(env->Global(), 0, NULL);
936 CHECK_EQ(2, break_point_hit_count); 936 CHECK_EQ(2, break_point_hit_count);
937 937
938 // Run without breakpoints. 938 // Run without breakpoints.
939 ClearBreakPoint(bp); 939 ClearBreakPoint(bp);
940 foo->Call(env->Global(), 0, NULL); 940 foo->Call(env->Global(), 0, NULL);
941 CHECK_EQ(2, break_point_hit_count); 941 CHECK_EQ(2, break_point_hit_count);
942 942
943 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 943 v8::Debug::SetDebugEventListener(NULL);
944 } 944 }
945 945
946 946
947 static void CallWithBreakPoints(v8::Local<v8::Object> recv, 947 static void CallWithBreakPoints(v8::Local<v8::Object> recv,
948 v8::Local<v8::Function> f, 948 v8::Local<v8::Function> f,
949 int break_point_count, 949 int break_point_count,
950 int call_count) { 950 int call_count) {
951 break_point_hit_count = 0; 951 break_point_hit_count = 0;
952 for (int i = 0; i < call_count; i++) { 952 for (int i = 0; i < call_count; i++) {
953 f->Call(recv, 0, NULL); 953 f->Call(recv, 0, NULL);
954 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); 954 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count);
955 } 955 }
956 } 956 }
957 957
958 // Test GC during break point processing. 958 // Test GC during break point processing.
959 TEST(GCDuringBreakPointProcessing) { 959 TEST(GCDuringBreakPointProcessing) {
960 break_point_hit_count = 0; 960 break_point_hit_count = 0;
961 v8::HandleScope scope; 961 v8::HandleScope scope;
962 DebugLocalContext env; 962 DebugLocalContext env;
963 963
964 v8::Debug::AddDebugEventListener(DebugEventBreakPointCollectGarbage, 964 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage,
965 v8::Undefined()); 965 v8::Undefined());
966 v8::Local<v8::Function> foo; 966 v8::Local<v8::Function> foo;
967 967
968 // Test IC store break point with garbage collection. 968 // Test IC store break point with garbage collection.
969 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 969 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
970 SetBreakPoint(foo, 0); 970 SetBreakPoint(foo, 0);
971 CallWithBreakPoints(env->Global(), foo, 1, 10); 971 CallWithBreakPoints(env->Global(), foo, 1, 10);
972 972
973 // Test IC load break point with garbage collection. 973 // Test IC load break point with garbage collection.
974 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 974 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
975 SetBreakPoint(foo, 0); 975 SetBreakPoint(foo, 0);
976 CallWithBreakPoints(env->Global(), foo, 1, 10); 976 CallWithBreakPoints(env->Global(), foo, 1, 10);
977 977
978 // Test IC call break point with garbage collection. 978 // Test IC call break point with garbage collection.
979 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 979 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
980 SetBreakPoint(foo, 0); 980 SetBreakPoint(foo, 0);
981 CallWithBreakPoints(env->Global(), foo, 1, 10); 981 CallWithBreakPoints(env->Global(), foo, 1, 10);
982 982
983 // Test return break point with garbage collection. 983 // Test return break point with garbage collection.
984 foo = CompileFunction(&env, "function foo(){}", "foo"); 984 foo = CompileFunction(&env, "function foo(){}", "foo");
985 SetBreakPoint(foo, 0); 985 SetBreakPoint(foo, 0);
986 CallWithBreakPoints(env->Global(), foo, 1, 25); 986 CallWithBreakPoints(env->Global(), foo, 1, 25);
987 987
988 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointCollectGarbage); 988 v8::Debug::SetDebugEventListener(NULL);
989 } 989 }
990 990
991 991
992 // Call the function three times with different garbage collections in between 992 // Call the function three times with different garbage collections in between
993 // and make sure that the break point survives. 993 // and make sure that the break point survives.
994 static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { 994 static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) {
995 break_point_hit_count = 0; 995 break_point_hit_count = 0;
996 996
997 for (int i = 0; i < 3; i++) { 997 for (int i = 0; i < 3; i++) {
998 // Call function. 998 // Call function.
(...skipping 12 matching lines...) Expand all
1011 } 1011 }
1012 } 1012 }
1013 1013
1014 1014
1015 // Test that a break point can be set at a return store location. 1015 // Test that a break point can be set at a return store location.
1016 TEST(BreakPointSurviveGC) { 1016 TEST(BreakPointSurviveGC) {
1017 break_point_hit_count = 0; 1017 break_point_hit_count = 0;
1018 v8::HandleScope scope; 1018 v8::HandleScope scope;
1019 DebugLocalContext env; 1019 DebugLocalContext env;
1020 1020
1021 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1021 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1022 v8::Undefined()); 1022 v8::Undefined());
1023 v8::Local<v8::Function> foo; 1023 v8::Local<v8::Function> foo;
1024 1024
1025 // Test IC store break point with garbage collection. 1025 // Test IC store break point with garbage collection.
1026 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1026 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
1027 SetBreakPoint(foo, 0); 1027 SetBreakPoint(foo, 0);
1028 CallAndGC(env->Global(), foo); 1028 CallAndGC(env->Global(), foo);
1029 1029
1030 // Test IC load break point with garbage collection. 1030 // Test IC load break point with garbage collection.
1031 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 1031 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
1032 SetBreakPoint(foo, 0); 1032 SetBreakPoint(foo, 0);
1033 CallAndGC(env->Global(), foo); 1033 CallAndGC(env->Global(), foo);
1034 1034
1035 // Test IC call break point with garbage collection. 1035 // Test IC call break point with garbage collection.
1036 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 1036 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
1037 SetBreakPoint(foo, 0); 1037 SetBreakPoint(foo, 0);
1038 CallAndGC(env->Global(), foo); 1038 CallAndGC(env->Global(), foo);
1039 1039
1040 // Test return break point with garbage collection. 1040 // Test return break point with garbage collection.
1041 foo = CompileFunction(&env, "function foo(){}", "foo"); 1041 foo = CompileFunction(&env, "function foo(){}", "foo");
1042 SetBreakPoint(foo, 0); 1042 SetBreakPoint(foo, 0);
1043 CallAndGC(env->Global(), foo); 1043 CallAndGC(env->Global(), foo);
1044 1044
1045 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1045 v8::Debug::SetDebugEventListener(NULL);
1046 } 1046 }
1047 1047
1048 1048
1049 // Test that break points can be set using the global Debug object. 1049 // Test that break points can be set using the global Debug object.
1050 TEST(BreakPointThroughJavaScript) { 1050 TEST(BreakPointThroughJavaScript) {
1051 break_point_hit_count = 0; 1051 break_point_hit_count = 0;
1052 v8::HandleScope scope; 1052 v8::HandleScope scope;
1053 DebugLocalContext env; 1053 DebugLocalContext env;
1054 env.ExposeDebug(); 1054 env.ExposeDebug();
1055 1055
1056 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1056 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1057 v8::Undefined()); 1057 v8::Undefined());
1058 v8::Script::Compile(v8::String::New("function bar(){}"))->Run(); 1058 v8::Script::Compile(v8::String::New("function bar(){}"))->Run();
1059 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run(); 1059 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run();
1060 // 012345678901234567890 1060 // 012345678901234567890
1061 // 1 2 1061 // 1 2
1062 // Break points are set at position 3 and 9 1062 // Break points are set at position 3 and 9
1063 v8::Local<v8::Script> foo = v8::Script::Compile(v8::String::New("foo()")); 1063 v8::Local<v8::Script> foo = v8::Script::Compile(v8::String::New("foo()"));
1064 1064
1065 // Run without breakpoints. 1065 // Run without breakpoints.
1066 foo->Run(); 1066 foo->Run();
(...skipping 18 matching lines...) Expand all
1085 foo->Run(); 1085 foo->Run();
1086 CHECK_EQ(7, break_point_hit_count); 1086 CHECK_EQ(7, break_point_hit_count);
1087 foo->Run(); 1087 foo->Run();
1088 CHECK_EQ(8, break_point_hit_count); 1088 CHECK_EQ(8, break_point_hit_count);
1089 1089
1090 // Run without breakpoints. 1090 // Run without breakpoints.
1091 ClearBreakPointFromJS(bp1); 1091 ClearBreakPointFromJS(bp1);
1092 foo->Run(); 1092 foo->Run();
1093 CHECK_EQ(8, break_point_hit_count); 1093 CHECK_EQ(8, break_point_hit_count);
1094 1094
1095 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1095 v8::Debug::SetDebugEventListener(NULL);
1096 1096
1097 // Make sure that the break point numbers are consecutive. 1097 // Make sure that the break point numbers are consecutive.
1098 CHECK_EQ(1, bp1); 1098 CHECK_EQ(1, bp1);
1099 CHECK_EQ(2, bp2); 1099 CHECK_EQ(2, bp2);
1100 } 1100 }
1101 1101
1102 1102
1103 // Test that break points can be set using the global Debug object. 1103 // Test that break points can be set using the global Debug object.
1104 TEST(ScriptBreakPointThroughJavaScript) { 1104 TEST(ScriptBreakPointThroughJavaScript) {
1105 break_point_hit_count = 0; 1105 break_point_hit_count = 0;
1106 v8::HandleScope scope; 1106 v8::HandleScope scope;
1107 DebugLocalContext env; 1107 DebugLocalContext env;
1108 env.ExposeDebug(); 1108 env.ExposeDebug();
1109 1109
1110 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1110 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1111 v8::Undefined()); 1111 v8::Undefined());
1112 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run(); 1112 v8::Script::Compile(v8::String::New("function foo(){bar();bar();}"))->Run();
1113 1113
1114 v8::Local<v8::String> script = v8::String::New( 1114 v8::Local<v8::String> script = v8::String::New(
1115 "function f() {\n" 1115 "function f() {\n"
1116 " function h() {\n" 1116 " function h() {\n"
1117 " a = 0; // line 2\n" 1117 " a = 0; // line 2\n"
1118 " }\n" 1118 " }\n"
1119 " b = 1; // line 4\n" 1119 " b = 1; // line 4\n"
1120 " return h();\n" 1120 " return h();\n"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 CHECK_EQ(1, break_point_hit_count); 1199 CHECK_EQ(1, break_point_hit_count);
1200 1200
1201 // Reload the script and get g again checking that the break point survives. 1201 // Reload the script and get g again checking that the break point survives.
1202 // This tests that the function break point was converted to a script break 1202 // This tests that the function break point was converted to a script break
1203 // point. 1203 // point.
1204 v8::Script::Compile(script, &origin)->Run(); 1204 v8::Script::Compile(script, &origin)->Run();
1205 g = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("g"))); 1205 g = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("g")));
1206 g->Call(env->Global(), 0, NULL); 1206 g->Call(env->Global(), 0, NULL);
1207 CHECK_EQ(2, break_point_hit_count); 1207 CHECK_EQ(2, break_point_hit_count);
1208 1208
1209 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1209 v8::Debug::SetDebugEventListener(NULL);
1210 1210
1211 // Make sure that the break point numbers are consecutive. 1211 // Make sure that the break point numbers are consecutive.
1212 CHECK_EQ(1, sbp1); 1212 CHECK_EQ(1, sbp1);
1213 CHECK_EQ(2, sbp2); 1213 CHECK_EQ(2, sbp2);
1214 CHECK_EQ(3, sbp3); 1214 CHECK_EQ(3, sbp3);
1215 CHECK_EQ(4, sbp4); 1215 CHECK_EQ(4, sbp4);
1216 CHECK_EQ(5, sbp5); 1216 CHECK_EQ(5, sbp5);
1217 CHECK_EQ(6, sbp6); 1217 CHECK_EQ(6, sbp6);
1218 CHECK_EQ(7, bp7); 1218 CHECK_EQ(7, bp7);
1219 } 1219 }
1220 1220
1221 1221
1222 // Test conditional script break points. 1222 // Test conditional script break points.
1223 TEST(EnableDisableScriptBreakPoint) { 1223 TEST(EnableDisableScriptBreakPoint) {
1224 break_point_hit_count = 0; 1224 break_point_hit_count = 0;
1225 v8::HandleScope scope; 1225 v8::HandleScope scope;
1226 DebugLocalContext env; 1226 DebugLocalContext env;
1227 env.ExposeDebug(); 1227 env.ExposeDebug();
1228 1228
1229 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1229 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1230 v8::Undefined()); 1230 v8::Undefined());
1231 1231
1232 v8::Local<v8::String> script = v8::String::New( 1232 v8::Local<v8::String> script = v8::String::New(
1233 "function f() {\n" 1233 "function f() {\n"
1234 " a = 0; // line 1\n" 1234 " a = 0; // line 1\n"
1235 "};"); 1235 "};");
1236 1236
1237 // Compile the script and get function f. 1237 // Compile the script and get function f.
1238 v8::ScriptOrigin origin = 1238 v8::ScriptOrigin origin =
1239 v8::ScriptOrigin(v8::String::New("test")); 1239 v8::ScriptOrigin(v8::String::New("test"));
(...skipping 24 matching lines...) Expand all
1264 // Reload the script and get f again checking that the disabeling survives. 1264 // Reload the script and get f again checking that the disabeling survives.
1265 v8::Script::Compile(script, &origin)->Run(); 1265 v8::Script::Compile(script, &origin)->Run();
1266 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1266 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1267 f->Call(env->Global(), 0, NULL); 1267 f->Call(env->Global(), 0, NULL);
1268 CHECK_EQ(2, break_point_hit_count); 1268 CHECK_EQ(2, break_point_hit_count);
1269 1269
1270 EnableScriptBreakPointFromJS(sbp); 1270 EnableScriptBreakPointFromJS(sbp);
1271 f->Call(env->Global(), 0, NULL); 1271 f->Call(env->Global(), 0, NULL);
1272 CHECK_EQ(3, break_point_hit_count); 1272 CHECK_EQ(3, break_point_hit_count);
1273 1273
1274 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1274 v8::Debug::SetDebugEventListener(NULL);
1275 } 1275 }
1276 1276
1277 1277
1278 // Test conditional script break points. 1278 // Test conditional script break points.
1279 TEST(ConditionalScriptBreakPoint) { 1279 TEST(ConditionalScriptBreakPoint) {
1280 break_point_hit_count = 0; 1280 break_point_hit_count = 0;
1281 v8::HandleScope scope; 1281 v8::HandleScope scope;
1282 DebugLocalContext env; 1282 DebugLocalContext env;
1283 env.ExposeDebug(); 1283 env.ExposeDebug();
1284 1284
1285 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1285 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1286 v8::Undefined()); 1286 v8::Undefined());
1287 1287
1288 v8::Local<v8::String> script = v8::String::New( 1288 v8::Local<v8::String> script = v8::String::New(
1289 "count = 0;\n" 1289 "count = 0;\n"
1290 "function f() {\n" 1290 "function f() {\n"
1291 " g(count++); // line 2\n" 1291 " g(count++); // line 2\n"
1292 "};\n" 1292 "};\n"
1293 "function g(x) {\n" 1293 "function g(x) {\n"
1294 " var a=x; // line 5\n" 1294 " var a=x; // line 5\n"
1295 "};"); 1295 "};");
(...skipping 29 matching lines...) Expand all
1325 // Reload the script and get f again checking that the condition survives. 1325 // Reload the script and get f again checking that the condition survives.
1326 v8::Script::Compile(script, &origin)->Run(); 1326 v8::Script::Compile(script, &origin)->Run();
1327 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1327 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1328 1328
1329 break_point_hit_count = 0; 1329 break_point_hit_count = 0;
1330 for (int i = 0; i < 10; i++) { 1330 for (int i = 0; i < 10; i++) {
1331 f->Call(env->Global(), 0, NULL); 1331 f->Call(env->Global(), 0, NULL);
1332 } 1332 }
1333 CHECK_EQ(5, break_point_hit_count); 1333 CHECK_EQ(5, break_point_hit_count);
1334 1334
1335 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1335 v8::Debug::SetDebugEventListener(NULL);
1336 } 1336 }
1337 1337
1338 1338
1339 // Test ignore count on script break points. 1339 // Test ignore count on script break points.
1340 TEST(ScriptBreakPointIgnoreCount) { 1340 TEST(ScriptBreakPointIgnoreCount) {
1341 break_point_hit_count = 0; 1341 break_point_hit_count = 0;
1342 v8::HandleScope scope; 1342 v8::HandleScope scope;
1343 DebugLocalContext env; 1343 DebugLocalContext env;
1344 env.ExposeDebug(); 1344 env.ExposeDebug();
1345 1345
1346 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1346 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1347 v8::Undefined()); 1347 v8::Undefined());
1348 1348
1349 v8::Local<v8::String> script = v8::String::New( 1349 v8::Local<v8::String> script = v8::String::New(
1350 "function f() {\n" 1350 "function f() {\n"
1351 " a = 0; // line 1\n" 1351 " a = 0; // line 1\n"
1352 "};"); 1352 "};");
1353 1353
1354 // Compile the script and get function f. 1354 // Compile the script and get function f.
1355 v8::ScriptOrigin origin = 1355 v8::ScriptOrigin origin =
1356 v8::ScriptOrigin(v8::String::New("test")); 1356 v8::ScriptOrigin(v8::String::New("test"));
(...skipping 22 matching lines...) Expand all
1379 // Reload the script and get f again checking that the ignore survives. 1379 // Reload the script and get f again checking that the ignore survives.
1380 v8::Script::Compile(script, &origin)->Run(); 1380 v8::Script::Compile(script, &origin)->Run();
1381 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1381 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1382 1382
1383 break_point_hit_count = 0; 1383 break_point_hit_count = 0;
1384 for (int i = 0; i < 10; i++) { 1384 for (int i = 0; i < 10; i++) {
1385 f->Call(env->Global(), 0, NULL); 1385 f->Call(env->Global(), 0, NULL);
1386 } 1386 }
1387 CHECK_EQ(5, break_point_hit_count); 1387 CHECK_EQ(5, break_point_hit_count);
1388 1388
1389 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1389 v8::Debug::SetDebugEventListener(NULL);
1390 } 1390 }
1391 1391
1392 1392
1393 // Test that script break points survive when a script is reloaded. 1393 // Test that script break points survive when a script is reloaded.
1394 TEST(ScriptBreakPointReload) { 1394 TEST(ScriptBreakPointReload) {
1395 break_point_hit_count = 0; 1395 break_point_hit_count = 0;
1396 v8::HandleScope scope; 1396 v8::HandleScope scope;
1397 DebugLocalContext env; 1397 DebugLocalContext env;
1398 env.ExposeDebug(); 1398 env.ExposeDebug();
1399 1399
1400 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1400 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1401 v8::Undefined()); 1401 v8::Undefined());
1402 1402
1403 v8::Local<v8::Function> f; 1403 v8::Local<v8::Function> f;
1404 v8::Local<v8::String> script = v8::String::New( 1404 v8::Local<v8::String> script = v8::String::New(
1405 "function f() {\n" 1405 "function f() {\n"
1406 " function h() {\n" 1406 " function h() {\n"
1407 " a = 0; // line 2\n" 1407 " a = 0; // line 2\n"
1408 " }\n" 1408 " }\n"
1409 " b = 1; // line 4\n" 1409 " b = 1; // line 4\n"
1410 " return h();\n" 1410 " return h();\n"
(...skipping 26 matching lines...) Expand all
1437 1437
1438 // Compile the script again and get the function. 1438 // Compile the script again and get the function.
1439 v8::Script::Compile(script, &origin_1)->Run(); 1439 v8::Script::Compile(script, &origin_1)->Run();
1440 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); 1440 f = v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
1441 1441
1442 // Call f and check that the script break point is active. 1442 // Call f and check that the script break point is active.
1443 break_point_hit_count = 0; 1443 break_point_hit_count = 0;
1444 f->Call(env->Global(), 0, NULL); 1444 f->Call(env->Global(), 0, NULL);
1445 CHECK_EQ(1, break_point_hit_count); 1445 CHECK_EQ(1, break_point_hit_count);
1446 1446
1447 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1447 v8::Debug::SetDebugEventListener(NULL);
1448 } 1448 }
1449 1449
1450 1450
1451 // Test when several scripts has the same script data 1451 // Test when several scripts has the same script data
1452 TEST(ScriptBreakPointMultiple) { 1452 TEST(ScriptBreakPointMultiple) {
1453 break_point_hit_count = 0; 1453 break_point_hit_count = 0;
1454 v8::HandleScope scope; 1454 v8::HandleScope scope;
1455 DebugLocalContext env; 1455 DebugLocalContext env;
1456 env.ExposeDebug(); 1456 env.ExposeDebug();
1457 1457
1458 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1458 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1459 v8::Undefined()); 1459 v8::Undefined());
1460 1460
1461 v8::Local<v8::Function> f; 1461 v8::Local<v8::Function> f;
1462 v8::Local<v8::String> script_f = v8::String::New( 1462 v8::Local<v8::String> script_f = v8::String::New(
1463 "function f() {\n" 1463 "function f() {\n"
1464 " a = 0; // line 1\n" 1464 " a = 0; // line 1\n"
1465 "}"); 1465 "}");
1466 1466
1467 v8::Local<v8::Function> g; 1467 v8::Local<v8::Function> g;
1468 v8::Local<v8::String> script_g = v8::String::New( 1468 v8::Local<v8::String> script_g = v8::String::New(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1502 // Set script break point with the scripts loaded. 1502 // Set script break point with the scripts loaded.
1503 sbp = SetScriptBreakPointFromJS("test", 1, 0); 1503 sbp = SetScriptBreakPointFromJS("test", 1, 0);
1504 1504
1505 // Call f and g and check that the script break point is active. 1505 // Call f and g and check that the script break point is active.
1506 break_point_hit_count = 0; 1506 break_point_hit_count = 0;
1507 f->Call(env->Global(), 0, NULL); 1507 f->Call(env->Global(), 0, NULL);
1508 CHECK_EQ(1, break_point_hit_count); 1508 CHECK_EQ(1, break_point_hit_count);
1509 g->Call(env->Global(), 0, NULL); 1509 g->Call(env->Global(), 0, NULL);
1510 CHECK_EQ(2, break_point_hit_count); 1510 CHECK_EQ(2, break_point_hit_count);
1511 1511
1512 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1512 v8::Debug::SetDebugEventListener(NULL);
1513 } 1513 }
1514 1514
1515 1515
1516 // Test the script origin which has both name and line offset. 1516 // Test the script origin which has both name and line offset.
1517 TEST(ScriptBreakPointLineOffset) { 1517 TEST(ScriptBreakPointLineOffset) {
1518 break_point_hit_count = 0; 1518 break_point_hit_count = 0;
1519 v8::HandleScope scope; 1519 v8::HandleScope scope;
1520 DebugLocalContext env; 1520 DebugLocalContext env;
1521 env.ExposeDebug(); 1521 env.ExposeDebug();
1522 1522
1523 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1523 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1524 v8::Undefined()); 1524 v8::Undefined());
1525 1525
1526 v8::Local<v8::Function> f; 1526 v8::Local<v8::Function> f;
1527 v8::Local<v8::String> script = v8::String::New( 1527 v8::Local<v8::String> script = v8::String::New(
1528 "function f() {\n" 1528 "function f() {\n"
1529 " a = 0; // line 8 as this script has line offset 7\n" 1529 " a = 0; // line 8 as this script has line offset 7\n"
1530 " b = 0; // line 9 as this script has line offset 7\n" 1530 " b = 0; // line 9 as this script has line offset 7\n"
1531 "}"); 1531 "}");
1532 1532
1533 // Create script origin both name and line offset. 1533 // Create script origin both name and line offset.
(...skipping 23 matching lines...) Expand all
1557 CHECK_EQ(0, break_point_hit_count); 1557 CHECK_EQ(0, break_point_hit_count);
1558 1558
1559 // Set a script break point with the script loaded. 1559 // Set a script break point with the script loaded.
1560 sbp1 = SetScriptBreakPointFromJS("test.html", 9, 0); 1560 sbp1 = SetScriptBreakPointFromJS("test.html", 9, 0);
1561 1561
1562 // Call f and check that the script break point is active. 1562 // Call f and check that the script break point is active.
1563 break_point_hit_count = 0; 1563 break_point_hit_count = 0;
1564 f->Call(env->Global(), 0, NULL); 1564 f->Call(env->Global(), 0, NULL);
1565 CHECK_EQ(1, break_point_hit_count); 1565 CHECK_EQ(1, break_point_hit_count);
1566 1566
1567 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1567 v8::Debug::SetDebugEventListener(NULL);
1568 } 1568 }
1569 1569
1570 1570
1571 // Test script break points set on lines. 1571 // Test script break points set on lines.
1572 TEST(ScriptBreakPointLine) { 1572 TEST(ScriptBreakPointLine) {
1573 v8::HandleScope scope; 1573 v8::HandleScope scope;
1574 DebugLocalContext env; 1574 DebugLocalContext env;
1575 env.ExposeDebug(); 1575 env.ExposeDebug();
1576 1576
1577 // Create a function for checking the function when hitting a break point. 1577 // Create a function for checking the function when hitting a break point.
1578 frame_function_name = CompileFunction(&env, 1578 frame_function_name = CompileFunction(&env,
1579 frame_function_name_source, 1579 frame_function_name_source,
1580 "frame_function_name"); 1580 "frame_function_name");
1581 1581
1582 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1582 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1583 v8::Undefined()); 1583 v8::Undefined());
1584 1584
1585 v8::Local<v8::Function> f; 1585 v8::Local<v8::Function> f;
1586 v8::Local<v8::Function> g; 1586 v8::Local<v8::Function> g;
1587 v8::Local<v8::String> script = v8::String::New( 1587 v8::Local<v8::String> script = v8::String::New(
1588 "a = 0 // line 0\n" 1588 "a = 0 // line 0\n"
1589 "function f() {\n" 1589 "function f() {\n"
1590 " a = 1; // line 2\n" 1590 " a = 1; // line 2\n"
1591 "}\n" 1591 "}\n"
1592 " a = 2; // line 4\n" 1592 " a = 2; // line 4\n"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1662 1662
1663 // Clear the last break points, and reload the script which should not hit any 1663 // Clear the last break points, and reload the script which should not hit any
1664 // break points. 1664 // break points.
1665 ClearBreakPointFromJS(sbp1); 1665 ClearBreakPointFromJS(sbp1);
1666 ClearBreakPointFromJS(sbp5); 1666 ClearBreakPointFromJS(sbp5);
1667 ClearBreakPointFromJS(sbp6); 1667 ClearBreakPointFromJS(sbp6);
1668 break_point_hit_count = 0; 1668 break_point_hit_count = 0;
1669 v8::Script::Compile(script, &origin)->Run(); 1669 v8::Script::Compile(script, &origin)->Run();
1670 CHECK_EQ(0, break_point_hit_count); 1670 CHECK_EQ(0, break_point_hit_count);
1671 1671
1672 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1672 v8::Debug::SetDebugEventListener(NULL);
1673 } 1673 }
1674 1674
1675 1675
1676 // Test that it is possible to remove the last break point for a function 1676 // Test that it is possible to remove the last break point for a function
1677 // inside the break handling of that break point. 1677 // inside the break handling of that break point.
1678 TEST(RemoveBreakPointInBreak) { 1678 TEST(RemoveBreakPointInBreak) {
1679 v8::HandleScope scope; 1679 v8::HandleScope scope;
1680 DebugLocalContext env; 1680 DebugLocalContext env;
1681 1681
1682 v8::Local<v8::Function> foo = 1682 v8::Local<v8::Function> foo =
1683 CompileFunction(&env, "function foo(){a=1;}", "foo"); 1683 CompileFunction(&env, "function foo(){a=1;}", "foo");
1684 debug_event_remove_break_point = SetBreakPoint(foo, 0); 1684 debug_event_remove_break_point = SetBreakPoint(foo, 0);
1685 1685
1686 // Register the debug event listener pasing the function 1686 // Register the debug event listener pasing the function
1687 v8::Debug::AddDebugEventListener(DebugEventRemoveBreakPoint, foo); 1687 v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo);
1688 1688
1689 break_point_hit_count = 0; 1689 break_point_hit_count = 0;
1690 foo->Call(env->Global(), 0, NULL); 1690 foo->Call(env->Global(), 0, NULL);
1691 CHECK_EQ(1, break_point_hit_count); 1691 CHECK_EQ(1, break_point_hit_count);
1692 1692
1693 break_point_hit_count = 0; 1693 break_point_hit_count = 0;
1694 foo->Call(env->Global(), 0, NULL); 1694 foo->Call(env->Global(), 0, NULL);
1695 CHECK_EQ(0, break_point_hit_count); 1695 CHECK_EQ(0, break_point_hit_count);
1696 1696
1697 v8::Debug::RemoveDebugEventListener(DebugEventRemoveBreakPoint); 1697 v8::Debug::SetDebugEventListener(NULL);
1698 } 1698 }
1699 1699
1700 1700
1701 // Test that the debugger statement causes a break. 1701 // Test that the debugger statement causes a break.
1702 TEST(DebuggerStatement) { 1702 TEST(DebuggerStatement) {
1703 break_point_hit_count = 0; 1703 break_point_hit_count = 0;
1704 v8::HandleScope scope; 1704 v8::HandleScope scope;
1705 DebugLocalContext env; 1705 DebugLocalContext env;
1706 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount, 1706 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount,
1707 v8::Undefined()); 1707 v8::Undefined());
1708 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run(); 1708 v8::Script::Compile(v8::String::New("function bar(){debugger}"))->Run();
1709 v8::Script::Compile(v8::String::New( 1709 v8::Script::Compile(v8::String::New(
1710 "function foo(){debugger;debugger;}"))->Run(); 1710 "function foo(){debugger;debugger;}"))->Run();
1711 v8::Local<v8::Function> foo = 1711 v8::Local<v8::Function> foo =
1712 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); 1712 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo")));
1713 v8::Local<v8::Function> bar = 1713 v8::Local<v8::Function> bar =
1714 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar"))); 1714 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("bar")));
1715 1715
1716 // Run function with debugger statement 1716 // Run function with debugger statement
1717 bar->Call(env->Global(), 0, NULL); 1717 bar->Call(env->Global(), 0, NULL);
1718 CHECK_EQ(1, break_point_hit_count); 1718 CHECK_EQ(1, break_point_hit_count);
1719 1719
1720 // Run function with two debugger statement 1720 // Run function with two debugger statement
1721 foo->Call(env->Global(), 0, NULL); 1721 foo->Call(env->Global(), 0, NULL);
1722 CHECK_EQ(3, break_point_hit_count); 1722 CHECK_EQ(3, break_point_hit_count);
1723 1723
1724 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1724 v8::Debug::SetDebugEventListener(NULL);
1725 } 1725 }
1726 1726
1727 1727
1728 // Thest that the evaluation of expressions when a break point is hit generates 1728 // Thest that the evaluation of expressions when a break point is hit generates
1729 // the correct results. 1729 // the correct results.
1730 TEST(DebugEvaluate) { 1730 TEST(DebugEvaluate) {
1731 v8::HandleScope scope; 1731 v8::HandleScope scope;
1732 DebugLocalContext env; 1732 DebugLocalContext env;
1733 env.ExposeDebug(); 1733 env.ExposeDebug();
1734 1734
1735 // Create a function for checking the evaluation when hitting a break point. 1735 // Create a function for checking the evaluation when hitting a break point.
1736 evaluate_check_function = CompileFunction(&env, 1736 evaluate_check_function = CompileFunction(&env,
1737 evaluate_check_source, 1737 evaluate_check_source,
1738 "evaluate_check"); 1738 "evaluate_check");
1739 // Register the debug event listener 1739 // Register the debug event listener
1740 v8::Debug::AddDebugEventListener(DebugEventEvaluate); 1740 v8::Debug::SetDebugEventListener(DebugEventEvaluate);
1741 1741
1742 // Different expected vaules of x and a when in a break point (u = undefined, 1742 // Different expected vaules of x and a when in a break point (u = undefined,
1743 // d = Hello, world!). 1743 // d = Hello, world!).
1744 struct EvaluateCheck checks_uu[] = { 1744 struct EvaluateCheck checks_uu[] = {
1745 {"x", v8::Undefined()}, 1745 {"x", v8::Undefined()},
1746 {"a", v8::Undefined()}, 1746 {"a", v8::Undefined()},
1747 {NULL, v8::Handle<v8::Value>()} 1747 {NULL, v8::Handle<v8::Value>()}
1748 }; 1748 };
1749 struct EvaluateCheck checks_hu[] = { 1749 struct EvaluateCheck checks_hu[] = {
1750 {"x", v8::String::New("Hello, world!")}, 1750 {"x", v8::String::New("Hello, world!")},
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1828 1828
1829 // Call bar setting breakpoint after a=x in barbar and parameter 1829 // Call bar setting breakpoint after a=x in barbar and parameter
1830 // "Hello, world!". 1830 // "Hello, world!".
1831 checks = checks_hh; 1831 checks = checks_hh;
1832 v8::Handle<v8::Value> argv_bar_3[2] = { 1832 v8::Handle<v8::Value> argv_bar_3[2] = {
1833 v8::String::New("Hello, world!"), 1833 v8::String::New("Hello, world!"),
1834 v8::Number::New(barbar_break_position + 1) 1834 v8::Number::New(barbar_break_position + 1)
1835 }; 1835 };
1836 bar->Call(env->Global(), 2, argv_bar_3); 1836 bar->Call(env->Global(), 2, argv_bar_3);
1837 1837
1838 v8::Debug::RemoveDebugEventListener(DebugEventEvaluate); 1838 v8::Debug::SetDebugEventListener(NULL);
1839 } 1839 }
1840 1840
1841 1841
1842 // Simple test of the stepping mechanism using only store ICs. 1842 // Simple test of the stepping mechanism using only store ICs.
1843 TEST(DebugStepLinear) { 1843 TEST(DebugStepLinear) {
1844 v8::HandleScope scope; 1844 v8::HandleScope scope;
1845 DebugLocalContext env; 1845 DebugLocalContext env;
1846 1846
1847 // Create a function for testing stepping. 1847 // Create a function for testing stepping.
1848 v8::Local<v8::Function> foo = CompileFunction(&env, 1848 v8::Local<v8::Function> foo = CompileFunction(&env,
1849 "function foo(){a=1;b=1;c=1;}", 1849 "function foo(){a=1;b=1;c=1;}",
1850 "foo"); 1850 "foo");
1851 SetBreakPoint(foo, 3); 1851 SetBreakPoint(foo, 3);
1852 1852
1853 // Register a debug event listener which steps and counts. 1853 // Register a debug event listener which steps and counts.
1854 v8::Debug::AddDebugEventListener(DebugEventStep); 1854 v8::Debug::SetDebugEventListener(DebugEventStep);
1855 1855
1856 step_action = StepIn; 1856 step_action = StepIn;
1857 break_point_hit_count = 0; 1857 break_point_hit_count = 0;
1858 foo->Call(env->Global(), 0, NULL); 1858 foo->Call(env->Global(), 0, NULL);
1859 1859
1860 // With stepping all break locations are hit. 1860 // With stepping all break locations are hit.
1861 CHECK_EQ(4, break_point_hit_count); 1861 CHECK_EQ(4, break_point_hit_count);
1862 1862
1863 v8::Debug::RemoveDebugEventListener(DebugEventStep); 1863 v8::Debug::SetDebugEventListener(NULL);
1864 1864
1865 // Register a debug event listener which just counts. 1865 // Register a debug event listener which just counts.
1866 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount); 1866 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
1867 1867
1868 break_point_hit_count = 0; 1868 break_point_hit_count = 0;
1869 foo->Call(env->Global(), 0, NULL); 1869 foo->Call(env->Global(), 0, NULL);
1870 1870
1871 // Without stepping only active break points are hit. 1871 // Without stepping only active break points are hit.
1872 CHECK_EQ(1, break_point_hit_count); 1872 CHECK_EQ(1, break_point_hit_count);
1873 1873
1874 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1874 v8::Debug::SetDebugEventListener(NULL);
1875 } 1875 }
1876 1876
1877 1877
1878 // Test the stepping mechanism with different ICs. 1878 // Test the stepping mechanism with different ICs.
1879 TEST(DebugStepLinearMixedICs) { 1879 TEST(DebugStepLinearMixedICs) {
1880 v8::HandleScope scope; 1880 v8::HandleScope scope;
1881 DebugLocalContext env; 1881 DebugLocalContext env;
1882 1882
1883 // Create a function for testing stepping. 1883 // Create a function for testing stepping.
1884 v8::Local<v8::Function> foo = CompileFunction(&env, 1884 v8::Local<v8::Function> foo = CompileFunction(&env,
1885 "function bar() {};" 1885 "function bar() {};"
1886 "function foo() {" 1886 "function foo() {"
1887 " var x;" 1887 " var x;"
1888 " var index='name';" 1888 " var index='name';"
1889 " var y = {};" 1889 " var y = {};"
1890 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); 1890 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo");
1891 SetBreakPoint(foo, 0); 1891 SetBreakPoint(foo, 0);
1892 1892
1893 // Register a debug event listener which steps and counts. 1893 // Register a debug event listener which steps and counts.
1894 v8::Debug::AddDebugEventListener(DebugEventStep); 1894 v8::Debug::SetDebugEventListener(DebugEventStep);
1895 1895
1896 step_action = StepIn; 1896 step_action = StepIn;
1897 break_point_hit_count = 0; 1897 break_point_hit_count = 0;
1898 foo->Call(env->Global(), 0, NULL); 1898 foo->Call(env->Global(), 0, NULL);
1899 1899
1900 // With stepping all break locations are hit. For ARM the keyed load/store 1900 // With stepping all break locations are hit. For ARM the keyed load/store
1901 // is not hit as they are not implemented as ICs. 1901 // is not hit as they are not implemented as ICs.
1902 #if defined (__arm__) || defined(__thumb__) 1902 #if defined (__arm__) || defined(__thumb__)
1903 CHECK_EQ(6, break_point_hit_count); 1903 CHECK_EQ(6, break_point_hit_count);
1904 #else 1904 #else
1905 CHECK_EQ(8, break_point_hit_count); 1905 CHECK_EQ(8, break_point_hit_count);
1906 #endif 1906 #endif
1907 1907
1908 v8::Debug::RemoveDebugEventListener(DebugEventStep); 1908 v8::Debug::SetDebugEventListener(NULL);
1909 1909
1910 // Register a debug event listener which just counts. 1910 // Register a debug event listener which just counts.
1911 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount); 1911 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
1912 1912
1913 break_point_hit_count = 0; 1913 break_point_hit_count = 0;
1914 foo->Call(env->Global(), 0, NULL); 1914 foo->Call(env->Global(), 0, NULL);
1915 1915
1916 // Without stepping only active break points are hit. 1916 // Without stepping only active break points are hit.
1917 CHECK_EQ(1, break_point_hit_count); 1917 CHECK_EQ(1, break_point_hit_count);
1918 1918
1919 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 1919 v8::Debug::SetDebugEventListener(NULL);
1920 } 1920 }
1921 1921
1922 1922
1923 TEST(DebugStepIf) { 1923 TEST(DebugStepIf) {
1924 v8::HandleScope scope; 1924 v8::HandleScope scope;
1925 DebugLocalContext env; 1925 DebugLocalContext env;
1926 1926
1927 // Register a debug event listener which steps and counts. 1927 // Register a debug event listener which steps and counts.
1928 v8::Debug::AddDebugEventListener(DebugEventStep); 1928 v8::Debug::SetDebugEventListener(DebugEventStep);
1929 1929
1930 // Create a function for testing stepping. 1930 // Create a function for testing stepping.
1931 const int argc = 1; 1931 const int argc = 1;
1932 const char* src = "function foo(x) { " 1932 const char* src = "function foo(x) { "
1933 " a = 1;" 1933 " a = 1;"
1934 " if (x) {" 1934 " if (x) {"
1935 " b = 1;" 1935 " b = 1;"
1936 " } else {" 1936 " } else {"
1937 " c = 1;" 1937 " c = 1;"
1938 " d = 1;" 1938 " d = 1;"
(...skipping 10 matching lines...) Expand all
1949 CHECK_EQ(3, break_point_hit_count); 1949 CHECK_EQ(3, break_point_hit_count);
1950 1950
1951 // Stepping through the false part. 1951 // Stepping through the false part.
1952 step_action = StepIn; 1952 step_action = StepIn;
1953 break_point_hit_count = 0; 1953 break_point_hit_count = 0;
1954 v8::Handle<v8::Value> argv_false[argc] = { v8::False() }; 1954 v8::Handle<v8::Value> argv_false[argc] = { v8::False() };
1955 foo->Call(env->Global(), argc, argv_false); 1955 foo->Call(env->Global(), argc, argv_false);
1956 CHECK_EQ(4, break_point_hit_count); 1956 CHECK_EQ(4, break_point_hit_count);
1957 1957
1958 // Get rid of the debug event listener. 1958 // Get rid of the debug event listener.
1959 v8::Debug::RemoveDebugEventListener(DebugEventStep); 1959 v8::Debug::SetDebugEventListener(NULL);
1960 } 1960 }
1961 1961
1962 1962
1963 TEST(DebugStepSwitch) { 1963 TEST(DebugStepSwitch) {
1964 v8::HandleScope scope; 1964 v8::HandleScope scope;
1965 DebugLocalContext env; 1965 DebugLocalContext env;
1966 1966
1967 // Register a debug event listener which steps and counts. 1967 // Register a debug event listener which steps and counts.
1968 v8::Debug::AddDebugEventListener(DebugEventStep); 1968 v8::Debug::SetDebugEventListener(DebugEventStep);
1969 1969
1970 // Create a function for testing stepping. 1970 // Create a function for testing stepping.
1971 const int argc = 1; 1971 const int argc = 1;
1972 const char* src = "function foo(x) { " 1972 const char* src = "function foo(x) { "
1973 " a = 1;" 1973 " a = 1;"
1974 " switch (x) {" 1974 " switch (x) {"
1975 " case 1:" 1975 " case 1:"
1976 " b = 1;" 1976 " b = 1;"
1977 " case 2:" 1977 " case 2:"
1978 " c = 1;" 1978 " c = 1;"
(...skipping 22 matching lines...) Expand all
2001 CHECK_EQ(3, break_point_hit_count); 2001 CHECK_EQ(3, break_point_hit_count);
2002 2002
2003 // Last case. 2003 // Last case.
2004 step_action = StepIn; 2004 step_action = StepIn;
2005 break_point_hit_count = 0; 2005 break_point_hit_count = 0;
2006 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) }; 2006 v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) };
2007 foo->Call(env->Global(), argc, argv_3); 2007 foo->Call(env->Global(), argc, argv_3);
2008 CHECK_EQ(4, break_point_hit_count); 2008 CHECK_EQ(4, break_point_hit_count);
2009 2009
2010 // Get rid of the debug event listener. 2010 // Get rid of the debug event listener.
2011 v8::Debug::RemoveDebugEventListener(DebugEventStep); 2011 v8::Debug::SetDebugEventListener(NULL);
2012 } 2012 }
2013 2013
2014 2014
2015 TEST(DebugStepFor) { 2015 TEST(DebugStepFor) {
2016 v8::HandleScope scope; 2016 v8::HandleScope scope;
2017 DebugLocalContext env; 2017 DebugLocalContext env;
2018 2018
2019 // Register a debug event listener which steps and counts. 2019 // Register a debug event listener which steps and counts.
2020 v8::Debug::AddDebugEventListener(DebugEventStep); 2020 v8::Debug::SetDebugEventListener(DebugEventStep);
2021 2021
2022 // Create a function for testing stepping. 2022 // Create a function for testing stepping.
2023 const int argc = 1; 2023 const int argc = 1;
2024 const char* src = "function foo(x) { " 2024 const char* src = "function foo(x) { "
2025 " a = 1;" 2025 " a = 1;"
2026 " for (i = 0; i < x; i++) {" 2026 " for (i = 0; i < x; i++) {"
2027 " b = 1;" 2027 " b = 1;"
2028 " }" 2028 " }"
2029 "}"; 2029 "}";
2030 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 2030 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
2031 SetBreakPoint(foo, 8); // "a = 1;" 2031 SetBreakPoint(foo, 8); // "a = 1;"
2032 2032
2033 // Looping 10 times. 2033 // Looping 10 times.
2034 step_action = StepIn; 2034 step_action = StepIn;
2035 break_point_hit_count = 0; 2035 break_point_hit_count = 0;
2036 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 2036 v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
2037 foo->Call(env->Global(), argc, argv_10); 2037 foo->Call(env->Global(), argc, argv_10);
2038 CHECK_EQ(23, break_point_hit_count); 2038 CHECK_EQ(23, break_point_hit_count);
2039 2039
2040 // Looping 100 times. 2040 // Looping 100 times.
2041 step_action = StepIn; 2041 step_action = StepIn;
2042 break_point_hit_count = 0; 2042 break_point_hit_count = 0;
2043 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 2043 v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
2044 foo->Call(env->Global(), argc, argv_100); 2044 foo->Call(env->Global(), argc, argv_100);
2045 CHECK_EQ(203, break_point_hit_count); 2045 CHECK_EQ(203, break_point_hit_count);
2046 2046
2047 // Get rid of the debug event listener. 2047 // Get rid of the debug event listener.
2048 v8::Debug::RemoveDebugEventListener(DebugEventStep); 2048 v8::Debug::SetDebugEventListener(NULL);
2049 } 2049 }
2050 2050
2051 2051
2052 TEST(StepInOutSimple) { 2052 TEST(StepInOutSimple) {
2053 v8::HandleScope scope; 2053 v8::HandleScope scope;
2054 DebugLocalContext env; 2054 DebugLocalContext env;
2055 2055
2056 // Create a function for checking the function when hitting a break point. 2056 // Create a function for checking the function when hitting a break point.
2057 frame_function_name = CompileFunction(&env, 2057 frame_function_name = CompileFunction(&env,
2058 frame_function_name_source, 2058 frame_function_name_source,
2059 "frame_function_name"); 2059 "frame_function_name");
2060 2060
2061 // Register a debug event listener which steps and counts. 2061 // Register a debug event listener which steps and counts.
2062 v8::Debug::AddDebugEventListener(DebugEventStepSequence); 2062 v8::Debug::SetDebugEventListener(DebugEventStepSequence);
2063 2063
2064 // Create functions for testing stepping. 2064 // Create functions for testing stepping.
2065 const char* src = "function a() {b();c();}; " 2065 const char* src = "function a() {b();c();}; "
2066 "function b() {c();}; " 2066 "function b() {c();}; "
2067 "function c() {}; "; 2067 "function c() {}; ";
2068 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 2068 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
2069 SetBreakPoint(a, 0); 2069 SetBreakPoint(a, 0);
2070 2070
2071 // Step through invocation of a with step in. 2071 // Step through invocation of a with step in.
2072 step_action = StepIn; 2072 step_action = StepIn;
(...skipping 10 matching lines...) Expand all
2083 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2083 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2084 2084
2085 // Step through invocation of a with step out. 2085 // Step through invocation of a with step out.
2086 step_action = StepOut; 2086 step_action = StepOut;
2087 break_point_hit_count = 0; 2087 break_point_hit_count = 0;
2088 expected_step_sequence = "a"; 2088 expected_step_sequence = "a";
2089 a->Call(env->Global(), 0, NULL); 2089 a->Call(env->Global(), 0, NULL);
2090 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2090 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2091 2091
2092 // Get rid of the debug event listener. 2092 // Get rid of the debug event listener.
2093 v8::Debug::RemoveDebugEventListener(DebugEventStepSequence); 2093 v8::Debug::SetDebugEventListener(NULL);
2094 } 2094 }
2095 2095
2096 2096
2097 TEST(StepInOutTree) { 2097 TEST(StepInOutTree) {
2098 v8::HandleScope scope; 2098 v8::HandleScope scope;
2099 DebugLocalContext env; 2099 DebugLocalContext env;
2100 2100
2101 // Create a function for checking the function when hitting a break point. 2101 // Create a function for checking the function when hitting a break point.
2102 frame_function_name = CompileFunction(&env, 2102 frame_function_name = CompileFunction(&env,
2103 frame_function_name_source, 2103 frame_function_name_source,
2104 "frame_function_name"); 2104 "frame_function_name");
2105 2105
2106 // Register a debug event listener which steps and counts. 2106 // Register a debug event listener which steps and counts.
2107 v8::Debug::AddDebugEventListener(DebugEventStepSequence); 2107 v8::Debug::SetDebugEventListener(DebugEventStepSequence);
2108 2108
2109 // Create functions for testing stepping. 2109 // Create functions for testing stepping.
2110 const char* src = "function a() {b(c(d()),d());c(d());d()}; " 2110 const char* src = "function a() {b(c(d()),d());c(d());d()}; "
2111 "function b(x,y) {c();}; " 2111 "function b(x,y) {c();}; "
2112 "function c(x) {}; " 2112 "function c(x) {}; "
2113 "function d() {}; "; 2113 "function d() {}; ";
2114 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 2114 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
2115 SetBreakPoint(a, 0); 2115 SetBreakPoint(a, 0);
2116 2116
2117 // Step through invocation of a with step in. 2117 // Step through invocation of a with step in.
(...skipping 11 matching lines...) Expand all
2129 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2129 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2130 2130
2131 // Step through invocation of a with step out. 2131 // Step through invocation of a with step out.
2132 step_action = StepOut; 2132 step_action = StepOut;
2133 break_point_hit_count = 0; 2133 break_point_hit_count = 0;
2134 expected_step_sequence = "a"; 2134 expected_step_sequence = "a";
2135 a->Call(env->Global(), 0, NULL); 2135 a->Call(env->Global(), 0, NULL);
2136 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2136 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2137 2137
2138 // Get rid of the debug event listener. 2138 // Get rid of the debug event listener.
2139 v8::Debug::RemoveDebugEventListener(DebugEventStepSequence); 2139 v8::Debug::SetDebugEventListener(NULL);
2140 } 2140 }
2141 2141
2142 2142
2143 TEST(StepInOutBranch) { 2143 TEST(StepInOutBranch) {
2144 v8::HandleScope scope; 2144 v8::HandleScope scope;
2145 DebugLocalContext env; 2145 DebugLocalContext env;
2146 2146
2147 // Create a function for checking the function when hitting a break point. 2147 // Create a function for checking the function when hitting a break point.
2148 frame_function_name = CompileFunction(&env, 2148 frame_function_name = CompileFunction(&env,
2149 frame_function_name_source, 2149 frame_function_name_source,
2150 "frame_function_name"); 2150 "frame_function_name");
2151 2151
2152 // Register a debug event listener which steps and counts. 2152 // Register a debug event listener which steps and counts.
2153 v8::Debug::AddDebugEventListener(DebugEventStepSequence); 2153 v8::Debug::SetDebugEventListener(DebugEventStepSequence);
2154 2154
2155 // Create functions for testing stepping. 2155 // Create functions for testing stepping.
2156 const char* src = "function a() {b(false);c();}; " 2156 const char* src = "function a() {b(false);c();}; "
2157 "function b(x) {if(x){c();};}; " 2157 "function b(x) {if(x){c();};}; "
2158 "function c() {}; "; 2158 "function c() {}; ";
2159 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 2159 v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
2160 SetBreakPoint(a, 0); 2160 SetBreakPoint(a, 0);
2161 2161
2162 // Step through invocation of a. 2162 // Step through invocation of a.
2163 step_action = StepIn; 2163 step_action = StepIn;
2164 break_point_hit_count = 0; 2164 break_point_hit_count = 0;
2165 expected_step_sequence = "abaca"; 2165 expected_step_sequence = "abaca";
2166 a->Call(env->Global(), 0, NULL); 2166 a->Call(env->Global(), 0, NULL);
2167 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2167 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2168 2168
2169 // Get rid of the debug event listener. 2169 // Get rid of the debug event listener.
2170 v8::Debug::RemoveDebugEventListener(DebugEventStepSequence); 2170 v8::Debug::SetDebugEventListener(NULL);
2171 } 2171 }
2172 2172
2173 2173
2174 // Test that step in does not step into native functions. 2174 // Test that step in does not step into native functions.
2175 TEST(DebugStepNatives) { 2175 TEST(DebugStepNatives) {
2176 v8::HandleScope scope; 2176 v8::HandleScope scope;
2177 DebugLocalContext env; 2177 DebugLocalContext env;
2178 2178
2179 // Create a function for testing stepping. 2179 // Create a function for testing stepping.
2180 v8::Local<v8::Function> foo = CompileFunction( 2180 v8::Local<v8::Function> foo = CompileFunction(
2181 &env, 2181 &env,
2182 "function foo(){debugger;Math.sin(1);}", 2182 "function foo(){debugger;Math.sin(1);}",
2183 "foo"); 2183 "foo");
2184 2184
2185 // Register a debug event listener which steps and counts. 2185 // Register a debug event listener which steps and counts.
2186 v8::Debug::AddDebugEventListener(DebugEventStep); 2186 v8::Debug::SetDebugEventListener(DebugEventStep);
2187 2187
2188 step_action = StepIn; 2188 step_action = StepIn;
2189 break_point_hit_count = 0; 2189 break_point_hit_count = 0;
2190 foo->Call(env->Global(), 0, NULL); 2190 foo->Call(env->Global(), 0, NULL);
2191 2191
2192 // With stepping all break locations are hit. 2192 // With stepping all break locations are hit.
2193 CHECK_EQ(3, break_point_hit_count); 2193 CHECK_EQ(3, break_point_hit_count);
2194 2194
2195 v8::Debug::RemoveDebugEventListener(DebugEventStep); 2195 v8::Debug::SetDebugEventListener(NULL);
2196 2196
2197 // Register a debug event listener which just counts. 2197 // Register a debug event listener which just counts.
2198 v8::Debug::AddDebugEventListener(DebugEventBreakPointHitCount); 2198 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
2199 2199
2200 break_point_hit_count = 0; 2200 break_point_hit_count = 0;
2201 foo->Call(env->Global(), 0, NULL); 2201 foo->Call(env->Global(), 0, NULL);
2202 2202
2203 // Without stepping only active break points are hit. 2203 // Without stepping only active break points are hit.
2204 CHECK_EQ(1, break_point_hit_count); 2204 CHECK_EQ(1, break_point_hit_count);
2205 2205
2206 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); 2206 v8::Debug::SetDebugEventListener(NULL);
2207 } 2207 }
2208 2208
2209 2209
2210 // Test break on exceptions. For each exception break combination the number 2210 // Test break on exceptions. For each exception break combination the number
2211 // of debug event exception callbacks and message callbacks are collected. The 2211 // of debug event exception callbacks and message callbacks are collected. The
2212 // number of debug event exception callbacks are used to check that the 2212 // number of debug event exception callbacks are used to check that the
2213 // debugger is called correctly and the number of message callbacks is used to 2213 // debugger is called correctly and the number of message callbacks is used to
2214 // check that uncaught exceptions are still returned even if there is a break 2214 // check that uncaught exceptions are still returned even if there is a break
2215 // for them. 2215 // for them.
2216 TEST(BreakOnException) { 2216 TEST(BreakOnException) {
2217 v8::HandleScope scope; 2217 v8::HandleScope scope;
2218 DebugLocalContext env; 2218 DebugLocalContext env;
2219 env.ExposeDebug(); 2219 env.ExposeDebug();
2220 2220
2221 v8::internal::Top::TraceException(false); 2221 v8::internal::Top::TraceException(false);
2222 2222
2223 // Create functions for testing break on exception. 2223 // Create functions for testing break on exception.
2224 v8::Local<v8::Function> throws = 2224 v8::Local<v8::Function> throws =
2225 CompileFunction(&env, "function throws(){throw 1;}", "throws"); 2225 CompileFunction(&env, "function throws(){throw 1;}", "throws");
2226 v8::Local<v8::Function> caught = 2226 v8::Local<v8::Function> caught =
2227 CompileFunction(&env, 2227 CompileFunction(&env,
2228 "function caught(){try {throws();} catch(e) {};}", 2228 "function caught(){try {throws();} catch(e) {};}",
2229 "caught"); 2229 "caught");
2230 v8::Local<v8::Function> notCaught = 2230 v8::Local<v8::Function> notCaught =
2231 CompileFunction(&env, "function notCaught(){throws();}", "notCaught"); 2231 CompileFunction(&env, "function notCaught(){throws();}", "notCaught");
2232 2232
2233 v8::V8::AddMessageListener(MessageCallbackCount); 2233 v8::V8::AddMessageListener(MessageCallbackCount);
2234 v8::Debug::AddDebugEventListener(DebugEventCounter); 2234 v8::Debug::SetDebugEventListener(DebugEventCounter);
2235 2235
2236 // Initial state should be break on uncaught exception. 2236 // Initial state should be break on uncaught exception.
2237 DebugEventCounterClear(); 2237 DebugEventCounterClear();
2238 MessageCallbackCountClear(); 2238 MessageCallbackCountClear();
2239 caught->Call(env->Global(), 0, NULL); 2239 caught->Call(env->Global(), 0, NULL);
2240 CHECK_EQ(0, exception_hit_count); 2240 CHECK_EQ(0, exception_hit_count);
2241 CHECK_EQ(0, uncaught_exception_hit_count); 2241 CHECK_EQ(0, uncaught_exception_hit_count);
2242 CHECK_EQ(0, message_callback_count); 2242 CHECK_EQ(0, message_callback_count);
2243 notCaught->Call(env->Global(), 0, NULL); 2243 notCaught->Call(env->Global(), 0, NULL);
2244 CHECK_EQ(1, exception_hit_count); 2244 CHECK_EQ(1, exception_hit_count);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
2342 ChangeBreakOnExceptionFromJS(true, false); 2342 ChangeBreakOnExceptionFromJS(true, false);
2343 caught->Call(env->Global(), 0, NULL); 2343 caught->Call(env->Global(), 0, NULL);
2344 CHECK_EQ(1, exception_hit_count); 2344 CHECK_EQ(1, exception_hit_count);
2345 CHECK_EQ(0, uncaught_exception_hit_count); 2345 CHECK_EQ(0, uncaught_exception_hit_count);
2346 CHECK_EQ(0, message_callback_count); 2346 CHECK_EQ(0, message_callback_count);
2347 notCaught->Call(env->Global(), 0, NULL); 2347 notCaught->Call(env->Global(), 0, NULL);
2348 CHECK_EQ(2, exception_hit_count); 2348 CHECK_EQ(2, exception_hit_count);
2349 CHECK_EQ(1, uncaught_exception_hit_count); 2349 CHECK_EQ(1, uncaught_exception_hit_count);
2350 CHECK_EQ(1, message_callback_count); 2350 CHECK_EQ(1, message_callback_count);
2351 2351
2352 v8::Debug::RemoveDebugEventListener(DebugEventCounter); 2352 v8::Debug::SetDebugEventListener(NULL);
2353 v8::V8::RemoveMessageListeners(MessageCallbackCount); 2353 v8::V8::RemoveMessageListeners(MessageCallbackCount);
2354 } 2354 }
2355 2355
2356 2356
2357 // Test break on exception from compiler errors. When compiling using 2357 // Test break on exception from compiler errors. When compiling using
2358 // v8::Script::Compile there is no JavaScript stack whereas when compiling using 2358 // v8::Script::Compile there is no JavaScript stack whereas when compiling using
2359 // eval there are JavaScript frames. 2359 // eval there are JavaScript frames.
2360 TEST(BreakOnCompileException) { 2360 TEST(BreakOnCompileException) {
2361 v8::HandleScope scope; 2361 v8::HandleScope scope;
2362 DebugLocalContext env; 2362 DebugLocalContext env;
2363 2363
2364 v8::internal::Top::TraceException(false); 2364 v8::internal::Top::TraceException(false);
2365 2365
2366 // Create a function for checking the function when hitting a break point. 2366 // Create a function for checking the function when hitting a break point.
2367 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); 2367 frame_count = CompileFunction(&env, frame_count_source, "frame_count");
2368 2368
2369 v8::V8::AddMessageListener(MessageCallbackCount); 2369 v8::V8::AddMessageListener(MessageCallbackCount);
2370 v8::Debug::AddDebugEventListener(DebugEventCounter); 2370 v8::Debug::SetDebugEventListener(DebugEventCounter);
2371 2371
2372 DebugEventCounterClear(); 2372 DebugEventCounterClear();
2373 MessageCallbackCountClear(); 2373 MessageCallbackCountClear();
2374 2374
2375 // Check initial state. 2375 // Check initial state.
2376 CHECK_EQ(0, exception_hit_count); 2376 CHECK_EQ(0, exception_hit_count);
2377 CHECK_EQ(0, uncaught_exception_hit_count); 2377 CHECK_EQ(0, uncaught_exception_hit_count);
2378 CHECK_EQ(0, message_callback_count); 2378 CHECK_EQ(0, message_callback_count);
2379 CHECK_EQ(-1, last_js_stack_height); 2379 CHECK_EQ(-1, last_js_stack_height);
2380 2380
(...skipping 30 matching lines...) Expand all
2411 TEST(StepWithException) { 2411 TEST(StepWithException) {
2412 v8::HandleScope scope; 2412 v8::HandleScope scope;
2413 DebugLocalContext env; 2413 DebugLocalContext env;
2414 2414
2415 // Create a function for checking the function when hitting a break point. 2415 // Create a function for checking the function when hitting a break point.
2416 frame_function_name = CompileFunction(&env, 2416 frame_function_name = CompileFunction(&env,
2417 frame_function_name_source, 2417 frame_function_name_source,
2418 "frame_function_name"); 2418 "frame_function_name");
2419 2419
2420 // Register a debug event listener which steps and counts. 2420 // Register a debug event listener which steps and counts.
2421 v8::Debug::AddDebugEventListener(DebugEventStepSequence); 2421 v8::Debug::SetDebugEventListener(DebugEventStepSequence);
2422 2422
2423 // Create functions for testing stepping. 2423 // Create functions for testing stepping.
2424 const char* src = "function a() { n(); }; " 2424 const char* src = "function a() { n(); }; "
2425 "function b() { c(); }; " 2425 "function b() { c(); }; "
2426 "function c() { n(); }; " 2426 "function c() { n(); }; "
2427 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " 2427 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; "
2428 "function e() { n(); }; " 2428 "function e() { n(); }; "
2429 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " 2429 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; "
2430 "function g() { h(); }; " 2430 "function g() { h(); }; "
2431 "function h() { x = 1; throw 1; }; "; 2431 "function h() { x = 1; throw 1; }; ";
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2478 2478
2479 // Step through invocation of f + g + h now with break on caught exceptions. 2479 // Step through invocation of f + g + h now with break on caught exceptions.
2480 ChangeBreakOnException(true, true); 2480 ChangeBreakOnException(true, true);
2481 step_action = StepIn; 2481 step_action = StepIn;
2482 break_point_hit_count = 0; 2482 break_point_hit_count = 0;
2483 expected_step_sequence = "ffghhf"; 2483 expected_step_sequence = "ffghhf";
2484 f->Call(env->Global(), 0, NULL); 2484 f->Call(env->Global(), 0, NULL);
2485 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count); 2485 CHECK_EQ(strlen(expected_step_sequence), break_point_hit_count);
2486 2486
2487 // Get rid of the debug event listener. 2487 // Get rid of the debug event listener.
2488 v8::Debug::RemoveDebugEventListener(DebugEventStepSequence); 2488 v8::Debug::SetDebugEventListener(NULL);
2489 } 2489 }
2490 2490
2491 2491
2492 TEST(DebugBreak) { 2492 TEST(DebugBreak) {
2493 v8::HandleScope scope; 2493 v8::HandleScope scope;
2494 DebugLocalContext env; 2494 DebugLocalContext env;
2495 2495
2496 // This test should be run with option --verify-heap. This is an ASSERT and 2496 // This test should be run with option --verify-heap. This is an ASSERT and
2497 // not a CHECK as --verify-heap is only available in debug mode. 2497 // not a CHECK as --verify-heap is only available in debug mode.
2498 ASSERT(v8::internal::FLAG_verify_heap); 2498 ASSERT(v8::internal::FLAG_verify_heap);
2499 2499
2500 // Register a debug event listener which sets the break flag and counts. 2500 // Register a debug event listener which sets the break flag and counts.
2501 v8::Debug::AddDebugEventListener(DebugEventBreak); 2501 v8::Debug::SetDebugEventListener(DebugEventBreak);
2502 2502
2503 // Create a function for testing stepping. 2503 // Create a function for testing stepping.
2504 const char* src = "function f0() {}" 2504 const char* src = "function f0() {}"
2505 "function f1(x1) {}" 2505 "function f1(x1) {}"
2506 "function f2(x1,x2) {}" 2506 "function f2(x1,x2) {}"
2507 "function f3(x1,x2,x3) {}"; 2507 "function f3(x1,x2,x3) {}";
2508 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); 2508 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0");
2509 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); 2509 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1");
2510 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); 2510 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2");
2511 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); 2511 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3");
(...skipping 19 matching lines...) Expand all
2531 f0->Call(env->Global(), i, argv); 2531 f0->Call(env->Global(), i, argv);
2532 f1->Call(env->Global(), i, argv); 2532 f1->Call(env->Global(), i, argv);
2533 f2->Call(env->Global(), i, argv); 2533 f2->Call(env->Global(), i, argv);
2534 f3->Call(env->Global(), i, argv); 2534 f3->Call(env->Global(), i, argv);
2535 } 2535 }
2536 2536
2537 // One break for each function called. 2537 // One break for each function called.
2538 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count); 2538 CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count);
2539 2539
2540 // Get rid of the debug event listener. 2540 // Get rid of the debug event listener.
2541 v8::Debug::RemoveDebugEventListener(DebugEventBreak); 2541 v8::Debug::SetDebugEventListener(NULL);
2542 } 2542 }
2543 2543
2544 2544
2545 // Test to ensure that JavaScript code keeps running while the debug break 2545 // Test to ensure that JavaScript code keeps running while the debug break
2546 // through the stack limit flag is set but breaks are disabled. 2546 // through the stack limit flag is set but breaks are disabled.
2547 TEST(DisableBreak) { 2547 TEST(DisableBreak) {
2548 v8::HandleScope scope; 2548 v8::HandleScope scope;
2549 DebugLocalContext env; 2549 DebugLocalContext env;
2550 2550
2551 // Register a debug event listener which sets the break flag and counts. 2551 // Register a debug event listener which sets the break flag and counts.
2552 v8::Debug::AddDebugEventListener(DebugEventCounter); 2552 v8::Debug::SetDebugEventListener(DebugEventCounter);
2553 2553
2554 // Create a function for testing stepping. 2554 // Create a function for testing stepping.
2555 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; 2555 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}";
2556 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 2556 v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
2557 2557
2558 // Set the debug break flag. 2558 // Set the debug break flag.
2559 v8::Debug::DebugBreak(); 2559 v8::Debug::DebugBreak();
2560 2560
2561 // Call all functions with different argument count. 2561 // Call all functions with different argument count.
2562 break_point_hit_count = 0; 2562 break_point_hit_count = 0;
2563 f->Call(env->Global(), 0, NULL); 2563 f->Call(env->Global(), 0, NULL);
2564 CHECK_EQ(1, break_point_hit_count); 2564 CHECK_EQ(1, break_point_hit_count);
2565 2565
2566 { 2566 {
2567 v8::Debug::DebugBreak(); 2567 v8::Debug::DebugBreak();
2568 v8::internal::DisableBreak disable_break(true); 2568 v8::internal::DisableBreak disable_break(true);
2569 f->Call(env->Global(), 0, NULL); 2569 f->Call(env->Global(), 0, NULL);
2570 CHECK_EQ(1, break_point_hit_count); 2570 CHECK_EQ(1, break_point_hit_count);
2571 } 2571 }
2572 2572
2573 f->Call(env->Global(), 0, NULL); 2573 f->Call(env->Global(), 0, NULL);
2574 CHECK_EQ(2, break_point_hit_count); 2574 CHECK_EQ(2, break_point_hit_count);
2575 2575
2576 // Get rid of the debug event listener. 2576 // Get rid of the debug event listener.
2577 v8::Debug::RemoveDebugEventListener(DebugEventBreak); 2577 v8::Debug::SetDebugEventListener(NULL);
2578 } 2578 }
2579 2579
2580 2580
2581 static v8::Handle<v8::Array> NamedEnum(const v8::AccessorInfo&) { 2581 static v8::Handle<v8::Array> NamedEnum(const v8::AccessorInfo&) {
2582 v8::Handle<v8::Array> result = v8::Array::New(3); 2582 v8::Handle<v8::Array> result = v8::Array::New(3);
2583 result->Set(v8::Integer::New(0), v8::String::New("a")); 2583 result->Set(v8::Integer::New(0), v8::String::New("a"));
2584 result->Set(v8::Integer::New(1), v8::String::New("b")); 2584 result->Set(v8::Integer::New(1), v8::String::New("b"));
2585 result->Set(v8::Integer::New(2), v8::String::New("c")); 2585 result->Set(v8::Integer::New(2), v8::String::New("c"));
2586 return result; 2586 return result;
2587 } 2587 }
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
3329 } 3329 }
3330 3330
3331 3331
3332 static void DummyDebugEventListener(v8::DebugEvent event, 3332 static void DummyDebugEventListener(v8::DebugEvent event,
3333 v8::Handle<v8::Object> exec_state, 3333 v8::Handle<v8::Object> exec_state,
3334 v8::Handle<v8::Object> event_data, 3334 v8::Handle<v8::Object> event_data,
3335 v8::Handle<v8::Value> data) { 3335 v8::Handle<v8::Value> data) {
3336 } 3336 }
3337 3337
3338 3338
3339 TEST(AddDebugEventListenerOnUninitializedVM) { 3339 TEST(SetDebugEventListenerOnUninitializedVM) {
3340 v8::Debug::AddDebugEventListener(DummyDebugEventListener); 3340 v8::Debug::SetDebugEventListener(DummyDebugEventListener);
3341 } 3341 }
3342 3342
3343 3343
3344 static void DummyMessageHandler(const uint16_t* message, 3344 static void DummyMessageHandler(const uint16_t* message,
3345 int length, void *data) { 3345 int length, void *data) {
3346 } 3346 }
3347 3347
3348 3348
3349 TEST(SetMessageHandlerOnUninitializedVM) { 3349 TEST(SetMessageHandlerOnUninitializedVM) {
3350 v8::Debug::SetMessageHandler(DummyMessageHandler); 3350 v8::Debug::SetMessageHandler(DummyMessageHandler);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3499 " CheckSourceLine(2)\n" 3499 " CheckSourceLine(2)\n"
3500 " CheckSourceLine(3)\n" 3500 " CheckSourceLine(3)\n"
3501 "}; f()"))->Run(); 3501 "}; f()"))->Run();
3502 3502
3503 // Test that a parameter can be passed to a function called in the debugger. 3503 // Test that a parameter can be passed to a function called in the debugger.
3504 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run(); 3504 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run();
3505 3505
3506 // Test that a function with closure can be run in the debugger. 3506 // Test that a function with closure can be run in the debugger.
3507 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run(); 3507 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run();
3508 } 3508 }
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