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

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

Issue 2727393003: [debugger,api] deprecate everything in v8-debug.h (Closed)
Patch Set: Created 3 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 } 133 }
134 134
135 135
136 // Compile and run the supplied source and return the requested function. 136 // Compile and run the supplied source and return the requested function.
137 static v8::Local<v8::Function> CompileFunction(DebugLocalContext* env, 137 static v8::Local<v8::Function> CompileFunction(DebugLocalContext* env,
138 const char* source, 138 const char* source,
139 const char* function_name) { 139 const char* function_name) {
140 return CompileFunction(env->GetIsolate(), source, function_name); 140 return CompileFunction(env->GetIsolate(), source, function_name);
141 } 141 }
142 142
143 static void SetDebugEventListener(
144 v8::Isolate* isolate, v8::Debug::EventCallback that,
145 v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
146 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
147 i::HandleScope scope(i_isolate);
148 if (that == nullptr) {
149 i_isolate->debug()->SetDebugDelegate(nullptr, false);
150 } else {
151 i::Handle<i::Object> i_data = i_isolate->factory()->undefined_value();
152 if (!data.IsEmpty()) i_data = v8::Utils::OpenHandle(*data);
153 i::NativeDebugDelegate* delegate =
154 new i::NativeDebugDelegate(i_isolate, that, i_data);
155 i_isolate->debug()->SetDebugDelegate(delegate, true);
156 }
157 }
143 158
144 // Is there any debug info for the function? 159 // Is there any debug info for the function?
145 static bool HasDebugInfo(v8::Local<v8::Function> fun) { 160 static bool HasDebugInfo(v8::Local<v8::Function> fun) {
146 Handle<v8::internal::JSFunction> f = 161 Handle<v8::internal::JSFunction> f =
147 Handle<v8::internal::JSFunction>::cast(v8::Utils::OpenHandle(*fun)); 162 Handle<v8::internal::JSFunction>::cast(v8::Utils::OpenHandle(*fun));
148 Handle<v8::internal::SharedFunctionInfo> shared(f->shared()); 163 Handle<v8::internal::SharedFunctionInfo> shared(f->shared());
149 return shared->HasDebugInfo(); 164 return shared->HasDebugInfo();
150 } 165 }
151 166
152 // Set a break point in a function with a position relative to function start, 167 // Set a break point in a function with a position relative to function start,
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 829
815 if (event == v8::Break) { 830 if (event == v8::Break) {
816 // Count the number of breaks. 831 // Count the number of breaks.
817 break_point_hit_count++; 832 break_point_hit_count++;
818 833
819 // Run the garbage collector to enforce heap verification if option 834 // Run the garbage collector to enforce heap verification if option
820 // --verify-heap is set. 835 // --verify-heap is set.
821 CcTest::CollectGarbage(v8::internal::NEW_SPACE); 836 CcTest::CollectGarbage(v8::internal::NEW_SPACE);
822 837
823 // Set the break flag again to come back here as soon as possible. 838 // Set the break flag again to come back here as soon as possible.
824 v8::Debug::DebugBreak(CcTest::isolate()); 839 v8::debug::DebugBreak(CcTest::isolate());
825 } 840 }
826 } 841 }
827 842
828 843
829 // Debug event handler which re-issues a debug break until a limit has been 844 // Debug event handler which re-issues a debug break until a limit has been
830 // reached. 845 // reached.
831 int max_break_point_hit_count = 0; 846 int max_break_point_hit_count = 0;
832 bool terminate_after_max_break_point_hit = false; 847 bool terminate_after_max_break_point_hit = false;
833 static void DebugEventBreakMax( 848 static void DebugEventBreakMax(
834 const v8::Debug::EventDetails& event_details) { 849 const v8::Debug::EventDetails& event_details) {
835 v8::DebugEvent event = event_details.GetEvent(); 850 v8::DebugEvent event = event_details.GetEvent();
836 v8::Isolate* v8_isolate = CcTest::isolate(); 851 v8::Isolate* v8_isolate = CcTest::isolate();
837 v8::internal::Isolate* isolate = CcTest::i_isolate(); 852 v8::internal::Isolate* isolate = CcTest::i_isolate();
838 v8::internal::Debug* debug = isolate->debug(); 853 v8::internal::Debug* debug = isolate->debug();
839 // When hitting a debug event listener there must be a break set. 854 // When hitting a debug event listener there must be a break set.
840 CHECK_NE(debug->break_id(), 0); 855 CHECK_NE(debug->break_id(), 0);
841 856
842 if (event == v8::Break) { 857 if (event == v8::Break) {
843 if (break_point_hit_count < max_break_point_hit_count) { 858 if (break_point_hit_count < max_break_point_hit_count) {
844 // Count the number of breaks. 859 // Count the number of breaks.
845 break_point_hit_count++; 860 break_point_hit_count++;
846 861
847 // Set the break flag again to come back here as soon as possible. 862 // Set the break flag again to come back here as soon as possible.
848 v8::Debug::DebugBreak(v8_isolate); 863 v8::debug::DebugBreak(v8_isolate);
849 864
850 } else if (terminate_after_max_break_point_hit) { 865 } else if (terminate_after_max_break_point_hit) {
851 // Terminate execution after the last break if requested. 866 // Terminate execution after the last break if requested.
852 v8_isolate->TerminateExecution(); 867 v8_isolate->TerminateExecution();
853 } 868 }
854 869
855 // Perform a full deoptimization when the specified number of 870 // Perform a full deoptimization when the specified number of
856 // breaks have been hit. 871 // breaks have been hit.
857 if (break_point_hit_count == break_point_hit_count_deoptimize) { 872 if (break_point_hit_count == break_point_hit_count_deoptimize) {
858 i::Deoptimizer::DeoptimizeAll(isolate); 873 i::Deoptimizer::DeoptimizeAll(isolate);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 CHECK(!HasDebugInfo(bar)); 932 CHECK(!HasDebugInfo(bar));
918 } 933 }
919 934
920 935
921 // Test that a break point can be set at an IC store location. 936 // Test that a break point can be set at an IC store location.
922 TEST(BreakPointICStore) { 937 TEST(BreakPointICStore) {
923 break_point_hit_count = 0; 938 break_point_hit_count = 0;
924 DebugLocalContext env; 939 DebugLocalContext env;
925 v8::HandleScope scope(env->GetIsolate()); 940 v8::HandleScope scope(env->GetIsolate());
926 941
927 v8::Debug::SetDebugEventListener(env->GetIsolate(), 942 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
928 DebugEventBreakPointHitCount);
929 v8::Local<v8::Function> foo = 943 v8::Local<v8::Function> foo =
930 CompileFunction(&env, "function foo(){bar=0;}", "foo"); 944 CompileFunction(&env, "function foo(){bar=0;}", "foo");
931 945
932 // Run without breakpoints. 946 // Run without breakpoints.
933 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 947 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
934 CHECK_EQ(0, break_point_hit_count); 948 CHECK_EQ(0, break_point_hit_count);
935 949
936 // Run with breakpoint 950 // Run with breakpoint
937 int bp = SetBreakPoint(foo, 0); 951 int bp = SetBreakPoint(foo, 0);
938 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 952 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
939 CHECK_EQ(1, break_point_hit_count); 953 CHECK_EQ(1, break_point_hit_count);
940 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 954 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
941 CHECK_EQ(2, break_point_hit_count); 955 CHECK_EQ(2, break_point_hit_count);
942 956
943 // Run without breakpoints. 957 // Run without breakpoints.
944 ClearBreakPoint(bp); 958 ClearBreakPoint(bp);
945 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 959 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
946 CHECK_EQ(2, break_point_hit_count); 960 CHECK_EQ(2, break_point_hit_count);
947 961
948 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 962 SetDebugEventListener(env->GetIsolate(), nullptr);
949 CheckDebuggerUnloaded(env->GetIsolate()); 963 CheckDebuggerUnloaded(env->GetIsolate());
950 } 964 }
951 965
952 966
953 // Test that a break point can be set at an IC load location. 967 // Test that a break point can be set at an IC load location.
954 TEST(BreakPointICLoad) { 968 TEST(BreakPointICLoad) {
955 break_point_hit_count = 0; 969 break_point_hit_count = 0;
956 DebugLocalContext env; 970 DebugLocalContext env;
957 v8::HandleScope scope(env->GetIsolate()); 971 v8::HandleScope scope(env->GetIsolate());
958 v8::Debug::SetDebugEventListener(env->GetIsolate(), 972 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
959 DebugEventBreakPointHitCount);
960 973
961 CompileRunChecked(env->GetIsolate(), "bar=1"); 974 CompileRunChecked(env->GetIsolate(), "bar=1");
962 v8::Local<v8::Function> foo = 975 v8::Local<v8::Function> foo =
963 CompileFunction(&env, "function foo(){var x=bar;}", "foo"); 976 CompileFunction(&env, "function foo(){var x=bar;}", "foo");
964 977
965 // Run without breakpoints. 978 // Run without breakpoints.
966 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 979 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
967 CHECK_EQ(0, break_point_hit_count); 980 CHECK_EQ(0, break_point_hit_count);
968 981
969 // Run with breakpoint. 982 // Run with breakpoint.
970 int bp = SetBreakPoint(foo, 0); 983 int bp = SetBreakPoint(foo, 0);
971 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 984 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
972 CHECK_EQ(1, break_point_hit_count); 985 CHECK_EQ(1, break_point_hit_count);
973 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 986 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
974 CHECK_EQ(2, break_point_hit_count); 987 CHECK_EQ(2, break_point_hit_count);
975 988
976 // Run without breakpoints. 989 // Run without breakpoints.
977 ClearBreakPoint(bp); 990 ClearBreakPoint(bp);
978 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 991 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
979 CHECK_EQ(2, break_point_hit_count); 992 CHECK_EQ(2, break_point_hit_count);
980 993
981 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 994 SetDebugEventListener(env->GetIsolate(), nullptr);
982 CheckDebuggerUnloaded(env->GetIsolate()); 995 CheckDebuggerUnloaded(env->GetIsolate());
983 } 996 }
984 997
985 998
986 // Test that a break point can be set at an IC call location. 999 // Test that a break point can be set at an IC call location.
987 TEST(BreakPointICCall) { 1000 TEST(BreakPointICCall) {
988 break_point_hit_count = 0; 1001 break_point_hit_count = 0;
989 DebugLocalContext env; 1002 DebugLocalContext env;
990 v8::HandleScope scope(env->GetIsolate()); 1003 v8::HandleScope scope(env->GetIsolate());
991 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1004 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
992 DebugEventBreakPointHitCount);
993 CompileRunChecked(env->GetIsolate(), "function bar(){}"); 1005 CompileRunChecked(env->GetIsolate(), "function bar(){}");
994 v8::Local<v8::Function> foo = 1006 v8::Local<v8::Function> foo =
995 CompileFunction(&env, "function foo(){bar();}", "foo"); 1007 CompileFunction(&env, "function foo(){bar();}", "foo");
996 1008
997 // Run without breakpoints. 1009 // Run without breakpoints.
998 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1010 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
999 CHECK_EQ(0, break_point_hit_count); 1011 CHECK_EQ(0, break_point_hit_count);
1000 1012
1001 // Run with breakpoint 1013 // Run with breakpoint
1002 int bp = SetBreakPoint(foo, 0); 1014 int bp = SetBreakPoint(foo, 0);
1003 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1015 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
1004 CHECK_EQ(1, break_point_hit_count); 1016 CHECK_EQ(1, break_point_hit_count);
1005 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1017 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
1006 CHECK_EQ(2, break_point_hit_count); 1018 CHECK_EQ(2, break_point_hit_count);
1007 1019
1008 // Run without breakpoints. 1020 // Run without breakpoints.
1009 ClearBreakPoint(bp); 1021 ClearBreakPoint(bp);
1010 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1022 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
1011 CHECK_EQ(2, break_point_hit_count); 1023 CHECK_EQ(2, break_point_hit_count);
1012 1024
1013 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1025 SetDebugEventListener(env->GetIsolate(), nullptr);
1014 CheckDebuggerUnloaded(env->GetIsolate()); 1026 CheckDebuggerUnloaded(env->GetIsolate());
1015 } 1027 }
1016 1028
1017 1029
1018 // Test that a break point can be set at an IC call location and survive a GC. 1030 // Test that a break point can be set at an IC call location and survive a GC.
1019 TEST(BreakPointICCallWithGC) { 1031 TEST(BreakPointICCallWithGC) {
1020 break_point_hit_count = 0; 1032 break_point_hit_count = 0;
1021 DebugLocalContext env; 1033 DebugLocalContext env;
1022 v8::HandleScope scope(env->GetIsolate()); 1034 v8::HandleScope scope(env->GetIsolate());
1023 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1035 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointCollectGarbage);
1024 DebugEventBreakPointCollectGarbage);
1025 CompileRunChecked(env->GetIsolate(), "function bar(){return 1;}"); 1036 CompileRunChecked(env->GetIsolate(), "function bar(){return 1;}");
1026 v8::Local<v8::Function> foo = 1037 v8::Local<v8::Function> foo =
1027 CompileFunction(&env, "function foo(){return bar();}", "foo"); 1038 CompileFunction(&env, "function foo(){return bar();}", "foo");
1028 v8::Local<v8::Context> context = env.context(); 1039 v8::Local<v8::Context> context = env.context();
1029 1040
1030 // Run without breakpoints. 1041 // Run without breakpoints.
1031 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) 1042 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
1032 .ToLocalChecked() 1043 .ToLocalChecked()
1033 ->Int32Value(context) 1044 ->Int32Value(context)
1034 .FromJust()); 1045 .FromJust());
(...skipping 10 matching lines...) Expand all
1045 .ToLocalChecked() 1056 .ToLocalChecked()
1046 ->Int32Value(context) 1057 ->Int32Value(context)
1047 .FromJust()); 1058 .FromJust());
1048 CHECK_EQ(2, break_point_hit_count); 1059 CHECK_EQ(2, break_point_hit_count);
1049 1060
1050 // Run without breakpoints. 1061 // Run without breakpoints.
1051 ClearBreakPoint(bp); 1062 ClearBreakPoint(bp);
1052 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1063 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1053 CHECK_EQ(2, break_point_hit_count); 1064 CHECK_EQ(2, break_point_hit_count);
1054 1065
1055 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1066 SetDebugEventListener(env->GetIsolate(), nullptr);
1056 CheckDebuggerUnloaded(env->GetIsolate()); 1067 CheckDebuggerUnloaded(env->GetIsolate());
1057 } 1068 }
1058 1069
1059 1070
1060 // Test that a break point can be set at an IC call location and survive a GC. 1071 // Test that a break point can be set at an IC call location and survive a GC.
1061 TEST(BreakPointConstructCallWithGC) { 1072 TEST(BreakPointConstructCallWithGC) {
1062 break_point_hit_count = 0; 1073 break_point_hit_count = 0;
1063 DebugLocalContext env; 1074 DebugLocalContext env;
1064 v8::HandleScope scope(env->GetIsolate()); 1075 v8::HandleScope scope(env->GetIsolate());
1065 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1076 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointCollectGarbage);
1066 DebugEventBreakPointCollectGarbage);
1067 CompileRunChecked(env->GetIsolate(), "function bar(){ this.x = 1;}"); 1077 CompileRunChecked(env->GetIsolate(), "function bar(){ this.x = 1;}");
1068 v8::Local<v8::Function> foo = 1078 v8::Local<v8::Function> foo =
1069 CompileFunction(&env, "function foo(){return new bar(1).x;}", "foo"); 1079 CompileFunction(&env, "function foo(){return new bar(1).x;}", "foo");
1070 v8::Local<v8::Context> context = env.context(); 1080 v8::Local<v8::Context> context = env.context();
1071 1081
1072 // Run without breakpoints. 1082 // Run without breakpoints.
1073 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) 1083 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
1074 .ToLocalChecked() 1084 .ToLocalChecked()
1075 ->Int32Value(context) 1085 ->Int32Value(context)
1076 .FromJust()); 1086 .FromJust());
(...skipping 10 matching lines...) Expand all
1087 .ToLocalChecked() 1097 .ToLocalChecked()
1088 ->Int32Value(context) 1098 ->Int32Value(context)
1089 .FromJust()); 1099 .FromJust());
1090 CHECK_EQ(2, break_point_hit_count); 1100 CHECK_EQ(2, break_point_hit_count);
1091 1101
1092 // Run without breakpoints. 1102 // Run without breakpoints.
1093 ClearBreakPoint(bp); 1103 ClearBreakPoint(bp);
1094 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1104 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1095 CHECK_EQ(2, break_point_hit_count); 1105 CHECK_EQ(2, break_point_hit_count);
1096 1106
1097 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1107 SetDebugEventListener(env->GetIsolate(), nullptr);
1098 CheckDebuggerUnloaded(env->GetIsolate()); 1108 CheckDebuggerUnloaded(env->GetIsolate());
1099 } 1109 }
1100 1110
1101 1111
1102 // Test that a break point can be set at a return store location. 1112 // Test that a break point can be set at a return store location.
1103 TEST(BreakPointReturn) { 1113 TEST(BreakPointReturn) {
1104 break_point_hit_count = 0; 1114 break_point_hit_count = 0;
1105 DebugLocalContext env; 1115 DebugLocalContext env;
1106 v8::HandleScope scope(env->GetIsolate()); 1116 v8::HandleScope scope(env->GetIsolate());
1107 1117
1108 // Create a functions for checking the source line and column when hitting 1118 // Create a functions for checking the source line and column when hitting
1109 // a break point. 1119 // a break point.
1110 frame_source_line = CompileFunction(&env, 1120 frame_source_line = CompileFunction(&env,
1111 frame_source_line_source, 1121 frame_source_line_source,
1112 "frame_source_line"); 1122 "frame_source_line");
1113 frame_source_column = CompileFunction(&env, 1123 frame_source_column = CompileFunction(&env,
1114 frame_source_column_source, 1124 frame_source_column_source,
1115 "frame_source_column"); 1125 "frame_source_column");
1116 1126
1117 1127 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1118 v8::Debug::SetDebugEventListener(env->GetIsolate(),
1119 DebugEventBreakPointHitCount);
1120 v8::Local<v8::Function> foo = 1128 v8::Local<v8::Function> foo =
1121 CompileFunction(&env, "function foo(){}", "foo"); 1129 CompileFunction(&env, "function foo(){}", "foo");
1122 v8::Local<v8::Context> context = env.context(); 1130 v8::Local<v8::Context> context = env.context();
1123 1131
1124 // Run without breakpoints. 1132 // Run without breakpoints.
1125 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1133 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1126 CHECK_EQ(0, break_point_hit_count); 1134 CHECK_EQ(0, break_point_hit_count);
1127 1135
1128 // Run with breakpoint 1136 // Run with breakpoint
1129 int bp = SetBreakPoint(foo, 0); 1137 int bp = SetBreakPoint(foo, 0);
1130 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1138 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1131 CHECK_EQ(1, break_point_hit_count); 1139 CHECK_EQ(1, break_point_hit_count);
1132 CHECK_EQ(0, last_source_line); 1140 CHECK_EQ(0, last_source_line);
1133 CHECK_EQ(15, last_source_column); 1141 CHECK_EQ(15, last_source_column);
1134 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1142 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1135 CHECK_EQ(2, break_point_hit_count); 1143 CHECK_EQ(2, break_point_hit_count);
1136 CHECK_EQ(0, last_source_line); 1144 CHECK_EQ(0, last_source_line);
1137 CHECK_EQ(15, last_source_column); 1145 CHECK_EQ(15, last_source_column);
1138 1146
1139 // Run without breakpoints. 1147 // Run without breakpoints.
1140 ClearBreakPoint(bp); 1148 ClearBreakPoint(bp);
1141 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1149 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1142 CHECK_EQ(2, break_point_hit_count); 1150 CHECK_EQ(2, break_point_hit_count);
1143 1151
1144 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1152 SetDebugEventListener(env->GetIsolate(), nullptr);
1145 CheckDebuggerUnloaded(env->GetIsolate()); 1153 CheckDebuggerUnloaded(env->GetIsolate());
1146 } 1154 }
1147 1155
1148 1156
1149 static void CallWithBreakPoints(v8::Local<v8::Context> context, 1157 static void CallWithBreakPoints(v8::Local<v8::Context> context,
1150 v8::Local<v8::Object> recv, 1158 v8::Local<v8::Object> recv,
1151 v8::Local<v8::Function> f, 1159 v8::Local<v8::Function> f,
1152 int break_point_count, int call_count) { 1160 int break_point_count, int call_count) {
1153 break_point_hit_count = 0; 1161 break_point_hit_count = 0;
1154 for (int i = 0; i < call_count; i++) { 1162 for (int i = 0; i < call_count; i++) {
1155 f->Call(context, recv, 0, NULL).ToLocalChecked(); 1163 f->Call(context, recv, 0, NULL).ToLocalChecked();
1156 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); 1164 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count);
1157 } 1165 }
1158 } 1166 }
1159 1167
1160 1168
1161 // Test GC during break point processing. 1169 // Test GC during break point processing.
1162 TEST(GCDuringBreakPointProcessing) { 1170 TEST(GCDuringBreakPointProcessing) {
1163 break_point_hit_count = 0; 1171 break_point_hit_count = 0;
1164 DebugLocalContext env; 1172 DebugLocalContext env;
1165 v8::HandleScope scope(env->GetIsolate()); 1173 v8::HandleScope scope(env->GetIsolate());
1166 v8::Local<v8::Context> context = env.context(); 1174 v8::Local<v8::Context> context = env.context();
1167 1175
1168 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1176 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointCollectGarbage);
1169 DebugEventBreakPointCollectGarbage);
1170 v8::Local<v8::Function> foo; 1177 v8::Local<v8::Function> foo;
1171 1178
1172 // Test IC store break point with garbage collection. 1179 // Test IC store break point with garbage collection.
1173 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1180 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
1174 SetBreakPoint(foo, 0); 1181 SetBreakPoint(foo, 0);
1175 CallWithBreakPoints(context, env->Global(), foo, 1, 10); 1182 CallWithBreakPoints(context, env->Global(), foo, 1, 10);
1176 1183
1177 // Test IC load break point with garbage collection. 1184 // Test IC load break point with garbage collection.
1178 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 1185 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
1179 SetBreakPoint(foo, 0); 1186 SetBreakPoint(foo, 0);
1180 CallWithBreakPoints(context, env->Global(), foo, 1, 10); 1187 CallWithBreakPoints(context, env->Global(), foo, 1, 10);
1181 1188
1182 // Test IC call break point with garbage collection. 1189 // Test IC call break point with garbage collection.
1183 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 1190 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
1184 SetBreakPoint(foo, 0); 1191 SetBreakPoint(foo, 0);
1185 CallWithBreakPoints(context, env->Global(), foo, 1, 10); 1192 CallWithBreakPoints(context, env->Global(), foo, 1, 10);
1186 1193
1187 // Test return break point with garbage collection. 1194 // Test return break point with garbage collection.
1188 foo = CompileFunction(&env, "function foo(){}", "foo"); 1195 foo = CompileFunction(&env, "function foo(){}", "foo");
1189 SetBreakPoint(foo, 0); 1196 SetBreakPoint(foo, 0);
1190 CallWithBreakPoints(context, env->Global(), foo, 1, 25); 1197 CallWithBreakPoints(context, env->Global(), foo, 1, 25);
1191 1198
1192 // Test debug break slot break point with garbage collection. 1199 // Test debug break slot break point with garbage collection.
1193 foo = CompileFunction(&env, "function foo(){var a;}", "foo"); 1200 foo = CompileFunction(&env, "function foo(){var a;}", "foo");
1194 SetBreakPoint(foo, 0); 1201 SetBreakPoint(foo, 0);
1195 CallWithBreakPoints(context, env->Global(), foo, 1, 25); 1202 CallWithBreakPoints(context, env->Global(), foo, 1, 25);
1196 1203
1197 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1204 SetDebugEventListener(env->GetIsolate(), nullptr);
1198 CheckDebuggerUnloaded(env->GetIsolate()); 1205 CheckDebuggerUnloaded(env->GetIsolate());
1199 } 1206 }
1200 1207
1201 1208
1202 // Call the function three times with different garbage collections in between 1209 // Call the function three times with different garbage collections in between
1203 // and make sure that the break point survives. 1210 // and make sure that the break point survives.
1204 static void CallAndGC(v8::Local<v8::Context> context, 1211 static void CallAndGC(v8::Local<v8::Context> context,
1205 v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { 1212 v8::Local<v8::Object> recv, v8::Local<v8::Function> f) {
1206 break_point_hit_count = 0; 1213 break_point_hit_count = 0;
1207 1214
(...skipping 15 matching lines...) Expand all
1223 } 1230 }
1224 1231
1225 1232
1226 // Test that a break point can be set at a return store location. 1233 // Test that a break point can be set at a return store location.
1227 TEST(BreakPointSurviveGC) { 1234 TEST(BreakPointSurviveGC) {
1228 break_point_hit_count = 0; 1235 break_point_hit_count = 0;
1229 DebugLocalContext env; 1236 DebugLocalContext env;
1230 v8::HandleScope scope(env->GetIsolate()); 1237 v8::HandleScope scope(env->GetIsolate());
1231 v8::Local<v8::Context> context = env.context(); 1238 v8::Local<v8::Context> context = env.context();
1232 1239
1233 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1240 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1234 DebugEventBreakPointHitCount);
1235 v8::Local<v8::Function> foo; 1241 v8::Local<v8::Function> foo;
1236 1242
1237 // Test IC store break point with garbage collection. 1243 // Test IC store break point with garbage collection.
1238 { 1244 {
1239 CompileFunction(&env, "function foo(){}", "foo"); 1245 CompileFunction(&env, "function foo(){}", "foo");
1240 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1246 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
1241 SetBreakPoint(foo, 0); 1247 SetBreakPoint(foo, 0);
1242 } 1248 }
1243 CallAndGC(context, env->Global(), foo); 1249 CallAndGC(context, env->Global(), foo);
1244 1250
(...skipping 24 matching lines...) Expand all
1269 CallAndGC(context, env->Global(), foo); 1275 CallAndGC(context, env->Global(), foo);
1270 1276
1271 // Test non IC break point with garbage collection. 1277 // Test non IC break point with garbage collection.
1272 { 1278 {
1273 CompileFunction(&env, "function foo(){}", "foo"); 1279 CompileFunction(&env, "function foo(){}", "foo");
1274 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo"); 1280 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo");
1275 SetBreakPoint(foo, 0); 1281 SetBreakPoint(foo, 0);
1276 } 1282 }
1277 CallAndGC(context, env->Global(), foo); 1283 CallAndGC(context, env->Global(), foo);
1278 1284
1279 1285 SetDebugEventListener(env->GetIsolate(), nullptr);
1280 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
1281 CheckDebuggerUnloaded(env->GetIsolate()); 1286 CheckDebuggerUnloaded(env->GetIsolate());
1282 } 1287 }
1283 1288
1284 1289
1285 // Test that break points can be set using the global Debug object. 1290 // Test that break points can be set using the global Debug object.
1286 TEST(BreakPointThroughJavaScript) { 1291 TEST(BreakPointThroughJavaScript) {
1287 break_point_hit_count = 0; 1292 break_point_hit_count = 0;
1288 DebugLocalContext env; 1293 DebugLocalContext env;
1289 v8::Isolate* isolate = env->GetIsolate(); 1294 v8::Isolate* isolate = env->GetIsolate();
1290 v8::HandleScope scope(isolate); 1295 v8::HandleScope scope(isolate);
1291 v8::Local<v8::Context> context = env.context(); 1296 v8::Local<v8::Context> context = env.context();
1292 env.ExposeDebug(); 1297 env.ExposeDebug();
1293 1298
1294 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); 1299 SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
1295 CompileRunChecked(isolate, "function bar(){}"); 1300 CompileRunChecked(isolate, "function bar(){}");
1296 CompileFunction(isolate, "function foo(){bar();bar();}", "foo"); 1301 CompileFunction(isolate, "function foo(){bar();bar();}", "foo");
1297 // 012345678901234567890 1302 // 012345678901234567890
1298 // 1 2 1303 // 1 2
1299 // Break points are set at position 3 and 9 1304 // Break points are set at position 3 and 9
1300 v8::Local<v8::String> source = v8_str(env->GetIsolate(), "foo()"); 1305 v8::Local<v8::String> source = v8_str(env->GetIsolate(), "foo()");
1301 v8::Local<v8::Script> foo = 1306 v8::Local<v8::Script> foo =
1302 v8::Script::Compile(context, source).ToLocalChecked(); 1307 v8::Script::Compile(context, source).ToLocalChecked();
1303 1308
1304 CHECK_EQ(0, break_point_hit_count); 1309 CHECK_EQ(0, break_point_hit_count);
(...skipping 17 matching lines...) Expand all
1322 foo->Run(context).ToLocalChecked(); 1327 foo->Run(context).ToLocalChecked();
1323 CHECK_EQ(7, break_point_hit_count); 1328 CHECK_EQ(7, break_point_hit_count);
1324 foo->Run(context).ToLocalChecked(); 1329 foo->Run(context).ToLocalChecked();
1325 CHECK_EQ(8, break_point_hit_count); 1330 CHECK_EQ(8, break_point_hit_count);
1326 1331
1327 // Run without breakpoints. 1332 // Run without breakpoints.
1328 ClearBreakPointFromJS(env->GetIsolate(), bp1); 1333 ClearBreakPointFromJS(env->GetIsolate(), bp1);
1329 foo->Run(context).ToLocalChecked(); 1334 foo->Run(context).ToLocalChecked();
1330 CHECK_EQ(8, break_point_hit_count); 1335 CHECK_EQ(8, break_point_hit_count);
1331 1336
1332 v8::Debug::SetDebugEventListener(isolate, nullptr); 1337 SetDebugEventListener(isolate, nullptr);
1333 CheckDebuggerUnloaded(isolate); 1338 CheckDebuggerUnloaded(isolate);
1334 1339
1335 // Make sure that the break point numbers are consecutive. 1340 // Make sure that the break point numbers are consecutive.
1336 CHECK_EQ(1, bp1); 1341 CHECK_EQ(1, bp1);
1337 CHECK_EQ(2, bp2); 1342 CHECK_EQ(2, bp2);
1338 } 1343 }
1339 1344
1340 1345
1341 // Test that break points on scripts identified by name can be set using the 1346 // Test that break points on scripts identified by name can be set using the
1342 // global Debug object. 1347 // global Debug object.
1343 TEST(ScriptBreakPointByNameThroughJavaScript) { 1348 TEST(ScriptBreakPointByNameThroughJavaScript) {
1344 break_point_hit_count = 0; 1349 break_point_hit_count = 0;
1345 DebugLocalContext env; 1350 DebugLocalContext env;
1346 v8::Isolate* isolate = env->GetIsolate(); 1351 v8::Isolate* isolate = env->GetIsolate();
1347 v8::HandleScope scope(isolate); 1352 v8::HandleScope scope(isolate);
1348 v8::Local<v8::Context> context = env.context(); 1353 v8::Local<v8::Context> context = env.context();
1349 env.ExposeDebug(); 1354 env.ExposeDebug();
1350 1355
1351 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); 1356 SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
1352 1357
1353 v8::Local<v8::String> script = v8_str(isolate, 1358 v8::Local<v8::String> script = v8_str(isolate,
1354 "function f() {\n" 1359 "function f() {\n"
1355 " function h() {\n" 1360 " function h() {\n"
1356 " a = 0; // line 2\n" 1361 " a = 0; // line 2\n"
1357 " }\n" 1362 " }\n"
1358 " b = 1; // line 4\n" 1363 " b = 1; // line 4\n"
1359 " return h();\n" 1364 " return h();\n"
1360 "}\n" 1365 "}\n"
1361 "\n" 1366 "\n"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 ClearBreakPointFromJS(isolate, sbp2); 1432 ClearBreakPointFromJS(isolate, sbp2);
1428 ClearBreakPointFromJS(isolate, sbp3); 1433 ClearBreakPointFromJS(isolate, sbp3);
1429 ClearBreakPointFromJS(isolate, sbp4); 1434 ClearBreakPointFromJS(isolate, sbp4);
1430 ClearBreakPointFromJS(isolate, sbp5); 1435 ClearBreakPointFromJS(isolate, sbp5);
1431 ClearBreakPointFromJS(isolate, sbp6); 1436 ClearBreakPointFromJS(isolate, sbp6);
1432 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1437 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1433 CHECK_EQ(0, break_point_hit_count); 1438 CHECK_EQ(0, break_point_hit_count);
1434 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1439 g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1435 CHECK_EQ(0, break_point_hit_count); 1440 CHECK_EQ(0, break_point_hit_count);
1436 1441
1437 v8::Debug::SetDebugEventListener(isolate, nullptr); 1442 SetDebugEventListener(isolate, nullptr);
1438 CheckDebuggerUnloaded(isolate); 1443 CheckDebuggerUnloaded(isolate);
1439 1444
1440 // Make sure that the break point numbers are consecutive. 1445 // Make sure that the break point numbers are consecutive.
1441 CHECK_EQ(1, sbp1); 1446 CHECK_EQ(1, sbp1);
1442 CHECK_EQ(2, sbp2); 1447 CHECK_EQ(2, sbp2);
1443 CHECK_EQ(3, sbp3); 1448 CHECK_EQ(3, sbp3);
1444 CHECK_EQ(4, sbp4); 1449 CHECK_EQ(4, sbp4);
1445 CHECK_EQ(5, sbp5); 1450 CHECK_EQ(5, sbp5);
1446 CHECK_EQ(6, sbp6); 1451 CHECK_EQ(6, sbp6);
1447 } 1452 }
1448 1453
1449 1454
1450 TEST(ScriptBreakPointByIdThroughJavaScript) { 1455 TEST(ScriptBreakPointByIdThroughJavaScript) {
1451 break_point_hit_count = 0; 1456 break_point_hit_count = 0;
1452 DebugLocalContext env; 1457 DebugLocalContext env;
1453 v8::Isolate* isolate = env->GetIsolate(); 1458 v8::Isolate* isolate = env->GetIsolate();
1454 v8::HandleScope scope(isolate); 1459 v8::HandleScope scope(isolate);
1455 v8::Local<v8::Context> context = env.context(); 1460 v8::Local<v8::Context> context = env.context();
1456 env.ExposeDebug(); 1461 env.ExposeDebug();
1457 1462
1458 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); 1463 SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
1459 1464
1460 v8::Local<v8::String> source = v8_str(isolate, 1465 v8::Local<v8::String> source = v8_str(isolate,
1461 "function f() {\n" 1466 "function f() {\n"
1462 " function h() {\n" 1467 " function h() {\n"
1463 " a = 0; // line 2\n" 1468 " a = 0; // line 2\n"
1464 " }\n" 1469 " }\n"
1465 " b = 1; // line 4\n" 1470 " b = 1; // line 4\n"
1466 " return h();\n" 1471 " return h();\n"
1467 "}\n" 1472 "}\n"
1468 "\n" 1473 "\n"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1536 ClearBreakPointFromJS(env->GetIsolate(), sbp2); 1541 ClearBreakPointFromJS(env->GetIsolate(), sbp2);
1537 ClearBreakPointFromJS(env->GetIsolate(), sbp3); 1542 ClearBreakPointFromJS(env->GetIsolate(), sbp3);
1538 ClearBreakPointFromJS(env->GetIsolate(), sbp4); 1543 ClearBreakPointFromJS(env->GetIsolate(), sbp4);
1539 ClearBreakPointFromJS(env->GetIsolate(), sbp5); 1544 ClearBreakPointFromJS(env->GetIsolate(), sbp5);
1540 ClearBreakPointFromJS(env->GetIsolate(), sbp6); 1545 ClearBreakPointFromJS(env->GetIsolate(), sbp6);
1541 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1546 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1542 CHECK_EQ(0, break_point_hit_count); 1547 CHECK_EQ(0, break_point_hit_count);
1543 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1548 g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1544 CHECK_EQ(0, break_point_hit_count); 1549 CHECK_EQ(0, break_point_hit_count);
1545 1550
1546 v8::Debug::SetDebugEventListener(isolate, nullptr); 1551 SetDebugEventListener(isolate, nullptr);
1547 CheckDebuggerUnloaded(isolate); 1552 CheckDebuggerUnloaded(isolate);
1548 1553
1549 // Make sure that the break point numbers are consecutive. 1554 // Make sure that the break point numbers are consecutive.
1550 CHECK_EQ(1, sbp1); 1555 CHECK_EQ(1, sbp1);
1551 CHECK_EQ(2, sbp2); 1556 CHECK_EQ(2, sbp2);
1552 CHECK_EQ(3, sbp3); 1557 CHECK_EQ(3, sbp3);
1553 CHECK_EQ(4, sbp4); 1558 CHECK_EQ(4, sbp4);
1554 CHECK_EQ(5, sbp5); 1559 CHECK_EQ(5, sbp5);
1555 CHECK_EQ(6, sbp6); 1560 CHECK_EQ(6, sbp6);
1556 } 1561 }
1557 1562
1558 1563
1559 // Test conditional script break points. 1564 // Test conditional script break points.
1560 TEST(EnableDisableScriptBreakPoint) { 1565 TEST(EnableDisableScriptBreakPoint) {
1561 break_point_hit_count = 0; 1566 break_point_hit_count = 0;
1562 DebugLocalContext env; 1567 DebugLocalContext env;
1563 v8::Isolate* isolate = env->GetIsolate(); 1568 v8::Isolate* isolate = env->GetIsolate();
1564 v8::HandleScope scope(isolate); 1569 v8::HandleScope scope(isolate);
1565 v8::Local<v8::Context> context = env.context(); 1570 v8::Local<v8::Context> context = env.context();
1566 env.ExposeDebug(); 1571 env.ExposeDebug();
1567 1572
1568 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); 1573 SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
1569 1574
1570 v8::Local<v8::String> script = v8_str(isolate, 1575 v8::Local<v8::String> script = v8_str(isolate,
1571 "function f() {\n" 1576 "function f() {\n"
1572 " a = 0; // line 1\n" 1577 " a = 0; // line 1\n"
1573 "};"); 1578 "};");
1574 1579
1575 // Compile the script and get function f. 1580 // Compile the script and get function f.
1576 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test")); 1581 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test"));
1577 v8::Script::Compile(context, script, &origin) 1582 v8::Script::Compile(context, script, &origin)
1578 .ToLocalChecked() 1583 .ToLocalChecked()
(...skipping 15 matching lines...) Expand all
1594 CHECK_EQ(1, break_point_hit_count); 1599 CHECK_EQ(1, break_point_hit_count);
1595 1600
1596 EnableScriptBreakPointFromJS(isolate, sbp); 1601 EnableScriptBreakPointFromJS(isolate, sbp);
1597 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1602 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1598 CHECK_EQ(2, break_point_hit_count); 1603 CHECK_EQ(2, break_point_hit_count);
1599 1604
1600 DisableScriptBreakPointFromJS(isolate, sbp); 1605 DisableScriptBreakPointFromJS(isolate, sbp);
1601 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1606 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1602 CHECK_EQ(2, break_point_hit_count); 1607 CHECK_EQ(2, break_point_hit_count);
1603 1608
1604 v8::Debug::SetDebugEventListener(isolate, nullptr); 1609 SetDebugEventListener(isolate, nullptr);
1605 CheckDebuggerUnloaded(isolate); 1610 CheckDebuggerUnloaded(isolate);
1606 } 1611 }
1607 1612
1608 1613
1609 // Test conditional script break points. 1614 // Test conditional script break points.
1610 TEST(ConditionalScriptBreakPoint) { 1615 TEST(ConditionalScriptBreakPoint) {
1611 break_point_hit_count = 0; 1616 break_point_hit_count = 0;
1612 DebugLocalContext env; 1617 DebugLocalContext env;
1613 v8::HandleScope scope(env->GetIsolate()); 1618 v8::HandleScope scope(env->GetIsolate());
1614 env.ExposeDebug(); 1619 env.ExposeDebug();
1615 1620
1616 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1621 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1617 DebugEventBreakPointHitCount);
1618 1622
1619 v8::Local<v8::String> script = v8_str(env->GetIsolate(), 1623 v8::Local<v8::String> script = v8_str(env->GetIsolate(),
1620 "count = 0;\n" 1624 "count = 0;\n"
1621 "function f() {\n" 1625 "function f() {\n"
1622 " g(count++); // line 2\n" 1626 " g(count++); // line 2\n"
1623 "};\n" 1627 "};\n"
1624 "function g(x) {\n" 1628 "function g(x) {\n"
1625 " var a=x; // line 5\n" 1629 " var a=x; // line 5\n"
1626 "};"); 1630 "};");
1627 1631
(...skipping 23 matching lines...) Expand all
1651 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1655 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
1652 CHECK_EQ(1, break_point_hit_count); 1656 CHECK_EQ(1, break_point_hit_count);
1653 1657
1654 ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "x % 2 == 0"); 1658 ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "x % 2 == 0");
1655 break_point_hit_count = 0; 1659 break_point_hit_count = 0;
1656 for (int i = 0; i < 10; i++) { 1660 for (int i = 0; i < 10; i++) {
1657 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); 1661 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
1658 } 1662 }
1659 CHECK_EQ(5, break_point_hit_count); 1663 CHECK_EQ(5, break_point_hit_count);
1660 1664
1661 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1665 SetDebugEventListener(env->GetIsolate(), nullptr);
1662 CheckDebuggerUnloaded(env->GetIsolate()); 1666 CheckDebuggerUnloaded(env->GetIsolate());
1663 } 1667 }
1664 1668
1665 1669
1666 // Test when several scripts has the same script data 1670 // Test when several scripts has the same script data
1667 TEST(ScriptBreakPointMultiple) { 1671 TEST(ScriptBreakPointMultiple) {
1668 break_point_hit_count = 0; 1672 break_point_hit_count = 0;
1669 DebugLocalContext env; 1673 DebugLocalContext env;
1670 v8::HandleScope scope(env->GetIsolate()); 1674 v8::HandleScope scope(env->GetIsolate());
1671 env.ExposeDebug(); 1675 env.ExposeDebug();
1672 1676
1673 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1677 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1674 DebugEventBreakPointHitCount);
1675 1678
1676 v8::Local<v8::Context> context = env.context(); 1679 v8::Local<v8::Context> context = env.context();
1677 v8::Local<v8::Function> f; 1680 v8::Local<v8::Function> f;
1678 v8::Local<v8::String> script_f = v8_str(env->GetIsolate(), 1681 v8::Local<v8::String> script_f = v8_str(env->GetIsolate(),
1679 "function f() {\n" 1682 "function f() {\n"
1680 " a = 0; // line 1\n" 1683 " a = 0; // line 1\n"
1681 "}"); 1684 "}");
1682 1685
1683 v8::Local<v8::Function> g; 1686 v8::Local<v8::Function> g;
1684 v8::Local<v8::String> script_g = v8_str(env->GetIsolate(), 1687 v8::Local<v8::String> script_g = v8_str(env->GetIsolate(),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1728 // Set script break point with the scripts loaded. 1731 // Set script break point with the scripts loaded.
1729 sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); 1732 sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0);
1730 1733
1731 // Call f and g and check that the script break point is active. 1734 // Call f and g and check that the script break point is active.
1732 break_point_hit_count = 0; 1735 break_point_hit_count = 0;
1733 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1736 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1734 CHECK_EQ(1, break_point_hit_count); 1737 CHECK_EQ(1, break_point_hit_count);
1735 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1738 g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1736 CHECK_EQ(2, break_point_hit_count); 1739 CHECK_EQ(2, break_point_hit_count);
1737 1740
1738 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1741 SetDebugEventListener(env->GetIsolate(), nullptr);
1739 CheckDebuggerUnloaded(env->GetIsolate()); 1742 CheckDebuggerUnloaded(env->GetIsolate());
1740 } 1743 }
1741 1744
1742 1745
1743 // Test the script origin which has both name and line offset. 1746 // Test the script origin which has both name and line offset.
1744 TEST(ScriptBreakPointLineOffset) { 1747 TEST(ScriptBreakPointLineOffset) {
1745 break_point_hit_count = 0; 1748 break_point_hit_count = 0;
1746 DebugLocalContext env; 1749 DebugLocalContext env;
1747 v8::HandleScope scope(env->GetIsolate()); 1750 v8::HandleScope scope(env->GetIsolate());
1748 env.ExposeDebug(); 1751 env.ExposeDebug();
1749 1752
1750 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1753 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1751 DebugEventBreakPointHitCount);
1752 1754
1753 v8::Local<v8::Context> context = env.context(); 1755 v8::Local<v8::Context> context = env.context();
1754 v8::Local<v8::Function> f; 1756 v8::Local<v8::Function> f;
1755 v8::Local<v8::String> script = 1757 v8::Local<v8::String> script =
1756 v8_str(env->GetIsolate(), 1758 v8_str(env->GetIsolate(),
1757 "function f() {\n" 1759 "function f() {\n"
1758 " a = 0; // line 8 as this script has line offset 7\n" 1760 " a = 0; // line 8 as this script has line offset 7\n"
1759 " b = 0; // line 9 as this script has line offset 7\n" 1761 " b = 0; // line 9 as this script has line offset 7\n"
1760 "}"); 1762 "}");
1761 1763
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 CHECK_EQ(0, break_point_hit_count); 1796 CHECK_EQ(0, break_point_hit_count);
1795 1797
1796 // Set a script break point with the script loaded. 1798 // Set a script break point with the script loaded.
1797 sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); 1799 sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0);
1798 1800
1799 // Call f and check that the script break point is active. 1801 // Call f and check that the script break point is active.
1800 break_point_hit_count = 0; 1802 break_point_hit_count = 0;
1801 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1803 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1802 CHECK_EQ(1, break_point_hit_count); 1804 CHECK_EQ(1, break_point_hit_count);
1803 1805
1804 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1806 SetDebugEventListener(env->GetIsolate(), nullptr);
1805 CheckDebuggerUnloaded(env->GetIsolate()); 1807 CheckDebuggerUnloaded(env->GetIsolate());
1806 } 1808 }
1807 1809
1808 1810
1809 // Test script break points set on lines. 1811 // Test script break points set on lines.
1810 TEST(ScriptBreakPointLine) { 1812 TEST(ScriptBreakPointLine) {
1811 DebugLocalContext env; 1813 DebugLocalContext env;
1812 v8::HandleScope scope(env->GetIsolate()); 1814 v8::HandleScope scope(env->GetIsolate());
1813 env.ExposeDebug(); 1815 env.ExposeDebug();
1814 1816
1815 // Create a function for checking the function when hitting a break point. 1817 // Create a function for checking the function when hitting a break point.
1816 frame_function_name = CompileFunction(&env, 1818 frame_function_name = CompileFunction(&env,
1817 frame_function_name_source, 1819 frame_function_name_source,
1818 "frame_function_name"); 1820 "frame_function_name");
1819 1821
1820 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1822 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1821 DebugEventBreakPointHitCount);
1822 1823
1823 v8::Local<v8::Context> context = env.context(); 1824 v8::Local<v8::Context> context = env.context();
1824 v8::Local<v8::Function> f; 1825 v8::Local<v8::Function> f;
1825 v8::Local<v8::Function> g; 1826 v8::Local<v8::Function> g;
1826 v8::Local<v8::String> script = 1827 v8::Local<v8::String> script =
1827 v8_str(env->GetIsolate(), 1828 v8_str(env->GetIsolate(),
1828 "a = 0 // line 0\n" 1829 "a = 0 // line 0\n"
1829 "function f() {\n" 1830 "function f() {\n"
1830 " a = 1; // line 2\n" 1831 " a = 1; // line 2\n"
1831 "}\n" 1832 "}\n"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1909 v8::Script::Compile(context, script, &origin) 1910 v8::Script::Compile(context, script, &origin)
1910 .ToLocalChecked() 1911 .ToLocalChecked()
1911 ->Run(context) 1912 ->Run(context)
1912 .ToLocalChecked(); 1913 .ToLocalChecked();
1913 CHECK_EQ(0, break_point_hit_count); 1914 CHECK_EQ(0, break_point_hit_count);
1914 1915
1915 ClearBreakPointFromJS(env->GetIsolate(), sbp1); 1916 ClearBreakPointFromJS(env->GetIsolate(), sbp1);
1916 ClearBreakPointFromJS(env->GetIsolate(), sbp5); 1917 ClearBreakPointFromJS(env->GetIsolate(), sbp5);
1917 ClearBreakPointFromJS(env->GetIsolate(), sbp6); 1918 ClearBreakPointFromJS(env->GetIsolate(), sbp6);
1918 1919
1919 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1920 SetDebugEventListener(env->GetIsolate(), nullptr);
1920 CheckDebuggerUnloaded(env->GetIsolate()); 1921 CheckDebuggerUnloaded(env->GetIsolate());
1921 } 1922 }
1922 1923
1923 1924
1924 // Test top level script break points set on lines. 1925 // Test top level script break points set on lines.
1925 TEST(ScriptBreakPointLineTopLevel) { 1926 TEST(ScriptBreakPointLineTopLevel) {
1926 DebugLocalContext env; 1927 DebugLocalContext env;
1927 v8::HandleScope scope(env->GetIsolate()); 1928 v8::HandleScope scope(env->GetIsolate());
1928 env.ExposeDebug(); 1929 env.ExposeDebug();
1929 1930
1930 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1931 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1931 DebugEventBreakPointHitCount);
1932 1932
1933 v8::Local<v8::Context> context = env.context(); 1933 v8::Local<v8::Context> context = env.context();
1934 v8::Local<v8::String> script = 1934 v8::Local<v8::String> script =
1935 v8_str(env->GetIsolate(), 1935 v8_str(env->GetIsolate(),
1936 "function f() {\n" 1936 "function f() {\n"
1937 " a = 1; // line 1\n" 1937 " a = 1; // line 1\n"
1938 "}\n" 1938 "}\n"
1939 "a = 2; // line 3\n"); 1939 "a = 2; // line 3\n");
1940 v8::Local<v8::Function> f; 1940 v8::Local<v8::Function> f;
1941 { 1941 {
(...skipping 12 matching lines...) Expand all
1954 // Call f and check that there was no break points. 1954 // Call f and check that there was no break points.
1955 break_point_hit_count = 0; 1955 break_point_hit_count = 0;
1956 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 1956 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
1957 CHECK_EQ(0, break_point_hit_count); 1957 CHECK_EQ(0, break_point_hit_count);
1958 1958
1959 // Recompile and run script and check that break point was not reapplied. 1959 // Recompile and run script and check that break point was not reapplied.
1960 break_point_hit_count = 0; 1960 break_point_hit_count = 0;
1961 CompileRunWithOrigin(script, "test.html"); 1961 CompileRunWithOrigin(script, "test.html");
1962 CHECK_EQ(0, break_point_hit_count); 1962 CHECK_EQ(0, break_point_hit_count);
1963 1963
1964 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1964 SetDebugEventListener(env->GetIsolate(), nullptr);
1965 CheckDebuggerUnloaded(env->GetIsolate()); 1965 CheckDebuggerUnloaded(env->GetIsolate());
1966 } 1966 }
1967 1967
1968 1968
1969 // Test that it is possible to add and remove break points in a top level 1969 // Test that it is possible to add and remove break points in a top level
1970 // function which has no references but has not been collected yet. 1970 // function which has no references but has not been collected yet.
1971 TEST(ScriptBreakPointTopLevelCrash) { 1971 TEST(ScriptBreakPointTopLevelCrash) {
1972 DebugLocalContext env; 1972 DebugLocalContext env;
1973 v8::HandleScope scope(env->GetIsolate()); 1973 v8::HandleScope scope(env->GetIsolate());
1974 env.ExposeDebug(); 1974 env.ExposeDebug();
1975 1975
1976 v8::Debug::SetDebugEventListener(env->GetIsolate(), 1976 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount);
1977 DebugEventBreakPointHitCount);
1978 1977
1979 CompileRunWithOrigin( 1978 CompileRunWithOrigin(
1980 "function f() {\n" 1979 "function f() {\n"
1981 " return 0;\n" 1980 " return 0;\n"
1982 "}\n", 1981 "}\n",
1983 "test.html"); 1982 "test.html");
1984 int sbp1 = 1983 int sbp1 =
1985 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 1, -1); 1984 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 1, -1);
1986 break_point_hit_count = 0; 1985 break_point_hit_count = 0;
1987 1986
1988 CompileRun("f();"); 1987 CompileRun("f();");
1989 1988
1990 CHECK_EQ(1, break_point_hit_count); 1989 CHECK_EQ(1, break_point_hit_count);
1991 1990
1992 int sbp2 = 1991 int sbp2 =
1993 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); 1992 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1);
1994 ClearBreakPointFromJS(env->GetIsolate(), sbp1); 1993 ClearBreakPointFromJS(env->GetIsolate(), sbp1);
1995 ClearBreakPointFromJS(env->GetIsolate(), sbp2); 1994 ClearBreakPointFromJS(env->GetIsolate(), sbp2);
1996 1995
1997 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 1996 SetDebugEventListener(env->GetIsolate(), nullptr);
1998 CheckDebuggerUnloaded(env->GetIsolate()); 1997 CheckDebuggerUnloaded(env->GetIsolate());
1999 } 1998 }
2000 1999
2001 2000
2002 // Test that it is possible to remove the last break point for a function 2001 // Test that it is possible to remove the last break point for a function
2003 // inside the break handling of that break point. 2002 // inside the break handling of that break point.
2004 TEST(RemoveBreakPointInBreak) { 2003 TEST(RemoveBreakPointInBreak) {
2005 DebugLocalContext env; 2004 DebugLocalContext env;
2006 v8::HandleScope scope(env->GetIsolate()); 2005 v8::HandleScope scope(env->GetIsolate());
2007 2006
(...skipping 1939 matching lines...) Expand 10 before | Expand all | Expand 10 after
3947 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1), 3946 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1),
3948 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1)}; 3947 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1)};
3949 3948
3950 // Call all functions to make sure that they are compiled. 3949 // Call all functions to make sure that they are compiled.
3951 f0->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 3950 f0->Call(context, env->Global(), 0, NULL).ToLocalChecked();
3952 f1->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 3951 f1->Call(context, env->Global(), 0, NULL).ToLocalChecked();
3953 f2->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 3952 f2->Call(context, env->Global(), 0, NULL).ToLocalChecked();
3954 f3->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 3953 f3->Call(context, env->Global(), 0, NULL).ToLocalChecked();
3955 3954
3956 // Set the debug break flag. 3955 // Set the debug break flag.
3957 v8::Debug::DebugBreak(env->GetIsolate()); 3956 v8::debug::DebugBreak(env->GetIsolate());
3958 3957
3959 // Call all functions with different argument count. 3958 // Call all functions with different argument count.
3960 break_point_hit_count = 0; 3959 break_point_hit_count = 0;
3961 for (unsigned int i = 0; i < arraysize(argv); i++) { 3960 for (unsigned int i = 0; i < arraysize(argv); i++) {
3962 f0->Call(context, env->Global(), i, argv).ToLocalChecked(); 3961 f0->Call(context, env->Global(), i, argv).ToLocalChecked();
3963 f1->Call(context, env->Global(), i, argv).ToLocalChecked(); 3962 f1->Call(context, env->Global(), i, argv).ToLocalChecked();
3964 f2->Call(context, env->Global(), i, argv).ToLocalChecked(); 3963 f2->Call(context, env->Global(), i, argv).ToLocalChecked();
3965 f3->Call(context, env->Global(), i, argv).ToLocalChecked(); 3964 f3->Call(context, env->Global(), i, argv).ToLocalChecked();
3966 } 3965 }
3967 3966
(...skipping 14 matching lines...) Expand all
3982 3981
3983 // Register a debug event listener which sets the break flag and counts. 3982 // Register a debug event listener which sets the break flag and counts.
3984 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); 3983 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
3985 3984
3986 v8::Local<v8::Context> context = env.context(); 3985 v8::Local<v8::Context> context = env.context();
3987 // Create a function for testing stepping. 3986 // Create a function for testing stepping.
3988 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; 3987 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}";
3989 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 3988 v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
3990 3989
3991 // Set, test and cancel debug break. 3990 // Set, test and cancel debug break.
3992 v8::Debug::DebugBreak(env->GetIsolate()); 3991 v8::debug::DebugBreak(env->GetIsolate());
3993 v8::Debug::CancelDebugBreak(env->GetIsolate()); 3992 v8::Debug::CancelDebugBreak(env->GetIsolate());
3994 3993
3995 // Set the debug break flag. 3994 // Set the debug break flag.
3996 v8::Debug::DebugBreak(env->GetIsolate()); 3995 v8::debug::DebugBreak(env->GetIsolate());
3997 3996
3998 // Call all functions with different argument count. 3997 // Call all functions with different argument count.
3999 break_point_hit_count = 0; 3998 break_point_hit_count = 0;
4000 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 3999 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
4001 CHECK_EQ(1, break_point_hit_count); 4000 CHECK_EQ(1, break_point_hit_count);
4002 4001
4003 { 4002 {
4004 v8::Debug::DebugBreak(env->GetIsolate()); 4003 v8::debug::DebugBreak(env->GetIsolate());
4005 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); 4004 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate());
4006 v8::internal::DisableBreak disable_break(isolate->debug()); 4005 v8::internal::DisableBreak disable_break(isolate->debug());
4007 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 4006 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
4008 CHECK_EQ(1, break_point_hit_count); 4007 CHECK_EQ(1, break_point_hit_count);
4009 } 4008 }
4010 4009
4011 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 4010 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
4012 CHECK_EQ(2, break_point_hit_count); 4011 CHECK_EQ(2, break_point_hit_count);
4013 4012
4014 // Get rid of the debug event listener. 4013 // Get rid of the debug event listener.
(...skipping 25 matching lines...) Expand all
4040 // http://crbug.com/28933 4039 // http://crbug.com/28933
4041 // Test that debug break is disabled when bootstrapper is active. 4040 // Test that debug break is disabled when bootstrapper is active.
4042 TEST(NoBreakWhenBootstrapping) { 4041 TEST(NoBreakWhenBootstrapping) {
4043 v8::Isolate* isolate = CcTest::isolate(); 4042 v8::Isolate* isolate = CcTest::isolate();
4044 v8::HandleScope scope(isolate); 4043 v8::HandleScope scope(isolate);
4045 4044
4046 // Register a debug event listener which sets the break flag and counts. 4045 // Register a debug event listener which sets the break flag and counts.
4047 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter); 4046 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter);
4048 4047
4049 // Set the debug break flag. 4048 // Set the debug break flag.
4050 v8::Debug::DebugBreak(isolate); 4049 v8::debug::DebugBreak(isolate);
4051 break_point_hit_count = 0; 4050 break_point_hit_count = 0;
4052 { 4051 {
4053 // Create a context with an extension to make sure that some JavaScript 4052 // Create a context with an extension to make sure that some JavaScript
4054 // code is executed during bootstrapping. 4053 // code is executed during bootstrapping.
4055 v8::RegisterExtension(new v8::Extension("simpletest", 4054 v8::RegisterExtension(new v8::Extension("simpletest",
4056 kSimpleExtensionSource)); 4055 kSimpleExtensionSource));
4057 const char* extension_names[] = { "simpletest" }; 4056 const char* extension_names[] = { "simpletest" };
4058 v8::ExtensionConfiguration extensions(1, extension_names); 4057 v8::ExtensionConfiguration extensions(1, extension_names);
4059 v8::HandleScope handle_scope(isolate); 4058 v8::HandleScope handle_scope(isolate);
4060 v8::Context::New(isolate, &extensions); 4059 v8::Context::New(isolate, &extensions);
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
4586 CHECK(CompileRun("obj_mirror.property('a').value().value() == 1") 4585 CHECK(CompileRun("obj_mirror.property('a').value().value() == 1")
4587 ->BooleanValue(context) 4586 ->BooleanValue(context)
4588 .FromJust()); 4587 .FromJust());
4589 CHECK(CompileRun("obj_mirror.property('b').value().value() == 2") 4588 CHECK(CompileRun("obj_mirror.property('b').value().value() == 2")
4590 ->BooleanValue(context) 4589 ->BooleanValue(context)
4591 .FromJust()); 4590 .FromJust());
4592 } 4591 }
4593 4592
4594 4593
4595 TEST(SetDebugEventListenerOnUninitializedVM) { 4594 TEST(SetDebugEventListenerOnUninitializedVM) {
4596 v8::Debug::SetDebugEventListener(CcTest::isolate(), DummyDebugEventListener); 4595 EnableDebugger(CcTest::isolate());
4597 } 4596 }
4598 4597
4599 // Source for a JavaScript function which returns the data parameter of a 4598 // Source for a JavaScript function which returns the data parameter of a
4600 // function called in the context of the debugger. If no data parameter is 4599 // function called in the context of the debugger. If no data parameter is
4601 // passed it throws an exception. 4600 // passed it throws an exception.
4602 static const char* debugger_call_with_data_source = 4601 static const char* debugger_call_with_data_source =
4603 "function debugger_call_with_data(exec_state, data) {" 4602 "function debugger_call_with_data(exec_state, data) {"
4604 " if (data) return data;" 4603 " if (data) return data;"
4605 " throw 'No data!'" 4604 " throw 'No data!'"
4606 "}"; 4605 "}";
4607 v8::Local<v8::Function> debugger_call_with_data; 4606 v8::Local<v8::Function> debugger_call_with_data;
4608 4607
4609 4608
4610 // Source for a JavaScript function which returns the data parameter of a 4609 // Source for a JavaScript function which returns the data parameter of a
4611 // function called in the context of the debugger. If no data parameter is 4610 // function called in the context of the debugger. If no data parameter is
4612 // passed it throws an exception. 4611 // passed it throws an exception.
4613 static const char* debugger_call_with_closure_source = 4612 static const char* debugger_call_with_closure_source =
4614 "var x = 3;" 4613 "var x = 3;"
4615 "(function (exec_state) {" 4614 "(function (exec_state) {"
4616 " if (exec_state.y) return x - 1;" 4615 " if (exec_state.y) return x - 1;"
4617 " exec_state.y = x;" 4616 " exec_state.y = x;"
4618 " return exec_state.y" 4617 " return exec_state.y"
4619 "})"; 4618 "})";
4620 v8::Local<v8::Function> debugger_call_with_closure; 4619 v8::Local<v8::Function> debugger_call_with_closure;
4621 4620
4622 // Function to retrieve the number of JavaScript frames by calling a JavaScript 4621 // Function to retrieve the number of JavaScript frames by calling a JavaScript
4623 // in the debugger. 4622 // in the debugger.
4624 static void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) { 4623 static void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
4625 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); 4624 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
4626 CHECK(v8::Debug::Call(context, frame_count).ToLocalChecked()->IsNumber()); 4625 CHECK(v8::debug::Call(context, frame_count).ToLocalChecked()->IsNumber());
4627 CHECK_EQ(args[0]->Int32Value(context).FromJust(), 4626 CHECK_EQ(args[0]->Int32Value(context).FromJust(),
4628 v8::Debug::Call(context, frame_count) 4627 v8::debug::Call(context, frame_count)
4629 .ToLocalChecked() 4628 .ToLocalChecked()
4630 ->Int32Value(context) 4629 ->Int32Value(context)
4631 .FromJust()); 4630 .FromJust());
4632 } 4631 }
4633 4632
4634 4633
4635 // Function to retrieve the source line of the top JavaScript frame by calling a 4634 // Function to retrieve the source line of the top JavaScript frame by calling a
4636 // JavaScript function in the debugger. 4635 // JavaScript function in the debugger.
4637 static void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) { 4636 static void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) {
4638 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); 4637 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
4639 CHECK( 4638 CHECK(
4640 v8::Debug::Call(context, frame_source_line).ToLocalChecked()->IsNumber()); 4639 v8::debug::Call(context, frame_source_line).ToLocalChecked()->IsNumber());
4641 CHECK_EQ(args[0]->Int32Value(context).FromJust(), 4640 CHECK_EQ(args[0]->Int32Value(context).FromJust(),
4642 v8::Debug::Call(context, frame_source_line) 4641 v8::debug::Call(context, frame_source_line)
4643 .ToLocalChecked() 4642 .ToLocalChecked()
4644 ->Int32Value(context) 4643 ->Int32Value(context)
4645 .FromJust()); 4644 .FromJust());
4646 } 4645 }
4647 4646
4648 4647
4649 // Function to test passing an additional parameter to a JavaScript function 4648 // Function to test passing an additional parameter to a JavaScript function
4650 // called in the debugger. It also tests that functions called in the debugger 4649 // called in the debugger. It also tests that functions called in the debugger
4651 // can throw exceptions. 4650 // can throw exceptions.
4652 static void CheckDataParameter( 4651 static void CheckDataParameter(
4653 const v8::FunctionCallbackInfo<v8::Value>& args) { 4652 const v8::FunctionCallbackInfo<v8::Value>& args) {
4654 v8::Local<v8::String> data = v8_str(args.GetIsolate(), "Test"); 4653 v8::Local<v8::String> data = v8_str(args.GetIsolate(), "Test");
4655 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); 4654 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
4656 CHECK(v8::Debug::Call(context, debugger_call_with_data, data) 4655 CHECK(v8::debug::Call(context, debugger_call_with_data, data)
4657 .ToLocalChecked() 4656 .ToLocalChecked()
4658 ->IsString()); 4657 ->IsString());
4659 4658
4660 for (int i = 0; i < 3; i++) { 4659 for (int i = 0; i < 3; i++) {
4661 v8::TryCatch catcher(args.GetIsolate()); 4660 v8::TryCatch catcher(args.GetIsolate());
4662 CHECK(v8::Debug::Call(context, debugger_call_with_data).IsEmpty()); 4661 CHECK(v8::debug::Call(context, debugger_call_with_data).IsEmpty());
4663 CHECK(catcher.HasCaught()); 4662 CHECK(catcher.HasCaught());
4664 CHECK(catcher.Exception()->IsString()); 4663 CHECK(catcher.Exception()->IsString());
4665 } 4664 }
4666 } 4665 }
4667 4666
4668 4667
4669 // Function to test using a JavaScript with closure in the debugger. 4668 // Function to test using a JavaScript with closure in the debugger.
4670 static void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) { 4669 static void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) {
4671 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); 4670 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
4672 CHECK(v8::Debug::Call(context, debugger_call_with_closure) 4671 CHECK(v8::debug::Call(context, debugger_call_with_closure)
4673 .ToLocalChecked() 4672 .ToLocalChecked()
4674 ->IsNumber()); 4673 ->IsNumber());
4675 CHECK_EQ(3, v8::Debug::Call(context, debugger_call_with_closure) 4674 CHECK_EQ(3, v8::debug::Call(context, debugger_call_with_closure)
4676 .ToLocalChecked() 4675 .ToLocalChecked()
4677 ->Int32Value(context) 4676 ->Int32Value(context)
4678 .FromJust()); 4677 .FromJust());
4679 } 4678 }
4680 4679
4681 4680
4682 // Test functions called through the debugger. 4681 // Test functions called through the debugger.
4683 TEST(CallFunctionInDebugger) { 4682 TEST(CallFunctionInDebugger) {
4684 // Create and enter a context with the functions CheckFrameCount, 4683 // Create and enter a context with the functions CheckFrameCount,
4685 // CheckSourceLine and CheckDataParameter installed. 4684 // CheckSourceLine and CheckDataParameter installed.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4734 v8::Script::Compile(context, 4733 v8::Script::Compile(context,
4735 v8_str(isolate, debugger_call_with_closure_source)) 4734 v8_str(isolate, debugger_call_with_closure_source))
4736 .ToLocalChecked() 4735 .ToLocalChecked()
4737 ->Run(context) 4736 ->Run(context)
4738 .ToLocalChecked()); 4737 .ToLocalChecked());
4739 4738
4740 // Calling a function through the debugger returns 0 frames if there are 4739 // Calling a function through the debugger returns 0 frames if there are
4741 // no JavaScript frames. 4740 // no JavaScript frames.
4742 CHECK(v8::Integer::New(isolate, 0) 4741 CHECK(v8::Integer::New(isolate, 0)
4743 ->Equals(context, 4742 ->Equals(context,
4744 v8::Debug::Call(context, frame_count).ToLocalChecked()) 4743 v8::debug::Call(context, frame_count).ToLocalChecked())
4745 .FromJust()); 4744 .FromJust());
4746 4745
4747 // Test that the number of frames can be retrieved. 4746 // Test that the number of frames can be retrieved.
4748 v8::Script::Compile(context, v8_str(isolate, "CheckFrameCount(1)")) 4747 v8::Script::Compile(context, v8_str(isolate, "CheckFrameCount(1)"))
4749 .ToLocalChecked() 4748 .ToLocalChecked()
4750 ->Run(context) 4749 ->Run(context)
4751 .ToLocalChecked(); 4750 .ToLocalChecked();
4752 v8::Script::Compile(context, v8_str(isolate, 4751 v8::Script::Compile(context, v8_str(isolate,
4753 "function f() {" 4752 "function f() {"
4754 " CheckFrameCount(2);" 4753 " CheckFrameCount(2);"
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
5095 CheckDebuggerUnloaded(isolate); 5094 CheckDebuggerUnloaded(isolate);
5096 } 5095 }
5097 5096
5098 // Debug event listener which issues a debug break when it hits a break event. 5097 // Debug event listener which issues a debug break when it hits a break event.
5099 static int event_listener_break_hit_count = 0; 5098 static int event_listener_break_hit_count = 0;
5100 static void DebugBreakEventListener(const v8::Debug::EventDetails& details) { 5099 static void DebugBreakEventListener(const v8::Debug::EventDetails& details) {
5101 // Schedule a debug break for break events. 5100 // Schedule a debug break for break events.
5102 if (details.GetEvent() == v8::Break) { 5101 if (details.GetEvent() == v8::Break) {
5103 event_listener_break_hit_count++; 5102 event_listener_break_hit_count++;
5104 if (event_listener_break_hit_count == 1) { 5103 if (event_listener_break_hit_count == 1) {
5105 v8::Debug::DebugBreak(details.GetIsolate()); 5104 v8::debug::DebugBreak(details.GetIsolate());
5106 } 5105 }
5107 } 5106 }
5108 } 5107 }
5109 5108
5110 // Test that a debug break can be scheduled while in a event listener. 5109 // Test that a debug break can be scheduled while in a event listener.
5111 TEST(DebugBreakInEventListener) { 5110 TEST(DebugBreakInEventListener) {
5112 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f. 5111 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f.
5113 DebugLocalContext env; 5112 DebugLocalContext env;
5114 v8::HandleScope scope(env->GetIsolate()); 5113 v8::HandleScope scope(env->GetIsolate());
5115 5114
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
5163 } else { 5162 } else {
5164 CHECK(result->IsString()); 5163 CHECK(result->IsString());
5165 v8::Local<v8::String> function_name( 5164 v8::Local<v8::String> function_name(
5166 result->ToString(context).ToLocalChecked()); 5165 result->ToString(context).ToLocalChecked());
5167 function_name->WriteUtf8(last_function_hit); 5166 function_name->WriteUtf8(last_function_hit);
5168 } 5167 }
5169 } 5168 }
5170 5169
5171 // Keep forcing breaks. 5170 // Keep forcing breaks.
5172 if (break_point_hit_count < 20) { 5171 if (break_point_hit_count < 20) {
5173 v8::Debug::DebugBreak(CcTest::isolate()); 5172 v8::debug::DebugBreak(CcTest::isolate());
5174 } 5173 }
5175 } 5174 }
5176 } 5175 }
5177 5176
5178 5177
5179 TEST(RegExpDebugBreak) { 5178 TEST(RegExpDebugBreak) {
5180 // This test only applies to native regexps. 5179 // This test only applies to native regexps.
5181 DebugLocalContext env; 5180 DebugLocalContext env;
5182 v8::HandleScope scope(env->GetIsolate()); 5181 v8::HandleScope scope(env->GetIsolate());
5183 v8::Local<v8::Context> context = env.context(); 5182 v8::Local<v8::Context> context = env.context();
(...skipping 10 matching lines...) Expand all
5194 5193
5195 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); 5194 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f");
5196 const int argc = 1; 5195 const int argc = 1;
5197 v8::Local<v8::Value> argv[argc] = { 5196 v8::Local<v8::Value> argv[argc] = {
5198 v8_str(env->GetIsolate(), " /* xxx */ a=0;")}; 5197 v8_str(env->GetIsolate(), " /* xxx */ a=0;")};
5199 v8::Local<v8::Value> result = 5198 v8::Local<v8::Value> result =
5200 f->Call(context, env->Global(), argc, argv).ToLocalChecked(); 5199 f->Call(context, env->Global(), argc, argv).ToLocalChecked();
5201 CHECK_EQ(12, result->Int32Value(context).FromJust()); 5200 CHECK_EQ(12, result->Int32Value(context).FromJust());
5202 5201
5203 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak); 5202 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak);
5204 v8::Debug::DebugBreak(env->GetIsolate()); 5203 v8::debug::DebugBreak(env->GetIsolate());
5205 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked(); 5204 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked();
5206 5205
5207 // Check that there was only one break event. Matching RegExp should not 5206 // Check that there was only one break event. Matching RegExp should not
5208 // cause Break events. 5207 // cause Break events.
5209 CHECK_EQ(1, break_point_hit_count); 5208 CHECK_EQ(1, break_point_hit_count);
5210 CHECK_EQ(0, strcmp("f", last_function_hit)); 5209 CHECK_EQ(0, strcmp("f", last_function_hit));
5211 } 5210 }
5212 #endif // V8_INTERPRETED_REGEXP 5211 #endif // V8_INTERPRETED_REGEXP
5213 5212
5214 // Test which creates a context and sets embedder data on it. Checks that this 5213 // Test which creates a context and sets embedder data on it. Checks that this
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
5276 v8::Debug::SetDebugEventListener(env->GetIsolate(), 5275 v8::Debug::SetDebugEventListener(env->GetIsolate(),
5277 AfterCompileEventListener); 5276 AfterCompileEventListener);
5278 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) 5277 v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
5279 .ToLocalChecked() 5278 .ToLocalChecked()
5280 ->Run(context) 5279 ->Run(context)
5281 .ToLocalChecked(); 5280 .ToLocalChecked();
5282 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5281 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5283 5282
5284 v8::Debug::SetDebugEventListener(env->GetIsolate(), 5283 v8::Debug::SetDebugEventListener(env->GetIsolate(),
5285 AfterCompileEventListener); 5284 AfterCompileEventListener);
5286 v8::Debug::DebugBreak(env->GetIsolate()); 5285 v8::debug::DebugBreak(env->GetIsolate());
5287 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) 5286 v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
5288 .ToLocalChecked() 5287 .ToLocalChecked()
5289 ->Run(context) 5288 ->Run(context)
5290 .ToLocalChecked(); 5289 .ToLocalChecked();
5291 5290
5292 // Setting listener to NULL should cause debugger unload. 5291 // Setting listener to NULL should cause debugger unload.
5293 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5292 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5294 CheckDebuggerUnloaded(env->GetIsolate()); 5293 CheckDebuggerUnloaded(env->GetIsolate());
5295 5294
5296 // Compilation cache should be disabled when debugger is active. 5295 // Compilation cache should be disabled when debugger is active.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
5369 v8::Debug::SetDebugEventListener(env->GetIsolate(), 5368 v8::Debug::SetDebugEventListener(env->GetIsolate(),
5370 AfterCompileEventListener); 5369 AfterCompileEventListener);
5371 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) 5370 v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
5372 .ToLocalChecked() 5371 .ToLocalChecked()
5373 ->Run(context) 5372 ->Run(context)
5374 .ToLocalChecked(); 5373 .ToLocalChecked();
5375 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5374 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5376 5375
5377 v8::Debug::SetDebugEventListener(env->GetIsolate(), 5376 v8::Debug::SetDebugEventListener(env->GetIsolate(),
5378 AfterCompileEventListener); 5377 AfterCompileEventListener);
5379 v8::Debug::DebugBreak(env->GetIsolate()); 5378 v8::debug::DebugBreak(env->GetIsolate());
5380 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 5379 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
5381 env->Global() 5380 env->Global()
5382 ->Get(context, v8_str(env->GetIsolate(), "f")) 5381 ->Get(context, v8_str(env->GetIsolate(), "f"))
5383 .ToLocalChecked()); 5382 .ToLocalChecked());
5384 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 5383 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
5385 5384
5386 // Setting event listener to NULL should cause debugger unload. 5385 // Setting event listener to NULL should cause debugger unload.
5387 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5386 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5388 CheckDebuggerUnloaded(env->GetIsolate()); 5387 CheckDebuggerUnloaded(env->GetIsolate());
5389 5388
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
5484 // debug-delay.js is executed. 5483 // debug-delay.js is executed.
5485 TEST(NoDebugBreakInAfterCompileEventListener) { 5484 TEST(NoDebugBreakInAfterCompileEventListener) {
5486 DebugLocalContext env; 5485 DebugLocalContext env;
5487 v8::HandleScope scope(env->GetIsolate()); 5486 v8::HandleScope scope(env->GetIsolate());
5488 v8::Local<v8::Context> context = env.context(); 5487 v8::Local<v8::Context> context = env.context();
5489 5488
5490 // Register a debug event listener which sets the break flag and counts. 5489 // Register a debug event listener which sets the break flag and counts.
5491 v8::Debug::SetDebugEventListener(env->GetIsolate(), BreakEventListener); 5490 v8::Debug::SetDebugEventListener(env->GetIsolate(), BreakEventListener);
5492 5491
5493 // Set the debug break flag. 5492 // Set the debug break flag.
5494 v8::Debug::DebugBreak(env->GetIsolate()); 5493 v8::debug::DebugBreak(env->GetIsolate());
5495 5494
5496 // Create a function for testing stepping. 5495 // Create a function for testing stepping.
5497 const char* src = "function f() { eval('var x = 10;'); } "; 5496 const char* src = "function f() { eval('var x = 10;'); } ";
5498 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 5497 v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
5499 5498
5500 // There should be only one break event. 5499 // There should be only one break event.
5501 CHECK_EQ(1, break_point_hit_count); 5500 CHECK_EQ(1, break_point_hit_count);
5502 5501
5503 // Set the debug break flag again. 5502 // Set the debug break flag again.
5504 v8::Debug::DebugBreak(env->GetIsolate()); 5503 v8::debug::DebugBreak(env->GetIsolate());
5505 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 5504 f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
5506 // There should be one more break event when the script is evaluated in 'f'. 5505 // There should be one more break event when the script is evaluated in 'f'.
5507 CHECK_EQ(2, break_point_hit_count); 5506 CHECK_EQ(2, break_point_hit_count);
5508 5507
5509 // Get rid of the debug event listener. 5508 // Get rid of the debug event listener.
5510 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5509 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5511 CheckDebuggerUnloaded(env->GetIsolate()); 5510 CheckDebuggerUnloaded(env->GetIsolate());
5512 } 5511 }
5513 5512
5514 5513
5515 // Test that the debug break flag works with function.apply. 5514 // Test that the debug break flag works with function.apply.
5516 TEST(DebugBreakFunctionApply) { 5515 TEST(DebugBreakFunctionApply) {
5517 DebugLocalContext env; 5516 DebugLocalContext env;
5518 v8::HandleScope scope(env->GetIsolate()); 5517 v8::HandleScope scope(env->GetIsolate());
5519 v8::Local<v8::Context> context = env.context(); 5518 v8::Local<v8::Context> context = env.context();
5520 5519
5521 // Create a function for testing breaking in apply. 5520 // Create a function for testing breaking in apply.
5522 v8::Local<v8::Function> foo = CompileFunction( 5521 v8::Local<v8::Function> foo = CompileFunction(
5523 &env, 5522 &env,
5524 "function baz(x) { }" 5523 "function baz(x) { }"
5525 "function bar(x) { baz(); }" 5524 "function bar(x) { baz(); }"
5526 "function foo(){ bar.apply(this, [1]); }", 5525 "function foo(){ bar.apply(this, [1]); }",
5527 "foo"); 5526 "foo");
5528 5527
5529 // Register a debug event listener which steps and counts. 5528 // Register a debug event listener which steps and counts.
5530 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); 5529 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax);
5531 5530
5532 // Set the debug break flag before calling the code using function.apply. 5531 // Set the debug break flag before calling the code using function.apply.
5533 v8::Debug::DebugBreak(env->GetIsolate()); 5532 v8::debug::DebugBreak(env->GetIsolate());
5534 5533
5535 // Limit the number of debug breaks. This is a regression test for issue 493 5534 // Limit the number of debug breaks. This is a regression test for issue 493
5536 // where this test would enter an infinite loop. 5535 // where this test would enter an infinite loop.
5537 break_point_hit_count = 0; 5536 break_point_hit_count = 0;
5538 max_break_point_hit_count = 10000; // 10000 => infinite loop. 5537 max_break_point_hit_count = 10000; // 10000 => infinite loop.
5539 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); 5538 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
5540 5539
5541 // When keeping the debug break several break will happen. 5540 // When keeping the debug break several break will happen.
5542 CHECK_GT(break_point_hit_count, 1); 5541 CHECK_GT(break_point_hit_count, 1);
5543 5542
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
5681 v8::Local<v8::String> function_name( 5680 v8::Local<v8::String> function_name(
5682 result->ToString(context).ToLocalChecked()); 5681 result->ToString(context).ToLocalChecked());
5683 function_name->WriteUtf8(fn); 5682 function_name->WriteUtf8(fn);
5684 if (strcmp(fn, "bar") == 0) { 5683 if (strcmp(fn, "bar") == 0) {
5685 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); 5684 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate());
5686 debug_event_break_deoptimize_done = true; 5685 debug_event_break_deoptimize_done = true;
5687 } 5686 }
5688 } 5687 }
5689 } 5688 }
5690 5689
5691 v8::Debug::DebugBreak(CcTest::isolate()); 5690 v8::debug::DebugBreak(CcTest::isolate());
5692 } 5691 }
5693 } 5692 }
5694 5693
5695 5694
5696 // Test deoptimization when execution is broken using the debug break stack 5695 // Test deoptimization when execution is broken using the debug break stack
5697 // check interrupt. 5696 // check interrupt.
5698 TEST(DeoptimizeDuringDebugBreak) { 5697 TEST(DeoptimizeDuringDebugBreak) {
5699 DebugLocalContext env; 5698 DebugLocalContext env;
5700 v8::HandleScope scope(env->GetIsolate()); 5699 v8::HandleScope scope(env->GetIsolate());
5701 env.ExposeDebug(); 5700 env.ExposeDebug();
(...skipping 10 matching lines...) Expand all
5712 // time in function bar when using debug break and no break points will be at 5711 // time in function bar when using debug break and no break points will be at
5713 // the initial stack check. 5712 // the initial stack check.
5714 v8::Debug::SetDebugEventListener(env->GetIsolate(), 5713 v8::Debug::SetDebugEventListener(env->GetIsolate(),
5715 DebugEventBreakDeoptimize); 5714 DebugEventBreakDeoptimize);
5716 5715
5717 // Compile and run function bar which will optimize it for some flag settings. 5716 // Compile and run function bar which will optimize it for some flag settings.
5718 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar"); 5717 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar");
5719 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); 5718 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked();
5720 5719
5721 // Set debug break and call bar again. 5720 // Set debug break and call bar again.
5722 v8::Debug::DebugBreak(env->GetIsolate()); 5721 v8::debug::DebugBreak(env->GetIsolate());
5723 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); 5722 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked();
5724 5723
5725 CHECK(debug_event_break_deoptimize_done); 5724 CHECK(debug_event_break_deoptimize_done);
5726 5725
5727 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 5726 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
5728 } 5727 }
5729 5728
5730 5729
5731 static void DebugEventBreakWithOptimizedStack( 5730 static void DebugEventBreakWithOptimizedStack(
5732 const v8::Debug::EventDetails& event_details) { 5731 const v8::Debug::EventDetails& event_details) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5786 (result->Int32Value(context).FromJust() == 42)); 5785 (result->Int32Value(context).FromJust() == 42));
5787 } 5786 }
5788 } 5787 }
5789 } 5788 }
5790 } 5789 }
5791 5790
5792 5791
5793 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { 5792 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) {
5794 v8::Debug::SetDebugEventListener(args.GetIsolate(), 5793 v8::Debug::SetDebugEventListener(args.GetIsolate(),
5795 DebugEventBreakWithOptimizedStack); 5794 DebugEventBreakWithOptimizedStack);
5796 v8::Debug::DebugBreak(args.GetIsolate()); 5795 v8::debug::DebugBreak(args.GetIsolate());
5797 } 5796 }
5798 5797
5799 5798
5800 TEST(DebugBreakStackInspection) { 5799 TEST(DebugBreakStackInspection) {
5801 DebugLocalContext env; 5800 DebugLocalContext env;
5802 v8::HandleScope scope(env->GetIsolate()); 5801 v8::HandleScope scope(env->GetIsolate());
5803 v8::Local<v8::Context> context = env.context(); 5802 v8::Local<v8::Context> context = env.context();
5804 5803
5805 frame_function_name = 5804 frame_function_name =
5806 CompileFunction(&env, frame_function_name_source, "frame_function_name"); 5805 CompileFunction(&env, frame_function_name_source, "frame_function_name");
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5859 } 5858 }
5860 5859
5861 break_point_hit_count = 0; 5860 break_point_hit_count = 0;
5862 max_break_point_hit_count = kBreaksPerTest; 5861 max_break_point_hit_count = kBreaksPerTest;
5863 terminate_after_max_break_point_hit = true; 5862 terminate_after_max_break_point_hit = true;
5864 5863
5865 // Function with infinite loop. 5864 // Function with infinite loop.
5866 CompileRun(buffer.start()); 5865 CompileRun(buffer.start());
5867 5866
5868 // Set the debug break to enter the debugger as soon as possible. 5867 // Set the debug break to enter the debugger as soon as possible.
5869 v8::Debug::DebugBreak(CcTest::isolate()); 5868 v8::debug::DebugBreak(CcTest::isolate());
5870 5869
5871 // Call function with infinite loop. 5870 // Call function with infinite loop.
5872 CompileRun("f();"); 5871 CompileRun("f();");
5873 CHECK_EQ(kBreaksPerTest, break_point_hit_count); 5872 CHECK_EQ(kBreaksPerTest, break_point_hit_count);
5874 5873
5875 CHECK(!CcTest::isolate()->IsExecutionTerminating()); 5874 CHECK(!CcTest::isolate()->IsExecutionTerminating());
5876 } 5875 }
5877 } 5876 }
5878 } 5877 }
5879 5878
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
6108 CHECK_EQ(2, v8::internal::CountNativeContexts()); 6107 CHECK_EQ(2, v8::internal::CountNativeContexts());
6109 6108
6110 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); 6109 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
6111 } 6110 }
6112 6111
6113 6112
6114 TEST(LiveEditEnabled) { 6113 TEST(LiveEditEnabled) {
6115 v8::internal::FLAG_allow_natives_syntax = true; 6114 v8::internal::FLAG_allow_natives_syntax = true;
6116 LocalContext env; 6115 LocalContext env;
6117 v8::HandleScope scope(env->GetIsolate()); 6116 v8::HandleScope scope(env->GetIsolate());
6118 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), true); 6117 v8::debug::SetLiveEditEnabled(env->GetIsolate(), true);
6119 CompileRun("%LiveEditCompareStrings('', '')"); 6118 CompileRun("%LiveEditCompareStrings('', '')");
6120 } 6119 }
6121 6120
6122 6121
6123 TEST(LiveEditDisabled) { 6122 TEST(LiveEditDisabled) {
6124 v8::internal::FLAG_allow_natives_syntax = true; 6123 v8::internal::FLAG_allow_natives_syntax = true;
6125 LocalContext env; 6124 LocalContext env;
6126 v8::HandleScope scope(env->GetIsolate()); 6125 v8::HandleScope scope(env->GetIsolate());
6127 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), false); 6126 v8::debug::SetLiveEditEnabled(env->GetIsolate(), false);
6128 CompileRun("%LiveEditCompareStrings('', '')"); 6127 CompileRun("%LiveEditCompareStrings('', '')");
6129 } 6128 }
6130 6129
6131 6130
6132 TEST(PrecompiledFunction) { 6131 TEST(PrecompiledFunction) {
6133 // Regression test for crbug.com/346207. If we have preparse data, parsing the 6132 // Regression test for crbug.com/346207. If we have preparse data, parsing the
6134 // function in the presence of the debugger (and breakpoints) should still 6133 // function in the presence of the debugger (and breakpoints) should still
6135 // succeed. The bug was that preparsing was done lazily and parsing was done 6134 // succeed. The bug was that preparsing was done lazily and parsing was done
6136 // eagerly, so, the symbol streams didn't match. 6135 // eagerly, so, the symbol streams didn't match.
6137 DebugLocalContext env; 6136 DebugLocalContext env;
(...skipping 26 matching lines...) Expand all
6164 } 6163 }
6165 6164
6166 6165
6167 static void DebugBreakStackTraceListener( 6166 static void DebugBreakStackTraceListener(
6168 const v8::Debug::EventDetails& event_details) { 6167 const v8::Debug::EventDetails& event_details) {
6169 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10); 6168 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10);
6170 } 6169 }
6171 6170
6172 6171
6173 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { 6172 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) {
6174 v8::Debug::DebugBreak(args.GetIsolate()); 6173 v8::debug::DebugBreak(args.GetIsolate());
6175 } 6174 }
6176 6175
6177 6176
6178 TEST(DebugBreakStackTrace) { 6177 TEST(DebugBreakStackTrace) {
6179 DebugLocalContext env; 6178 DebugLocalContext env;
6180 v8::HandleScope scope(env->GetIsolate()); 6179 v8::HandleScope scope(env->GetIsolate());
6181 v8::Debug::SetDebugEventListener(env->GetIsolate(), 6180 v8::Debug::SetDebugEventListener(env->GetIsolate(),
6182 DebugBreakStackTraceListener); 6181 DebugBreakStackTraceListener);
6183 v8::Local<v8::Context> context = env.context(); 6182 v8::Local<v8::Context> context = env.context();
6184 v8::Local<v8::FunctionTemplate> add_debug_break_template = 6183 v8::Local<v8::FunctionTemplate> add_debug_break_template =
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
6231 6230
6232 6231
6233 TEST(DebugBreakOffThreadTerminate) { 6232 TEST(DebugBreakOffThreadTerminate) {
6234 DebugLocalContext env; 6233 DebugLocalContext env;
6235 v8::Isolate* isolate = env->GetIsolate(); 6234 v8::Isolate* isolate = env->GetIsolate();
6236 v8::HandleScope scope(isolate); 6235 v8::HandleScope scope(isolate);
6237 v8::Debug::SetDebugEventListener(isolate, DebugBreakTriggerTerminate); 6236 v8::Debug::SetDebugEventListener(isolate, DebugBreakTriggerTerminate);
6238 TerminationThread terminator(isolate); 6237 TerminationThread terminator(isolate);
6239 terminator.Start(); 6238 terminator.Start();
6240 v8::TryCatch try_catch(env->GetIsolate()); 6239 v8::TryCatch try_catch(env->GetIsolate());
6241 v8::Debug::DebugBreak(isolate); 6240 v8::debug::DebugBreak(isolate);
6242 CompileRun("while (true);"); 6241 CompileRun("while (true);");
6243 CHECK(try_catch.HasTerminated()); 6242 CHECK(try_catch.HasTerminated());
6244 } 6243 }
6245 6244
6246 6245
6247 static void DebugEventExpectNoException( 6246 static void DebugEventExpectNoException(
6248 const v8::Debug::EventDetails& event_details) { 6247 const v8::Debug::EventDetails& event_details) {
6249 v8::DebugEvent event = event_details.GetEvent(); 6248 v8::DebugEvent event = event_details.GetEvent();
6250 CHECK_NE(v8::Exception, event); 6249 CHECK_NE(v8::Exception, event);
6251 } 6250 }
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
6452 6451
6453 TEST(DisableTailCallElimination) { 6452 TEST(DisableTailCallElimination) {
6454 i::FLAG_allow_natives_syntax = true; 6453 i::FLAG_allow_natives_syntax = true;
6455 i::FLAG_harmony_tailcalls = true; 6454 i::FLAG_harmony_tailcalls = true;
6456 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes 6455 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes
6457 // stack[2].getFunctionName() return null. 6456 // stack[2].getFunctionName() return null.
6458 i::FLAG_turbo_inlining = false; 6457 i::FLAG_turbo_inlining = false;
6459 6458
6460 DebugLocalContext env; 6459 DebugLocalContext env;
6461 v8::Isolate* isolate = env->GetIsolate(); 6460 v8::Isolate* isolate = env->GetIsolate();
6461 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6462 v8::HandleScope scope(isolate); 6462 v8::HandleScope scope(isolate);
6463 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); 6463 CHECK(i_isolate->is_tail_call_elimination_enabled());
6464 6464
6465 CompileRun( 6465 CompileRun(
6466 "'use strict'; \n" 6466 "'use strict'; \n"
6467 "Error.prepareStackTrace = (error,stack) => { \n" 6467 "Error.prepareStackTrace = (error,stack) => { \n"
6468 " error.strace = stack; \n" 6468 " error.strace = stack; \n"
6469 " return error.message + \"\\n at \" + stack.join(\"\\n at \"); \n" 6469 " return error.message + \"\\n at \" + stack.join(\"\\n at \"); \n"
6470 "} \n" 6470 "} \n"
6471 " \n" 6471 " \n"
6472 "function getCaller() { \n" 6472 "function getCaller() { \n"
6473 " var e = new Error(); \n" 6473 " var e = new Error(); \n"
(...skipping 16 matching lines...) Expand all
6490 "function h() { \n" 6490 "function h() { \n"
6491 " var result = g(); \n" 6491 " var result = g(); \n"
6492 " return result; \n" 6492 " return result; \n"
6493 "} \n" 6493 "} \n"
6494 "%NeverOptimizeFunction(getCaller); \n" 6494 "%NeverOptimizeFunction(getCaller); \n"
6495 "%NeverOptimizeFunction(f); \n" 6495 "%NeverOptimizeFunction(f); \n"
6496 "%NeverOptimizeFunction(h); \n" 6496 "%NeverOptimizeFunction(h); \n"
6497 ""); 6497 "");
6498 ExpectInt32("h();", 2); 6498 ExpectInt32("h();", 2);
6499 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); 6499 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2);
6500 v8::Debug::SetTailCallEliminationEnabled(isolate, false); 6500 i_isolate->SetTailCallEliminationEnabled(false);
6501 CHECK(!v8::Debug::IsTailCallEliminationEnabled(isolate)); 6501 CHECK(!i_isolate->is_tail_call_elimination_enabled());
6502 ExpectInt32("h();", 1); 6502 ExpectInt32("h();", 1);
6503 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 1); 6503 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 1);
6504 v8::Debug::SetTailCallEliminationEnabled(isolate, true); 6504 i_isolate->SetTailCallEliminationEnabled(true);
6505 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); 6505 CHECK(i_isolate->is_tail_call_elimination_enabled());
6506 ExpectInt32("h();", 2); 6506 ExpectInt32("h();", 2);
6507 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); 6507 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2);
6508 } 6508 }
6509 6509
6510 TEST(DebugStepNextTailCallEliminiation) { 6510 TEST(DebugStepNextTailCallEliminiation) {
6511 i::FLAG_allow_natives_syntax = true; 6511 i::FLAG_allow_natives_syntax = true;
6512 i::FLAG_harmony_tailcalls = true; 6512 i::FLAG_harmony_tailcalls = true;
6513 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes 6513 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes
6514 // stack[2].getFunctionName() return null. 6514 // stack[2].getFunctionName() return null.
6515 i::FLAG_turbo_inlining = false; 6515 i::FLAG_turbo_inlining = false;
6516 6516
6517 DebugLocalContext env; 6517 DebugLocalContext env;
6518 env.ExposeDebug(); 6518 env.ExposeDebug();
6519 v8::Isolate* isolate = env->GetIsolate(); 6519 v8::Isolate* isolate = env->GetIsolate();
6520 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6520 v8::HandleScope scope(isolate); 6521 v8::HandleScope scope(isolate);
6521 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); 6522 CHECK(i_isolate->is_tail_call_elimination_enabled());
6522 6523
6523 const char* source = 6524 const char* source =
6524 "'use strict'; \n" 6525 "'use strict'; \n"
6525 "var Debug = debug.Debug; \n" 6526 "var Debug = debug.Debug; \n"
6526 "var exception = null; \n" 6527 "var exception = null; \n"
6527 "var breaks = 0; \n" 6528 "var breaks = 0; \n"
6528 "var log = []; \n" 6529 "var log = []; \n"
6529 "function f(x) { \n" 6530 "function f(x) { \n"
6530 " if (x == 2) { \n" 6531 " if (x == 2) { \n"
6531 " debugger; // Break a \n" 6532 " debugger; // Break a \n"
(...skipping 15 matching lines...) Expand all
6547 " }; \n" 6548 " }; \n"
6548 "}; \n" 6549 "}; \n"
6549 "Debug.setListener(listener); \n" 6550 "Debug.setListener(listener); \n"
6550 "f(4); \n" 6551 "f(4); \n"
6551 "Debug.setListener(null); // Break d \n"; 6552 "Debug.setListener(null); // Break d \n";
6552 6553
6553 CompileRun(source); 6554 CompileRun(source);
6554 ExpectNull("exception"); 6555 ExpectNull("exception");
6555 ExpectString("JSON.stringify(log)", "[\"a4\",\"b2\",\"c4\",\"c11\",\"d0\"]"); 6556 ExpectString("JSON.stringify(log)", "[\"a4\",\"b2\",\"c4\",\"c11\",\"d0\"]");
6556 6557
6557 v8::Debug::SetTailCallEliminationEnabled(isolate, false); 6558 i_isolate->SetTailCallEliminationEnabled(false);
6558 CompileRun( 6559 CompileRun(
6559 "log = []; \n" 6560 "log = []; \n"
6560 "Debug.setListener(listener); \n" 6561 "Debug.setListener(listener); \n"
6561 "f(5); \n" 6562 "f(5); \n"
6562 "Debug.setListener(null); // Break f \n"); 6563 "Debug.setListener(null); // Break f \n");
6563 ExpectNull("exception"); 6564 ExpectNull("exception");
6564 ExpectString("JSON.stringify(log)", 6565 ExpectString("JSON.stringify(log)",
6565 "[\"a4\",\"b2\",\"c4\",\"e0\",\"e0\",\"e0\",\"e0\",\"f0\"]"); 6566 "[\"a4\",\"b2\",\"c4\",\"e0\",\"e0\",\"e0\",\"e0\",\"f0\"]");
6566 } 6567 }
6567 6568
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
6656 CHECK_EQ(4, function_data.End().GetColumnNumber()); 6657 CHECK_EQ(4, function_data.End().GetColumnNumber());
6657 CHECK_EQ(1, function_data.Count()); 6658 CHECK_EQ(1, function_data.Count());
6658 6659
6659 function_data = script_data.GetFunctionData(1); 6660 function_data = script_data.GetFunctionData(1);
6660 CHECK_EQ(0, function_data.Start().GetLineNumber()); 6661 CHECK_EQ(0, function_data.Start().GetLineNumber());
6661 CHECK_EQ(0, function_data.Start().GetColumnNumber()); 6662 CHECK_EQ(0, function_data.Start().GetColumnNumber());
6662 CHECK_EQ(1, function_data.End().GetLineNumber()); 6663 CHECK_EQ(1, function_data.End().GetLineNumber());
6663 CHECK_EQ(1, function_data.End().GetColumnNumber()); 6664 CHECK_EQ(1, function_data.End().GetColumnNumber());
6664 CHECK_EQ(2, function_data.Count()); 6665 CHECK_EQ(2, function_data.Count());
6665 } 6666 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698