OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
2008 v8::Local<v8::Context> context = env.context(); | 2007 v8::Local<v8::Context> context = env.context(); |
2009 v8::Local<v8::Function> foo = | 2008 v8::Local<v8::Function> foo = |
2010 CompileFunction(&env, "function foo(){a=1;}", "foo"); | 2009 CompileFunction(&env, "function foo(){a=1;}", "foo"); |
2011 | 2010 |
2012 // Register the debug event listener pasing the function | 2011 // Register the debug event listener pasing the function |
2013 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 2012 SetDebugEventListener(env->GetIsolate(), DebugEventRemoveBreakPoint, foo); |
2014 DebugEventRemoveBreakPoint, foo); | |
2015 | 2013 |
2016 debug_event_remove_break_point = SetBreakPoint(foo, 0); | 2014 debug_event_remove_break_point = SetBreakPoint(foo, 0); |
2017 | 2015 |
2018 break_point_hit_count = 0; | 2016 break_point_hit_count = 0; |
2019 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2017 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2020 CHECK_EQ(1, break_point_hit_count); | 2018 CHECK_EQ(1, break_point_hit_count); |
2021 | 2019 |
2022 break_point_hit_count = 0; | 2020 break_point_hit_count = 0; |
2023 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2021 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2024 CHECK_EQ(0, break_point_hit_count); | 2022 CHECK_EQ(0, break_point_hit_count); |
2025 | 2023 |
2026 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2024 SetDebugEventListener(env->GetIsolate(), nullptr); |
2027 CheckDebuggerUnloaded(env->GetIsolate()); | 2025 CheckDebuggerUnloaded(env->GetIsolate()); |
2028 } | 2026 } |
2029 | 2027 |
2030 | 2028 |
2031 // Test that the debugger statement causes a break. | 2029 // Test that the debugger statement causes a break. |
2032 TEST(DebuggerStatement) { | 2030 TEST(DebuggerStatement) { |
2033 break_point_hit_count = 0; | 2031 break_point_hit_count = 0; |
2034 DebugLocalContext env; | 2032 DebugLocalContext env; |
2035 v8::HandleScope scope(env->GetIsolate()); | 2033 v8::HandleScope scope(env->GetIsolate()); |
2036 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 2034 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
2037 DebugEventBreakPointHitCount); | |
2038 v8::Local<v8::Context> context = env.context(); | 2035 v8::Local<v8::Context> context = env.context(); |
2039 v8::Script::Compile(context, | 2036 v8::Script::Compile(context, |
2040 v8_str(env->GetIsolate(), "function bar(){debugger}")) | 2037 v8_str(env->GetIsolate(), "function bar(){debugger}")) |
2041 .ToLocalChecked() | 2038 .ToLocalChecked() |
2042 ->Run(context) | 2039 ->Run(context) |
2043 .ToLocalChecked(); | 2040 .ToLocalChecked(); |
2044 v8::Script::Compile( | 2041 v8::Script::Compile( |
2045 context, v8_str(env->GetIsolate(), "function foo(){debugger;debugger;}")) | 2042 context, v8_str(env->GetIsolate(), "function foo(){debugger;debugger;}")) |
2046 .ToLocalChecked() | 2043 .ToLocalChecked() |
2047 ->Run(context) | 2044 ->Run(context) |
2048 .ToLocalChecked(); | 2045 .ToLocalChecked(); |
2049 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 2046 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( |
2050 env->Global() | 2047 env->Global() |
2051 ->Get(context, v8_str(env->GetIsolate(), "foo")) | 2048 ->Get(context, v8_str(env->GetIsolate(), "foo")) |
2052 .ToLocalChecked()); | 2049 .ToLocalChecked()); |
2053 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( | 2050 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( |
2054 env->Global() | 2051 env->Global() |
2055 ->Get(context, v8_str(env->GetIsolate(), "bar")) | 2052 ->Get(context, v8_str(env->GetIsolate(), "bar")) |
2056 .ToLocalChecked()); | 2053 .ToLocalChecked()); |
2057 | 2054 |
2058 // Run function with debugger statement | 2055 // Run function with debugger statement |
2059 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2056 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2060 CHECK_EQ(1, break_point_hit_count); | 2057 CHECK_EQ(1, break_point_hit_count); |
2061 | 2058 |
2062 // Run function with two debugger statement | 2059 // Run function with two debugger statement |
2063 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2060 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2064 CHECK_EQ(3, break_point_hit_count); | 2061 CHECK_EQ(3, break_point_hit_count); |
2065 | 2062 |
2066 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2063 SetDebugEventListener(env->GetIsolate(), nullptr); |
2067 CheckDebuggerUnloaded(env->GetIsolate()); | 2064 CheckDebuggerUnloaded(env->GetIsolate()); |
2068 } | 2065 } |
2069 | 2066 |
2070 | 2067 |
2071 // Test setting a breakpoint on the debugger statement. | 2068 // Test setting a breakpoint on the debugger statement. |
2072 TEST(DebuggerStatementBreakpoint) { | 2069 TEST(DebuggerStatementBreakpoint) { |
2073 break_point_hit_count = 0; | 2070 break_point_hit_count = 0; |
2074 DebugLocalContext env; | 2071 DebugLocalContext env; |
2075 v8::HandleScope scope(env->GetIsolate()); | 2072 v8::HandleScope scope(env->GetIsolate()); |
2076 v8::Local<v8::Context> context = env.context(); | 2073 v8::Local<v8::Context> context = env.context(); |
2077 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 2074 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
2078 DebugEventBreakPointHitCount); | |
2079 v8::Script::Compile(context, | 2075 v8::Script::Compile(context, |
2080 v8_str(env->GetIsolate(), "function foo(){debugger;}")) | 2076 v8_str(env->GetIsolate(), "function foo(){debugger;}")) |
2081 .ToLocalChecked() | 2077 .ToLocalChecked() |
2082 ->Run(context) | 2078 ->Run(context) |
2083 .ToLocalChecked(); | 2079 .ToLocalChecked(); |
2084 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 2080 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( |
2085 env->Global() | 2081 env->Global() |
2086 ->Get(context, v8_str(env->GetIsolate(), "foo")) | 2082 ->Get(context, v8_str(env->GetIsolate(), "foo")) |
2087 .ToLocalChecked()); | 2083 .ToLocalChecked()); |
2088 | 2084 |
2089 // The debugger statement triggers breakpoint hit | 2085 // The debugger statement triggers breakpoint hit |
2090 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2086 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2091 CHECK_EQ(1, break_point_hit_count); | 2087 CHECK_EQ(1, break_point_hit_count); |
2092 | 2088 |
2093 int bp = SetBreakPoint(foo, 0); | 2089 int bp = SetBreakPoint(foo, 0); |
2094 | 2090 |
2095 // Set breakpoint does not duplicate hits | 2091 // Set breakpoint does not duplicate hits |
2096 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2092 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2097 CHECK_EQ(2, break_point_hit_count); | 2093 CHECK_EQ(2, break_point_hit_count); |
2098 | 2094 |
2099 ClearBreakPoint(bp); | 2095 ClearBreakPoint(bp); |
2100 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2096 SetDebugEventListener(env->GetIsolate(), nullptr); |
2101 CheckDebuggerUnloaded(env->GetIsolate()); | 2097 CheckDebuggerUnloaded(env->GetIsolate()); |
2102 } | 2098 } |
2103 | 2099 |
2104 | 2100 |
2105 // Test that the evaluation of expressions when a break point is hit generates | 2101 // Test that the evaluation of expressions when a break point is hit generates |
2106 // the correct results. | 2102 // the correct results. |
2107 TEST(DebugEvaluate) { | 2103 TEST(DebugEvaluate) { |
2108 DebugLocalContext env; | 2104 DebugLocalContext env; |
2109 v8::Isolate* isolate = env->GetIsolate(); | 2105 v8::Isolate* isolate = env->GetIsolate(); |
2110 v8::HandleScope scope(isolate); | 2106 v8::HandleScope scope(isolate); |
2111 env.ExposeDebug(); | 2107 env.ExposeDebug(); |
2112 | 2108 |
2113 // Create a function for checking the evaluation when hitting a break point. | 2109 // Create a function for checking the evaluation when hitting a break point. |
2114 evaluate_check_function = CompileFunction(&env, | 2110 evaluate_check_function = CompileFunction(&env, |
2115 evaluate_check_source, | 2111 evaluate_check_source, |
2116 "evaluate_check"); | 2112 "evaluate_check"); |
2117 // Register the debug event listener | 2113 // Register the debug event listener |
2118 v8::Debug::SetDebugEventListener(isolate, DebugEventEvaluate); | 2114 SetDebugEventListener(isolate, DebugEventEvaluate); |
2119 | 2115 |
2120 // Different expected vaules of x and a when in a break point (u = undefined, | 2116 // Different expected vaules of x and a when in a break point (u = undefined, |
2121 // d = Hello, world!). | 2117 // d = Hello, world!). |
2122 struct EvaluateCheck checks_uu[] = {{"x", v8::Undefined(isolate)}, | 2118 struct EvaluateCheck checks_uu[] = {{"x", v8::Undefined(isolate)}, |
2123 {"a", v8::Undefined(isolate)}, | 2119 {"a", v8::Undefined(isolate)}, |
2124 {NULL, v8::Local<v8::Value>()}}; | 2120 {NULL, v8::Local<v8::Value>()}}; |
2125 struct EvaluateCheck checks_hu[] = { | 2121 struct EvaluateCheck checks_hu[] = { |
2126 {"x", v8_str(env->GetIsolate(), "Hello, world!")}, | 2122 {"x", v8_str(env->GetIsolate(), "Hello, world!")}, |
2127 {"a", v8::Undefined(isolate)}, | 2123 {"a", v8::Undefined(isolate)}, |
2128 {NULL, v8::Local<v8::Value>()}}; | 2124 {NULL, v8::Local<v8::Value>()}}; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 bar->Call(context, env->Global(), 2, argv_bar_2).ToLocalChecked(); | 2226 bar->Call(context, env->Global(), 2, argv_bar_2).ToLocalChecked(); |
2231 | 2227 |
2232 // Call bar setting breakpoint after a=x in barbar and parameter | 2228 // Call bar setting breakpoint after a=x in barbar and parameter |
2233 // "Hello, world!". | 2229 // "Hello, world!". |
2234 checks = checks_hh; | 2230 checks = checks_hh; |
2235 v8::Local<v8::Value> argv_bar_3[2] = { | 2231 v8::Local<v8::Value> argv_bar_3[2] = { |
2236 v8_str(env->GetIsolate(), "Hello, world!"), | 2232 v8_str(env->GetIsolate(), "Hello, world!"), |
2237 v8::Number::New(env->GetIsolate(), barbar_break_position + 1)}; | 2233 v8::Number::New(env->GetIsolate(), barbar_break_position + 1)}; |
2238 bar->Call(context, env->Global(), 2, argv_bar_3).ToLocalChecked(); | 2234 bar->Call(context, env->Global(), 2, argv_bar_3).ToLocalChecked(); |
2239 | 2235 |
2240 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2236 SetDebugEventListener(isolate, nullptr); |
2241 CheckDebuggerUnloaded(isolate); | 2237 CheckDebuggerUnloaded(isolate); |
2242 } | 2238 } |
2243 | 2239 |
2244 | 2240 |
2245 int debugEventCount = 0; | 2241 int debugEventCount = 0; |
2246 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { | 2242 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { |
2247 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; | 2243 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; |
2248 } | 2244 } |
2249 | 2245 |
2250 | 2246 |
2251 // Test that the conditional breakpoints work event if code generation from | 2247 // Test that the conditional breakpoints work event if code generation from |
2252 // strings is prohibited in the debugee context. | 2248 // strings is prohibited in the debugee context. |
2253 TEST(ConditionalBreakpointWithCodeGenerationDisallowed) { | 2249 TEST(ConditionalBreakpointWithCodeGenerationDisallowed) { |
2254 DebugLocalContext env; | 2250 DebugLocalContext env; |
2255 v8::HandleScope scope(env->GetIsolate()); | 2251 v8::HandleScope scope(env->GetIsolate()); |
2256 env.ExposeDebug(); | 2252 env.ExposeDebug(); |
2257 | 2253 |
2258 v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEvent); | 2254 SetDebugEventListener(env->GetIsolate(), CheckDebugEvent); |
2259 | 2255 |
2260 v8::Local<v8::Context> context = env.context(); | 2256 v8::Local<v8::Context> context = env.context(); |
2261 v8::Local<v8::Function> foo = CompileFunction(&env, | 2257 v8::Local<v8::Function> foo = CompileFunction(&env, |
2262 "function foo(x) {\n" | 2258 "function foo(x) {\n" |
2263 " var s = 'String value2';\n" | 2259 " var s = 'String value2';\n" |
2264 " return s + x;\n" | 2260 " return s + x;\n" |
2265 "}", | 2261 "}", |
2266 "foo"); | 2262 "foo"); |
2267 | 2263 |
2268 // Set conditional breakpoint with condition 'true'. | 2264 // Set conditional breakpoint with condition 'true'. |
2269 CompileRun("debug.Debug.setBreakPoint(foo, 2, 0, 'true')"); | 2265 CompileRun("debug.Debug.setBreakPoint(foo, 2, 0, 'true')"); |
2270 | 2266 |
2271 debugEventCount = 0; | 2267 debugEventCount = 0; |
2272 env->AllowCodeGenerationFromStrings(false); | 2268 env->AllowCodeGenerationFromStrings(false); |
2273 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2269 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2274 CHECK_EQ(1, debugEventCount); | 2270 CHECK_EQ(1, debugEventCount); |
2275 | 2271 |
2276 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2272 SetDebugEventListener(env->GetIsolate(), nullptr); |
2277 CheckDebuggerUnloaded(env->GetIsolate()); | 2273 CheckDebuggerUnloaded(env->GetIsolate()); |
2278 } | 2274 } |
2279 | 2275 |
2280 | 2276 |
2281 bool checkedDebugEvals = true; | 2277 bool checkedDebugEvals = true; |
2282 v8::Local<v8::Function> checkGlobalEvalFunction; | 2278 v8::Local<v8::Function> checkGlobalEvalFunction; |
2283 v8::Local<v8::Function> checkFrameEvalFunction; | 2279 v8::Local<v8::Function> checkFrameEvalFunction; |
2284 static void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) { | 2280 static void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) { |
2285 if (eventDetails.GetEvent() == v8::Break) { | 2281 if (eventDetails.GetEvent() == v8::Break) { |
2286 ++debugEventCount; | 2282 ++debugEventCount; |
(...skipping 16 matching lines...) Expand all Loading... |
2303 | 2299 |
2304 | 2300 |
2305 // Test that the evaluation of expressions when a break point is hit generates | 2301 // Test that the evaluation of expressions when a break point is hit generates |
2306 // the correct results in case code generation from strings is disallowed in the | 2302 // the correct results in case code generation from strings is disallowed in the |
2307 // debugee context. | 2303 // debugee context. |
2308 TEST(DebugEvaluateWithCodeGenerationDisallowed) { | 2304 TEST(DebugEvaluateWithCodeGenerationDisallowed) { |
2309 DebugLocalContext env; | 2305 DebugLocalContext env; |
2310 v8::HandleScope scope(env->GetIsolate()); | 2306 v8::HandleScope scope(env->GetIsolate()); |
2311 env.ExposeDebug(); | 2307 env.ExposeDebug(); |
2312 | 2308 |
2313 v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEval); | 2309 SetDebugEventListener(env->GetIsolate(), CheckDebugEval); |
2314 | 2310 |
2315 v8::Local<v8::Context> context = env.context(); | 2311 v8::Local<v8::Context> context = env.context(); |
2316 v8::Local<v8::Function> foo = CompileFunction(&env, | 2312 v8::Local<v8::Function> foo = CompileFunction(&env, |
2317 "var global = 'Global';\n" | 2313 "var global = 'Global';\n" |
2318 "function foo(x) {\n" | 2314 "function foo(x) {\n" |
2319 " var local = 'Local';\n" | 2315 " var local = 'Local';\n" |
2320 " debugger;\n" | 2316 " debugger;\n" |
2321 " return local + x;\n" | 2317 " return local + x;\n" |
2322 "}", | 2318 "}", |
2323 "foo"); | 2319 "foo"); |
2324 checkGlobalEvalFunction = CompileFunction(&env, | 2320 checkGlobalEvalFunction = CompileFunction(&env, |
2325 "function checkGlobalEval(exec_state) {\n" | 2321 "function checkGlobalEval(exec_state) {\n" |
2326 " return exec_state.evaluateGlobal('global').value() === 'Global';\n" | 2322 " return exec_state.evaluateGlobal('global').value() === 'Global';\n" |
2327 "}", | 2323 "}", |
2328 "checkGlobalEval"); | 2324 "checkGlobalEval"); |
2329 | 2325 |
2330 checkFrameEvalFunction = CompileFunction(&env, | 2326 checkFrameEvalFunction = CompileFunction(&env, |
2331 "function checkFrameEval(exec_state) {\n" | 2327 "function checkFrameEval(exec_state) {\n" |
2332 " return exec_state.frame(0).evaluate('local').value() === 'Local';\n" | 2328 " return exec_state.frame(0).evaluate('local').value() === 'Local';\n" |
2333 "}", | 2329 "}", |
2334 "checkFrameEval"); | 2330 "checkFrameEval"); |
2335 debugEventCount = 0; | 2331 debugEventCount = 0; |
2336 env->AllowCodeGenerationFromStrings(false); | 2332 env->AllowCodeGenerationFromStrings(false); |
2337 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2333 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2338 CHECK_EQ(1, debugEventCount); | 2334 CHECK_EQ(1, debugEventCount); |
2339 | 2335 |
2340 checkGlobalEvalFunction.Clear(); | 2336 checkGlobalEvalFunction.Clear(); |
2341 checkFrameEvalFunction.Clear(); | 2337 checkFrameEvalFunction.Clear(); |
2342 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2338 SetDebugEventListener(env->GetIsolate(), nullptr); |
2343 CheckDebuggerUnloaded(env->GetIsolate()); | 2339 CheckDebuggerUnloaded(env->GetIsolate()); |
2344 } | 2340 } |
2345 | 2341 |
2346 | 2342 |
2347 // Simple test of the stepping mechanism using only store ICs. | 2343 // Simple test of the stepping mechanism using only store ICs. |
2348 TEST(DebugStepLinear) { | 2344 TEST(DebugStepLinear) { |
2349 DebugLocalContext env; | 2345 DebugLocalContext env; |
2350 v8::HandleScope scope(env->GetIsolate()); | 2346 v8::HandleScope scope(env->GetIsolate()); |
2351 | 2347 |
2352 // Create a function for testing stepping. | 2348 // Create a function for testing stepping. |
2353 v8::Local<v8::Function> foo = CompileFunction(&env, | 2349 v8::Local<v8::Function> foo = CompileFunction(&env, |
2354 "function foo(){a=1;b=1;c=1;}", | 2350 "function foo(){a=1;b=1;c=1;}", |
2355 "foo"); | 2351 "foo"); |
2356 | 2352 |
2357 // Run foo to allow it to get optimized. | 2353 // Run foo to allow it to get optimized. |
2358 CompileRun("a=0; b=0; c=0; foo();"); | 2354 CompileRun("a=0; b=0; c=0; foo();"); |
2359 | 2355 |
2360 // Register a debug event listener which steps and counts. | 2356 // Register a debug event listener which steps and counts. |
2361 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2357 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2362 | 2358 |
2363 SetBreakPoint(foo, 3); | 2359 SetBreakPoint(foo, 3); |
2364 | 2360 |
2365 step_action = StepIn; | 2361 step_action = StepIn; |
2366 break_point_hit_count = 0; | 2362 break_point_hit_count = 0; |
2367 v8::Local<v8::Context> context = env.context(); | 2363 v8::Local<v8::Context> context = env.context(); |
2368 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2364 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2369 | 2365 |
2370 // With stepping all break locations are hit. | 2366 // With stepping all break locations are hit. |
2371 CHECK_EQ(4, break_point_hit_count); | 2367 CHECK_EQ(4, break_point_hit_count); |
2372 | 2368 |
2373 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2369 SetDebugEventListener(env->GetIsolate(), nullptr); |
2374 CheckDebuggerUnloaded(env->GetIsolate()); | 2370 CheckDebuggerUnloaded(env->GetIsolate()); |
2375 | 2371 |
2376 // Register a debug event listener which just counts. | 2372 // Register a debug event listener which just counts. |
2377 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 2373 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
2378 DebugEventBreakPointHitCount); | |
2379 | 2374 |
2380 SetBreakPoint(foo, 3); | 2375 SetBreakPoint(foo, 3); |
2381 break_point_hit_count = 0; | 2376 break_point_hit_count = 0; |
2382 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2377 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2383 | 2378 |
2384 // Without stepping only active break points are hit. | 2379 // Without stepping only active break points are hit. |
2385 CHECK_EQ(1, break_point_hit_count); | 2380 CHECK_EQ(1, break_point_hit_count); |
2386 | 2381 |
2387 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2382 SetDebugEventListener(env->GetIsolate(), nullptr); |
2388 CheckDebuggerUnloaded(env->GetIsolate()); | 2383 CheckDebuggerUnloaded(env->GetIsolate()); |
2389 } | 2384 } |
2390 | 2385 |
2391 | 2386 |
2392 // Test of the stepping mechanism for keyed load in a loop. | 2387 // Test of the stepping mechanism for keyed load in a loop. |
2393 TEST(DebugStepKeyedLoadLoop) { | 2388 TEST(DebugStepKeyedLoadLoop) { |
2394 DebugLocalContext env; | 2389 DebugLocalContext env; |
2395 v8::HandleScope scope(env->GetIsolate()); | 2390 v8::HandleScope scope(env->GetIsolate()); |
2396 | 2391 |
2397 // Register a debug event listener which steps and counts. | 2392 // Register a debug event listener which steps and counts. |
2398 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2393 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2399 | 2394 |
2400 // Create a function for testing stepping of keyed load. The statement 'y=1' | 2395 // Create a function for testing stepping of keyed load. The statement 'y=1' |
2401 // is there to have more than one breakable statement in the loop, TODO(315). | 2396 // is there to have more than one breakable statement in the loop, TODO(315). |
2402 v8::Local<v8::Function> foo = CompileFunction( | 2397 v8::Local<v8::Function> foo = CompileFunction( |
2403 &env, | 2398 &env, |
2404 "function foo(a) {\n" | 2399 "function foo(a) {\n" |
2405 " var x;\n" | 2400 " var x;\n" |
2406 " var len = a.length;\n" | 2401 " var len = a.length;\n" |
2407 " for (var i = 0; i < len; i++) {\n" | 2402 " for (var i = 0; i < len; i++) {\n" |
2408 " y = 1;\n" | 2403 " y = 1;\n" |
(...skipping 19 matching lines...) Expand all Loading... |
2428 | 2423 |
2429 // Set up break point and step through the function. | 2424 // Set up break point and step through the function. |
2430 SetBreakPoint(foo, 3); | 2425 SetBreakPoint(foo, 3); |
2431 step_action = StepNext; | 2426 step_action = StepNext; |
2432 break_point_hit_count = 0; | 2427 break_point_hit_count = 0; |
2433 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); | 2428 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); |
2434 | 2429 |
2435 // With stepping all break locations are hit. | 2430 // With stepping all break locations are hit. |
2436 CHECK_EQ(44, break_point_hit_count); | 2431 CHECK_EQ(44, break_point_hit_count); |
2437 | 2432 |
2438 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2433 SetDebugEventListener(env->GetIsolate(), nullptr); |
2439 CheckDebuggerUnloaded(env->GetIsolate()); | 2434 CheckDebuggerUnloaded(env->GetIsolate()); |
2440 } | 2435 } |
2441 | 2436 |
2442 | 2437 |
2443 // Test of the stepping mechanism for keyed store in a loop. | 2438 // Test of the stepping mechanism for keyed store in a loop. |
2444 TEST(DebugStepKeyedStoreLoop) { | 2439 TEST(DebugStepKeyedStoreLoop) { |
2445 DebugLocalContext env; | 2440 DebugLocalContext env; |
2446 v8::HandleScope scope(env->GetIsolate()); | 2441 v8::HandleScope scope(env->GetIsolate()); |
2447 | 2442 |
2448 // Register a debug event listener which steps and counts. | 2443 // Register a debug event listener which steps and counts. |
2449 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2444 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2450 | 2445 |
2451 // Create a function for testing stepping of keyed store. The statement 'y=1' | 2446 // Create a function for testing stepping of keyed store. The statement 'y=1' |
2452 // is there to have more than one breakable statement in the loop, TODO(315). | 2447 // is there to have more than one breakable statement in the loop, TODO(315). |
2453 v8::Local<v8::Function> foo = CompileFunction( | 2448 v8::Local<v8::Function> foo = CompileFunction( |
2454 &env, | 2449 &env, |
2455 "function foo(a) {\n" | 2450 "function foo(a) {\n" |
2456 " var len = a.length;\n" | 2451 " var len = a.length;\n" |
2457 " for (var i = 0; i < len; i++) {\n" | 2452 " for (var i = 0; i < len; i++) {\n" |
2458 " y = 1;\n" | 2453 " y = 1;\n" |
2459 " a[i] = 42;\n" | 2454 " a[i] = 42;\n" |
(...skipping 18 matching lines...) Expand all Loading... |
2478 | 2473 |
2479 // Set up break point and step through the function. | 2474 // Set up break point and step through the function. |
2480 SetBreakPoint(foo, 3); | 2475 SetBreakPoint(foo, 3); |
2481 step_action = StepNext; | 2476 step_action = StepNext; |
2482 break_point_hit_count = 0; | 2477 break_point_hit_count = 0; |
2483 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); | 2478 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); |
2484 | 2479 |
2485 // With stepping all break locations are hit. | 2480 // With stepping all break locations are hit. |
2486 CHECK_EQ(44, break_point_hit_count); | 2481 CHECK_EQ(44, break_point_hit_count); |
2487 | 2482 |
2488 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2483 SetDebugEventListener(env->GetIsolate(), nullptr); |
2489 CheckDebuggerUnloaded(env->GetIsolate()); | 2484 CheckDebuggerUnloaded(env->GetIsolate()); |
2490 } | 2485 } |
2491 | 2486 |
2492 | 2487 |
2493 // Test of the stepping mechanism for named load in a loop. | 2488 // Test of the stepping mechanism for named load in a loop. |
2494 TEST(DebugStepNamedLoadLoop) { | 2489 TEST(DebugStepNamedLoadLoop) { |
2495 DebugLocalContext env; | 2490 DebugLocalContext env; |
2496 v8::HandleScope scope(env->GetIsolate()); | 2491 v8::HandleScope scope(env->GetIsolate()); |
2497 | 2492 |
2498 // Register a debug event listener which steps and counts. | 2493 // Register a debug event listener which steps and counts. |
2499 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2494 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2500 | 2495 |
2501 v8::Local<v8::Context> context = env.context(); | 2496 v8::Local<v8::Context> context = env.context(); |
2502 // Create a function for testing stepping of named load. | 2497 // Create a function for testing stepping of named load. |
2503 v8::Local<v8::Function> foo = CompileFunction( | 2498 v8::Local<v8::Function> foo = CompileFunction( |
2504 &env, | 2499 &env, |
2505 "function foo() {\n" | 2500 "function foo() {\n" |
2506 " var a = [];\n" | 2501 " var a = [];\n" |
2507 " var s = \"\";\n" | 2502 " var s = \"\";\n" |
2508 " for (var i = 0; i < 10; i++) {\n" | 2503 " for (var i = 0; i < 10; i++) {\n" |
2509 " var v = new V(i, i + 1);\n" | 2504 " var v = new V(i, i + 1);\n" |
(...skipping 13 matching lines...) Expand all Loading... |
2523 | 2518 |
2524 // Set up break point and step through the function. | 2519 // Set up break point and step through the function. |
2525 SetBreakPoint(foo, 4); | 2520 SetBreakPoint(foo, 4); |
2526 step_action = StepNext; | 2521 step_action = StepNext; |
2527 break_point_hit_count = 0; | 2522 break_point_hit_count = 0; |
2528 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2523 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2529 | 2524 |
2530 // With stepping all break locations are hit. | 2525 // With stepping all break locations are hit. |
2531 CHECK_EQ(65, break_point_hit_count); | 2526 CHECK_EQ(65, break_point_hit_count); |
2532 | 2527 |
2533 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2528 SetDebugEventListener(env->GetIsolate(), nullptr); |
2534 CheckDebuggerUnloaded(env->GetIsolate()); | 2529 CheckDebuggerUnloaded(env->GetIsolate()); |
2535 } | 2530 } |
2536 | 2531 |
2537 | 2532 |
2538 static void DoDebugStepNamedStoreLoop(int expected) { | 2533 static void DoDebugStepNamedStoreLoop(int expected) { |
2539 DebugLocalContext env; | 2534 DebugLocalContext env; |
2540 v8::HandleScope scope(env->GetIsolate()); | 2535 v8::HandleScope scope(env->GetIsolate()); |
2541 | 2536 |
2542 // Register a debug event listener which steps and counts. | 2537 // Register a debug event listener which steps and counts. |
2543 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2538 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2544 | 2539 |
2545 // Create a function for testing stepping of named store. | 2540 // Create a function for testing stepping of named store. |
2546 v8::Local<v8::Context> context = env.context(); | 2541 v8::Local<v8::Context> context = env.context(); |
2547 v8::Local<v8::Function> foo = CompileFunction( | 2542 v8::Local<v8::Function> foo = CompileFunction( |
2548 &env, | 2543 &env, |
2549 "function foo() {\n" | 2544 "function foo() {\n" |
2550 " var a = {a:1};\n" | 2545 " var a = {a:1};\n" |
2551 " for (var i = 0; i < 10; i++) {\n" | 2546 " for (var i = 0; i < 10; i++) {\n" |
2552 " a.a = 2\n" | 2547 " a.a = 2\n" |
2553 " }\n" | 2548 " }\n" |
2554 "}\n", | 2549 "}\n", |
2555 "foo"); | 2550 "foo"); |
2556 | 2551 |
2557 // Call function without any break points to ensure inlining is in place. | 2552 // Call function without any break points to ensure inlining is in place. |
2558 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2553 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2559 | 2554 |
2560 // Set up break point and step through the function. | 2555 // Set up break point and step through the function. |
2561 SetBreakPoint(foo, 3); | 2556 SetBreakPoint(foo, 3); |
2562 step_action = StepNext; | 2557 step_action = StepNext; |
2563 break_point_hit_count = 0; | 2558 break_point_hit_count = 0; |
2564 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2559 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2565 | 2560 |
2566 // With stepping all expected break locations are hit. | 2561 // With stepping all expected break locations are hit. |
2567 CHECK_EQ(expected, break_point_hit_count); | 2562 CHECK_EQ(expected, break_point_hit_count); |
2568 | 2563 |
2569 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2564 SetDebugEventListener(env->GetIsolate(), nullptr); |
2570 CheckDebuggerUnloaded(env->GetIsolate()); | 2565 CheckDebuggerUnloaded(env->GetIsolate()); |
2571 } | 2566 } |
2572 | 2567 |
2573 | 2568 |
2574 // Test of the stepping mechanism for named load in a loop. | 2569 // Test of the stepping mechanism for named load in a loop. |
2575 TEST(DebugStepNamedStoreLoop) { DoDebugStepNamedStoreLoop(34); } | 2570 TEST(DebugStepNamedStoreLoop) { DoDebugStepNamedStoreLoop(34); } |
2576 | 2571 |
2577 // Test the stepping mechanism with different ICs. | 2572 // Test the stepping mechanism with different ICs. |
2578 TEST(DebugStepLinearMixedICs) { | 2573 TEST(DebugStepLinearMixedICs) { |
2579 DebugLocalContext env; | 2574 DebugLocalContext env; |
2580 v8::HandleScope scope(env->GetIsolate()); | 2575 v8::HandleScope scope(env->GetIsolate()); |
2581 | 2576 |
2582 // Register a debug event listener which steps and counts. | 2577 // Register a debug event listener which steps and counts. |
2583 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2578 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2584 | 2579 |
2585 v8::Local<v8::Context> context = env.context(); | 2580 v8::Local<v8::Context> context = env.context(); |
2586 // Create a function for testing stepping. | 2581 // Create a function for testing stepping. |
2587 v8::Local<v8::Function> foo = CompileFunction(&env, | 2582 v8::Local<v8::Function> foo = CompileFunction(&env, |
2588 "function bar() {};" | 2583 "function bar() {};" |
2589 "function foo() {" | 2584 "function foo() {" |
2590 " var x;" | 2585 " var x;" |
2591 " var index='name';" | 2586 " var index='name';" |
2592 " var y = {};" | 2587 " var y = {};" |
2593 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); | 2588 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); |
2594 | 2589 |
2595 // Run functions to allow them to get optimized. | 2590 // Run functions to allow them to get optimized. |
2596 CompileRun("a=0; b=0; bar(); foo();"); | 2591 CompileRun("a=0; b=0; bar(); foo();"); |
2597 | 2592 |
2598 SetBreakPoint(foo, 0); | 2593 SetBreakPoint(foo, 0); |
2599 | 2594 |
2600 step_action = StepIn; | 2595 step_action = StepIn; |
2601 break_point_hit_count = 0; | 2596 break_point_hit_count = 0; |
2602 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2597 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2603 | 2598 |
2604 // With stepping all break locations are hit. | 2599 // With stepping all break locations are hit. |
2605 CHECK_EQ(10, break_point_hit_count); | 2600 CHECK_EQ(10, break_point_hit_count); |
2606 | 2601 |
2607 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2602 SetDebugEventListener(env->GetIsolate(), nullptr); |
2608 CheckDebuggerUnloaded(env->GetIsolate()); | 2603 CheckDebuggerUnloaded(env->GetIsolate()); |
2609 | 2604 |
2610 // Register a debug event listener which just counts. | 2605 // Register a debug event listener which just counts. |
2611 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 2606 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
2612 DebugEventBreakPointHitCount); | |
2613 | 2607 |
2614 SetBreakPoint(foo, 0); | 2608 SetBreakPoint(foo, 0); |
2615 break_point_hit_count = 0; | 2609 break_point_hit_count = 0; |
2616 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2610 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2617 | 2611 |
2618 // Without stepping only active break points are hit. | 2612 // Without stepping only active break points are hit. |
2619 CHECK_EQ(1, break_point_hit_count); | 2613 CHECK_EQ(1, break_point_hit_count); |
2620 | 2614 |
2621 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2615 SetDebugEventListener(env->GetIsolate(), nullptr); |
2622 CheckDebuggerUnloaded(env->GetIsolate()); | 2616 CheckDebuggerUnloaded(env->GetIsolate()); |
2623 } | 2617 } |
2624 | 2618 |
2625 | 2619 |
2626 TEST(DebugStepDeclarations) { | 2620 TEST(DebugStepDeclarations) { |
2627 DebugLocalContext env; | 2621 DebugLocalContext env; |
2628 v8::HandleScope scope(env->GetIsolate()); | 2622 v8::HandleScope scope(env->GetIsolate()); |
2629 | 2623 |
2630 // Register a debug event listener which steps and counts. | 2624 // Register a debug event listener which steps and counts. |
2631 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2625 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2632 | 2626 |
2633 v8::Local<v8::Context> context = env.context(); | 2627 v8::Local<v8::Context> context = env.context(); |
2634 // Create a function for testing stepping. Run it to allow it to get | 2628 // Create a function for testing stepping. Run it to allow it to get |
2635 // optimized. | 2629 // optimized. |
2636 const char* src = "function foo() { " | 2630 const char* src = "function foo() { " |
2637 " var a;" | 2631 " var a;" |
2638 " var b = 1;" | 2632 " var b = 1;" |
2639 " var c = foo;" | 2633 " var c = foo;" |
2640 " var d = Math.floor;" | 2634 " var d = Math.floor;" |
2641 " var e = b + d(1.2);" | 2635 " var e = b + d(1.2);" |
2642 "}" | 2636 "}" |
2643 "foo()"; | 2637 "foo()"; |
2644 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 2638 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
2645 | 2639 |
2646 SetBreakPoint(foo, 0); | 2640 SetBreakPoint(foo, 0); |
2647 | 2641 |
2648 // Stepping through the declarations. | 2642 // Stepping through the declarations. |
2649 step_action = StepIn; | 2643 step_action = StepIn; |
2650 break_point_hit_count = 0; | 2644 break_point_hit_count = 0; |
2651 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2645 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2652 CHECK_EQ(5, break_point_hit_count); | 2646 CHECK_EQ(5, break_point_hit_count); |
2653 | 2647 |
2654 // Get rid of the debug event listener. | 2648 // Get rid of the debug event listener. |
2655 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2649 SetDebugEventListener(env->GetIsolate(), nullptr); |
2656 CheckDebuggerUnloaded(env->GetIsolate()); | 2650 CheckDebuggerUnloaded(env->GetIsolate()); |
2657 } | 2651 } |
2658 | 2652 |
2659 | 2653 |
2660 TEST(DebugStepLocals) { | 2654 TEST(DebugStepLocals) { |
2661 DebugLocalContext env; | 2655 DebugLocalContext env; |
2662 v8::HandleScope scope(env->GetIsolate()); | 2656 v8::HandleScope scope(env->GetIsolate()); |
2663 | 2657 |
2664 // Register a debug event listener which steps and counts. | 2658 // Register a debug event listener which steps and counts. |
2665 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2659 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2666 | 2660 |
2667 v8::Local<v8::Context> context = env.context(); | 2661 v8::Local<v8::Context> context = env.context(); |
2668 // Create a function for testing stepping. Run it to allow it to get | 2662 // Create a function for testing stepping. Run it to allow it to get |
2669 // optimized. | 2663 // optimized. |
2670 const char* src = "function foo() { " | 2664 const char* src = "function foo() { " |
2671 " var a,b;" | 2665 " var a,b;" |
2672 " a = 1;" | 2666 " a = 1;" |
2673 " b = a + 2;" | 2667 " b = a + 2;" |
2674 " b = 1 + 2 + 3;" | 2668 " b = 1 + 2 + 3;" |
2675 " a = Math.floor(b);" | 2669 " a = Math.floor(b);" |
2676 "}" | 2670 "}" |
2677 "foo()"; | 2671 "foo()"; |
2678 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 2672 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
2679 | 2673 |
2680 SetBreakPoint(foo, 0); | 2674 SetBreakPoint(foo, 0); |
2681 | 2675 |
2682 // Stepping through the declarations. | 2676 // Stepping through the declarations. |
2683 step_action = StepIn; | 2677 step_action = StepIn; |
2684 break_point_hit_count = 0; | 2678 break_point_hit_count = 0; |
2685 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2679 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
2686 CHECK_EQ(5, break_point_hit_count); | 2680 CHECK_EQ(5, break_point_hit_count); |
2687 | 2681 |
2688 // Get rid of the debug event listener. | 2682 // Get rid of the debug event listener. |
2689 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2683 SetDebugEventListener(env->GetIsolate(), nullptr); |
2690 CheckDebuggerUnloaded(env->GetIsolate()); | 2684 CheckDebuggerUnloaded(env->GetIsolate()); |
2691 } | 2685 } |
2692 | 2686 |
2693 | 2687 |
2694 TEST(DebugStepIf) { | 2688 TEST(DebugStepIf) { |
2695 DebugLocalContext env; | 2689 DebugLocalContext env; |
2696 v8::Isolate* isolate = env->GetIsolate(); | 2690 v8::Isolate* isolate = env->GetIsolate(); |
2697 v8::HandleScope scope(isolate); | 2691 v8::HandleScope scope(isolate); |
2698 | 2692 |
2699 // Register a debug event listener which steps and counts. | 2693 // Register a debug event listener which steps and counts. |
2700 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 2694 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
2701 | 2695 |
2702 v8::Local<v8::Context> context = env.context(); | 2696 v8::Local<v8::Context> context = env.context(); |
2703 // Create a function for testing stepping. Run it to allow it to get | 2697 // Create a function for testing stepping. Run it to allow it to get |
2704 // optimized. | 2698 // optimized. |
2705 const int argc = 1; | 2699 const int argc = 1; |
2706 const char* src = "function foo(x) { " | 2700 const char* src = "function foo(x) { " |
2707 " a = 1;" | 2701 " a = 1;" |
2708 " if (x) {" | 2702 " if (x) {" |
2709 " b = 1;" | 2703 " b = 1;" |
2710 " } else {" | 2704 " } else {" |
(...skipping 13 matching lines...) Expand all Loading... |
2724 CHECK_EQ(4, break_point_hit_count); | 2718 CHECK_EQ(4, break_point_hit_count); |
2725 | 2719 |
2726 // Stepping through the false part. | 2720 // Stepping through the false part. |
2727 step_action = StepIn; | 2721 step_action = StepIn; |
2728 break_point_hit_count = 0; | 2722 break_point_hit_count = 0; |
2729 v8::Local<v8::Value> argv_false[argc] = {v8::False(isolate)}; | 2723 v8::Local<v8::Value> argv_false[argc] = {v8::False(isolate)}; |
2730 foo->Call(context, env->Global(), argc, argv_false).ToLocalChecked(); | 2724 foo->Call(context, env->Global(), argc, argv_false).ToLocalChecked(); |
2731 CHECK_EQ(5, break_point_hit_count); | 2725 CHECK_EQ(5, break_point_hit_count); |
2732 | 2726 |
2733 // Get rid of the debug event listener. | 2727 // Get rid of the debug event listener. |
2734 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 2728 SetDebugEventListener(env->GetIsolate(), nullptr); |
2735 CheckDebuggerUnloaded(isolate); | 2729 CheckDebuggerUnloaded(isolate); |
2736 } | 2730 } |
2737 | 2731 |
2738 | 2732 |
2739 TEST(DebugStepSwitch) { | 2733 TEST(DebugStepSwitch) { |
2740 DebugLocalContext env; | 2734 DebugLocalContext env; |
2741 v8::Isolate* isolate = env->GetIsolate(); | 2735 v8::Isolate* isolate = env->GetIsolate(); |
2742 v8::HandleScope scope(isolate); | 2736 v8::HandleScope scope(isolate); |
2743 | 2737 |
2744 // Register a debug event listener which steps and counts. | 2738 // Register a debug event listener which steps and counts. |
2745 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2739 SetDebugEventListener(isolate, DebugEventStep); |
2746 | 2740 |
2747 v8::Local<v8::Context> context = env.context(); | 2741 v8::Local<v8::Context> context = env.context(); |
2748 // Create a function for testing stepping. Run it to allow it to get | 2742 // Create a function for testing stepping. Run it to allow it to get |
2749 // optimized. | 2743 // optimized. |
2750 const int argc = 1; | 2744 const int argc = 1; |
2751 const char* src = "function foo(x) { " | 2745 const char* src = "function foo(x) { " |
2752 " a = 1;" | 2746 " a = 1;" |
2753 " switch (x) {" | 2747 " switch (x) {" |
2754 " case 1:" | 2748 " case 1:" |
2755 " b = 1;" | 2749 " b = 1;" |
(...skipping 26 matching lines...) Expand all Loading... |
2782 CHECK_EQ(5, break_point_hit_count); | 2776 CHECK_EQ(5, break_point_hit_count); |
2783 | 2777 |
2784 // Last case. | 2778 // Last case. |
2785 step_action = StepIn; | 2779 step_action = StepIn; |
2786 break_point_hit_count = 0; | 2780 break_point_hit_count = 0; |
2787 v8::Local<v8::Value> argv_3[argc] = {v8::Number::New(isolate, 3)}; | 2781 v8::Local<v8::Value> argv_3[argc] = {v8::Number::New(isolate, 3)}; |
2788 foo->Call(context, env->Global(), argc, argv_3).ToLocalChecked(); | 2782 foo->Call(context, env->Global(), argc, argv_3).ToLocalChecked(); |
2789 CHECK_EQ(7, break_point_hit_count); | 2783 CHECK_EQ(7, break_point_hit_count); |
2790 | 2784 |
2791 // Get rid of the debug event listener. | 2785 // Get rid of the debug event listener. |
2792 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2786 SetDebugEventListener(isolate, nullptr); |
2793 CheckDebuggerUnloaded(isolate); | 2787 CheckDebuggerUnloaded(isolate); |
2794 } | 2788 } |
2795 | 2789 |
2796 | 2790 |
2797 TEST(DebugStepWhile) { | 2791 TEST(DebugStepWhile) { |
2798 DebugLocalContext env; | 2792 DebugLocalContext env; |
2799 v8::Isolate* isolate = env->GetIsolate(); | 2793 v8::Isolate* isolate = env->GetIsolate(); |
2800 v8::HandleScope scope(isolate); | 2794 v8::HandleScope scope(isolate); |
2801 | 2795 |
2802 // Register a debug event listener which steps and counts. | 2796 // Register a debug event listener which steps and counts. |
2803 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2797 SetDebugEventListener(isolate, DebugEventStep); |
2804 | 2798 |
2805 v8::Local<v8::Context> context = env.context(); | 2799 v8::Local<v8::Context> context = env.context(); |
2806 // Create a function for testing stepping. Run it to allow it to get | 2800 // Create a function for testing stepping. Run it to allow it to get |
2807 // optimized. | 2801 // optimized. |
2808 const int argc = 1; | 2802 const int argc = 1; |
2809 const char* src = "function foo(x) { " | 2803 const char* src = "function foo(x) { " |
2810 " var a = 0;" | 2804 " var a = 0;" |
2811 " while (a < x) {" | 2805 " while (a < x) {" |
2812 " a++;" | 2806 " a++;" |
2813 " }" | 2807 " }" |
(...skipping 17 matching lines...) Expand all Loading... |
2831 CHECK_EQ(23, break_point_hit_count); | 2825 CHECK_EQ(23, break_point_hit_count); |
2832 | 2826 |
2833 // Looping 100 times. | 2827 // Looping 100 times. |
2834 step_action = StepIn; | 2828 step_action = StepIn; |
2835 break_point_hit_count = 0; | 2829 break_point_hit_count = 0; |
2836 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 2830 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
2837 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 2831 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
2838 CHECK_EQ(203, break_point_hit_count); | 2832 CHECK_EQ(203, break_point_hit_count); |
2839 | 2833 |
2840 // Get rid of the debug event listener. | 2834 // Get rid of the debug event listener. |
2841 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2835 SetDebugEventListener(isolate, nullptr); |
2842 CheckDebuggerUnloaded(isolate); | 2836 CheckDebuggerUnloaded(isolate); |
2843 } | 2837 } |
2844 | 2838 |
2845 | 2839 |
2846 TEST(DebugStepDoWhile) { | 2840 TEST(DebugStepDoWhile) { |
2847 DebugLocalContext env; | 2841 DebugLocalContext env; |
2848 v8::Isolate* isolate = env->GetIsolate(); | 2842 v8::Isolate* isolate = env->GetIsolate(); |
2849 v8::HandleScope scope(isolate); | 2843 v8::HandleScope scope(isolate); |
2850 | 2844 |
2851 // Register a debug event listener which steps and counts. | 2845 // Register a debug event listener which steps and counts. |
2852 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2846 SetDebugEventListener(isolate, DebugEventStep); |
2853 | 2847 |
2854 v8::Local<v8::Context> context = env.context(); | 2848 v8::Local<v8::Context> context = env.context(); |
2855 // Create a function for testing stepping. Run it to allow it to get | 2849 // Create a function for testing stepping. Run it to allow it to get |
2856 // optimized. | 2850 // optimized. |
2857 const int argc = 1; | 2851 const int argc = 1; |
2858 const char* src = "function foo(x) { " | 2852 const char* src = "function foo(x) { " |
2859 " var a = 0;" | 2853 " var a = 0;" |
2860 " do {" | 2854 " do {" |
2861 " a++;" | 2855 " a++;" |
2862 " } while (a < x)" | 2856 " } while (a < x)" |
(...skipping 17 matching lines...) Expand all Loading... |
2880 CHECK_EQ(22, break_point_hit_count); | 2874 CHECK_EQ(22, break_point_hit_count); |
2881 | 2875 |
2882 // Looping 100 times. | 2876 // Looping 100 times. |
2883 step_action = StepIn; | 2877 step_action = StepIn; |
2884 break_point_hit_count = 0; | 2878 break_point_hit_count = 0; |
2885 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 2879 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
2886 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 2880 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
2887 CHECK_EQ(202, break_point_hit_count); | 2881 CHECK_EQ(202, break_point_hit_count); |
2888 | 2882 |
2889 // Get rid of the debug event listener. | 2883 // Get rid of the debug event listener. |
2890 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2884 SetDebugEventListener(isolate, nullptr); |
2891 CheckDebuggerUnloaded(isolate); | 2885 CheckDebuggerUnloaded(isolate); |
2892 } | 2886 } |
2893 | 2887 |
2894 | 2888 |
2895 TEST(DebugStepFor) { | 2889 TEST(DebugStepFor) { |
2896 DebugLocalContext env; | 2890 DebugLocalContext env; |
2897 v8::Isolate* isolate = env->GetIsolate(); | 2891 v8::Isolate* isolate = env->GetIsolate(); |
2898 v8::HandleScope scope(isolate); | 2892 v8::HandleScope scope(isolate); |
2899 | 2893 |
2900 // Register a debug event listener which steps and counts. | 2894 // Register a debug event listener which steps and counts. |
2901 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2895 SetDebugEventListener(isolate, DebugEventStep); |
2902 | 2896 |
2903 v8::Local<v8::Context> context = env.context(); | 2897 v8::Local<v8::Context> context = env.context(); |
2904 // Create a function for testing stepping. Run it to allow it to get | 2898 // Create a function for testing stepping. Run it to allow it to get |
2905 // optimized. | 2899 // optimized. |
2906 const int argc = 1; | 2900 const int argc = 1; |
2907 const char* src = "function foo(x) { " | 2901 const char* src = "function foo(x) { " |
2908 " a = 1;" | 2902 " a = 1;" |
2909 " for (i = 0; i < x; i++) {" | 2903 " for (i = 0; i < x; i++) {" |
2910 " b = 1;" | 2904 " b = 1;" |
2911 " }" | 2905 " }" |
(...skipping 18 matching lines...) Expand all Loading... |
2930 CHECK_EQ(34, break_point_hit_count); | 2924 CHECK_EQ(34, break_point_hit_count); |
2931 | 2925 |
2932 // Looping 100 times. | 2926 // Looping 100 times. |
2933 step_action = StepIn; | 2927 step_action = StepIn; |
2934 break_point_hit_count = 0; | 2928 break_point_hit_count = 0; |
2935 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 2929 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
2936 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 2930 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
2937 CHECK_EQ(304, break_point_hit_count); | 2931 CHECK_EQ(304, break_point_hit_count); |
2938 | 2932 |
2939 // Get rid of the debug event listener. | 2933 // Get rid of the debug event listener. |
2940 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2934 SetDebugEventListener(isolate, nullptr); |
2941 CheckDebuggerUnloaded(isolate); | 2935 CheckDebuggerUnloaded(isolate); |
2942 } | 2936 } |
2943 | 2937 |
2944 | 2938 |
2945 TEST(DebugStepForContinue) { | 2939 TEST(DebugStepForContinue) { |
2946 DebugLocalContext env; | 2940 DebugLocalContext env; |
2947 v8::Isolate* isolate = env->GetIsolate(); | 2941 v8::Isolate* isolate = env->GetIsolate(); |
2948 v8::HandleScope scope(isolate); | 2942 v8::HandleScope scope(isolate); |
2949 | 2943 |
2950 // Register a debug event listener which steps and counts. | 2944 // Register a debug event listener which steps and counts. |
2951 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2945 SetDebugEventListener(isolate, DebugEventStep); |
2952 | 2946 |
2953 v8::Local<v8::Context> context = env.context(); | 2947 v8::Local<v8::Context> context = env.context(); |
2954 // Create a function for testing stepping. Run it to allow it to get | 2948 // Create a function for testing stepping. Run it to allow it to get |
2955 // optimized. | 2949 // optimized. |
2956 const int argc = 1; | 2950 const int argc = 1; |
2957 const char* src = "function foo(x) { " | 2951 const char* src = "function foo(x) { " |
2958 " var a = 0;" | 2952 " var a = 0;" |
2959 " var b = 0;" | 2953 " var b = 0;" |
2960 " var c = 0;" | 2954 " var c = 0;" |
2961 " for (var i = 0; i < x; i++) {" | 2955 " for (var i = 0; i < x; i++) {" |
(...skipping 21 matching lines...) Expand all Loading... |
2983 | 2977 |
2984 // Looping 100 times. | 2978 // Looping 100 times. |
2985 step_action = StepIn; | 2979 step_action = StepIn; |
2986 break_point_hit_count = 0; | 2980 break_point_hit_count = 0; |
2987 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 2981 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
2988 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 2982 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
2989 CHECK_EQ(50, result->Int32Value(context).FromJust()); | 2983 CHECK_EQ(50, result->Int32Value(context).FromJust()); |
2990 CHECK_EQ(557, break_point_hit_count); | 2984 CHECK_EQ(557, break_point_hit_count); |
2991 | 2985 |
2992 // Get rid of the debug event listener. | 2986 // Get rid of the debug event listener. |
2993 v8::Debug::SetDebugEventListener(isolate, nullptr); | 2987 SetDebugEventListener(isolate, nullptr); |
2994 CheckDebuggerUnloaded(isolate); | 2988 CheckDebuggerUnloaded(isolate); |
2995 } | 2989 } |
2996 | 2990 |
2997 | 2991 |
2998 TEST(DebugStepForBreak) { | 2992 TEST(DebugStepForBreak) { |
2999 DebugLocalContext env; | 2993 DebugLocalContext env; |
3000 v8::Isolate* isolate = env->GetIsolate(); | 2994 v8::Isolate* isolate = env->GetIsolate(); |
3001 v8::HandleScope scope(isolate); | 2995 v8::HandleScope scope(isolate); |
3002 | 2996 |
3003 // Register a debug event listener which steps and counts. | 2997 // Register a debug event listener which steps and counts. |
3004 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 2998 SetDebugEventListener(isolate, DebugEventStep); |
3005 | 2999 |
3006 v8::Local<v8::Context> context = env.context(); | 3000 v8::Local<v8::Context> context = env.context(); |
3007 // Create a function for testing stepping. Run it to allow it to get | 3001 // Create a function for testing stepping. Run it to allow it to get |
3008 // optimized. | 3002 // optimized. |
3009 const int argc = 1; | 3003 const int argc = 1; |
3010 const char* src = "function foo(x) { " | 3004 const char* src = "function foo(x) { " |
3011 " var a = 0;" | 3005 " var a = 0;" |
3012 " var b = 0;" | 3006 " var b = 0;" |
3013 " var c = 0;" | 3007 " var c = 0;" |
3014 " for (var i = 0; i < 1000; i++) {" | 3008 " for (var i = 0; i < 1000; i++) {" |
(...skipping 22 matching lines...) Expand all Loading... |
3037 | 3031 |
3038 // Looping 100 times. | 3032 // Looping 100 times. |
3039 step_action = StepIn; | 3033 step_action = StepIn; |
3040 break_point_hit_count = 0; | 3034 break_point_hit_count = 0; |
3041 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3035 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
3042 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3036 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
3043 CHECK_EQ(99, result->Int32Value(context).FromJust()); | 3037 CHECK_EQ(99, result->Int32Value(context).FromJust()); |
3044 CHECK_EQ(604, break_point_hit_count); | 3038 CHECK_EQ(604, break_point_hit_count); |
3045 | 3039 |
3046 // Get rid of the debug event listener. | 3040 // Get rid of the debug event listener. |
3047 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3041 SetDebugEventListener(isolate, nullptr); |
3048 CheckDebuggerUnloaded(isolate); | 3042 CheckDebuggerUnloaded(isolate); |
3049 } | 3043 } |
3050 | 3044 |
3051 | 3045 |
3052 TEST(DebugStepForIn) { | 3046 TEST(DebugStepForIn) { |
3053 DebugLocalContext env; | 3047 DebugLocalContext env; |
3054 v8::HandleScope scope(env->GetIsolate()); | 3048 v8::HandleScope scope(env->GetIsolate()); |
3055 | 3049 |
3056 // Register a debug event listener which steps and counts. | 3050 // Register a debug event listener which steps and counts. |
3057 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 3051 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
3058 | 3052 |
3059 v8::Local<v8::Context> context = env.context(); | 3053 v8::Local<v8::Context> context = env.context(); |
3060 // Create a function for testing stepping. Run it to allow it to get | 3054 // Create a function for testing stepping. Run it to allow it to get |
3061 // optimized. | 3055 // optimized. |
3062 v8::Local<v8::Function> foo; | 3056 v8::Local<v8::Function> foo; |
3063 const char* src_1 = "function foo() { " | 3057 const char* src_1 = "function foo() { " |
3064 " var a = [1, 2];" | 3058 " var a = [1, 2];" |
3065 " for (x in a) {" | 3059 " for (x in a) {" |
3066 " b = 0;" | 3060 " b = 0;" |
3067 " }" | 3061 " }" |
(...skipping 18 matching lines...) Expand all Loading... |
3086 "foo()"; | 3080 "foo()"; |
3087 foo = CompileFunction(&env, src_2, "foo"); | 3081 foo = CompileFunction(&env, src_2, "foo"); |
3088 SetBreakPoint(foo, 0); // "var a = ..." | 3082 SetBreakPoint(foo, 0); // "var a = ..." |
3089 | 3083 |
3090 step_action = StepIn; | 3084 step_action = StepIn; |
3091 break_point_hit_count = 0; | 3085 break_point_hit_count = 0; |
3092 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3086 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3093 CHECK_EQ(10, break_point_hit_count); | 3087 CHECK_EQ(10, break_point_hit_count); |
3094 | 3088 |
3095 // Get rid of the debug event listener. | 3089 // Get rid of the debug event listener. |
3096 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3090 SetDebugEventListener(env->GetIsolate(), nullptr); |
3097 CheckDebuggerUnloaded(env->GetIsolate()); | 3091 CheckDebuggerUnloaded(env->GetIsolate()); |
3098 } | 3092 } |
3099 | 3093 |
3100 | 3094 |
3101 TEST(DebugStepWith) { | 3095 TEST(DebugStepWith) { |
3102 DebugLocalContext env; | 3096 DebugLocalContext env; |
3103 v8::HandleScope scope(env->GetIsolate()); | 3097 v8::HandleScope scope(env->GetIsolate()); |
3104 | 3098 |
3105 // Register a debug event listener which steps and counts. | 3099 // Register a debug event listener which steps and counts. |
3106 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 3100 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
3107 | 3101 |
3108 v8::Local<v8::Context> context = env.context(); | 3102 v8::Local<v8::Context> context = env.context(); |
3109 // Create a function for testing stepping. Run it to allow it to get | 3103 // Create a function for testing stepping. Run it to allow it to get |
3110 // optimized. | 3104 // optimized. |
3111 const char* src = "function foo(x) { " | 3105 const char* src = "function foo(x) { " |
3112 " var a = {};" | 3106 " var a = {};" |
3113 " with (a) {}" | 3107 " with (a) {}" |
3114 " with (b) {}" | 3108 " with (b) {}" |
3115 "}" | 3109 "}" |
3116 "foo()"; | 3110 "foo()"; |
3117 CHECK(env->Global() | 3111 CHECK(env->Global() |
3118 ->Set(context, v8_str(env->GetIsolate(), "b"), | 3112 ->Set(context, v8_str(env->GetIsolate(), "b"), |
3119 v8::Object::New(env->GetIsolate())) | 3113 v8::Object::New(env->GetIsolate())) |
3120 .FromJust()); | 3114 .FromJust()); |
3121 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3115 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
3122 v8::Local<v8::Value> result; | 3116 v8::Local<v8::Value> result; |
3123 SetBreakPoint(foo, 8); // "var a = {};" | 3117 SetBreakPoint(foo, 8); // "var a = {};" |
3124 | 3118 |
3125 step_action = StepIn; | 3119 step_action = StepIn; |
3126 break_point_hit_count = 0; | 3120 break_point_hit_count = 0; |
3127 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3121 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3128 CHECK_EQ(4, break_point_hit_count); | 3122 CHECK_EQ(4, break_point_hit_count); |
3129 | 3123 |
3130 // Get rid of the debug event listener. | 3124 // Get rid of the debug event listener. |
3131 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3125 SetDebugEventListener(env->GetIsolate(), nullptr); |
3132 CheckDebuggerUnloaded(env->GetIsolate()); | 3126 CheckDebuggerUnloaded(env->GetIsolate()); |
3133 } | 3127 } |
3134 | 3128 |
3135 | 3129 |
3136 TEST(DebugConditional) { | 3130 TEST(DebugConditional) { |
3137 DebugLocalContext env; | 3131 DebugLocalContext env; |
3138 v8::Isolate* isolate = env->GetIsolate(); | 3132 v8::Isolate* isolate = env->GetIsolate(); |
3139 v8::HandleScope scope(isolate); | 3133 v8::HandleScope scope(isolate); |
3140 | 3134 |
3141 // Register a debug event listener which steps and counts. | 3135 // Register a debug event listener which steps and counts. |
3142 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 3136 SetDebugEventListener(isolate, DebugEventStep); |
3143 | 3137 |
3144 v8::Local<v8::Context> context = env.context(); | 3138 v8::Local<v8::Context> context = env.context(); |
3145 // Create a function for testing stepping. Run it to allow it to get | 3139 // Create a function for testing stepping. Run it to allow it to get |
3146 // optimized. | 3140 // optimized. |
3147 const char* src = | 3141 const char* src = |
3148 "function foo(x) { " | 3142 "function foo(x) { " |
3149 " return x ? 1 : 2;" | 3143 " return x ? 1 : 2;" |
3150 "}" | 3144 "}" |
3151 "foo()"; | 3145 "foo()"; |
3152 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3146 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
3153 SetBreakPoint(foo, 0); // "var a;" | 3147 SetBreakPoint(foo, 0); // "var a;" |
3154 | 3148 |
3155 step_action = StepIn; | 3149 step_action = StepIn; |
3156 break_point_hit_count = 0; | 3150 break_point_hit_count = 0; |
3157 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3151 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3158 CHECK_EQ(2, break_point_hit_count); | 3152 CHECK_EQ(2, break_point_hit_count); |
3159 | 3153 |
3160 step_action = StepIn; | 3154 step_action = StepIn; |
3161 break_point_hit_count = 0; | 3155 break_point_hit_count = 0; |
3162 const int argc = 1; | 3156 const int argc = 1; |
3163 v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)}; | 3157 v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)}; |
3164 foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked(); | 3158 foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked(); |
3165 CHECK_EQ(2, break_point_hit_count); | 3159 CHECK_EQ(2, break_point_hit_count); |
3166 | 3160 |
3167 // Get rid of the debug event listener. | 3161 // Get rid of the debug event listener. |
3168 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3162 SetDebugEventListener(isolate, nullptr); |
3169 CheckDebuggerUnloaded(isolate); | 3163 CheckDebuggerUnloaded(isolate); |
3170 } | 3164 } |
3171 | 3165 |
3172 | 3166 |
3173 TEST(StepInOutSimple) { | 3167 TEST(StepInOutSimple) { |
3174 DebugLocalContext env; | 3168 DebugLocalContext env; |
3175 v8::HandleScope scope(env->GetIsolate()); | 3169 v8::HandleScope scope(env->GetIsolate()); |
3176 | 3170 |
3177 // Create a function for checking the function when hitting a break point. | 3171 // Create a function for checking the function when hitting a break point. |
3178 frame_function_name = CompileFunction(&env, | 3172 frame_function_name = CompileFunction(&env, |
3179 frame_function_name_source, | 3173 frame_function_name_source, |
3180 "frame_function_name"); | 3174 "frame_function_name"); |
3181 | 3175 |
3182 // Register a debug event listener which steps and counts. | 3176 // Register a debug event listener which steps and counts. |
3183 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); | 3177 SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
3184 | 3178 |
3185 v8::Local<v8::Context> context = env.context(); | 3179 v8::Local<v8::Context> context = env.context(); |
3186 // Create a function for testing stepping. Run it to allow it to get | 3180 // Create a function for testing stepping. Run it to allow it to get |
3187 // optimized. | 3181 // optimized. |
3188 const char* src = "function a() {b();c();}; " | 3182 const char* src = "function a() {b();c();}; " |
3189 "function b() {c();}; " | 3183 "function b() {c();}; " |
3190 "function c() {}; " | 3184 "function c() {}; " |
3191 "a(); b(); c()"; | 3185 "a(); b(); c()"; |
3192 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3186 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
3193 SetBreakPoint(a, 0); | 3187 SetBreakPoint(a, 0); |
(...skipping 16 matching lines...) Expand all Loading... |
3210 | 3204 |
3211 // Step through invocation of a with step out. | 3205 // Step through invocation of a with step out. |
3212 step_action = StepOut; | 3206 step_action = StepOut; |
3213 break_point_hit_count = 0; | 3207 break_point_hit_count = 0; |
3214 expected_step_sequence = "a"; | 3208 expected_step_sequence = "a"; |
3215 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3209 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3216 CHECK_EQ(StrLength(expected_step_sequence), | 3210 CHECK_EQ(StrLength(expected_step_sequence), |
3217 break_point_hit_count); | 3211 break_point_hit_count); |
3218 | 3212 |
3219 // Get rid of the debug event listener. | 3213 // Get rid of the debug event listener. |
3220 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3214 SetDebugEventListener(env->GetIsolate(), nullptr); |
3221 CheckDebuggerUnloaded(env->GetIsolate()); | 3215 CheckDebuggerUnloaded(env->GetIsolate()); |
3222 } | 3216 } |
3223 | 3217 |
3224 | 3218 |
3225 TEST(StepInOutTree) { | 3219 TEST(StepInOutTree) { |
3226 DebugLocalContext env; | 3220 DebugLocalContext env; |
3227 v8::HandleScope scope(env->GetIsolate()); | 3221 v8::HandleScope scope(env->GetIsolate()); |
3228 | 3222 |
3229 // Create a function for checking the function when hitting a break point. | 3223 // Create a function for checking the function when hitting a break point. |
3230 frame_function_name = CompileFunction(&env, | 3224 frame_function_name = CompileFunction(&env, |
3231 frame_function_name_source, | 3225 frame_function_name_source, |
3232 "frame_function_name"); | 3226 "frame_function_name"); |
3233 | 3227 |
3234 // Register a debug event listener which steps and counts. | 3228 // Register a debug event listener which steps and counts. |
3235 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); | 3229 SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
3236 | 3230 |
3237 v8::Local<v8::Context> context = env.context(); | 3231 v8::Local<v8::Context> context = env.context(); |
3238 // Create a function for testing stepping. Run it to allow it to get | 3232 // Create a function for testing stepping. Run it to allow it to get |
3239 // optimized. | 3233 // optimized. |
3240 const char* src = "function a() {b(c(d()),d());c(d());d()}; " | 3234 const char* src = "function a() {b(c(d()),d());c(d());d()}; " |
3241 "function b(x,y) {c();}; " | 3235 "function b(x,y) {c();}; " |
3242 "function c(x) {}; " | 3236 "function c(x) {}; " |
3243 "function d() {}; " | 3237 "function d() {}; " |
3244 "a(); b(); c(); d()"; | 3238 "a(); b(); c(); d()"; |
3245 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3239 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
(...skipping 17 matching lines...) Expand all Loading... |
3263 | 3257 |
3264 // Step through invocation of a with step out. | 3258 // Step through invocation of a with step out. |
3265 step_action = StepOut; | 3259 step_action = StepOut; |
3266 break_point_hit_count = 0; | 3260 break_point_hit_count = 0; |
3267 expected_step_sequence = "a"; | 3261 expected_step_sequence = "a"; |
3268 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3262 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3269 CHECK_EQ(StrLength(expected_step_sequence), | 3263 CHECK_EQ(StrLength(expected_step_sequence), |
3270 break_point_hit_count); | 3264 break_point_hit_count); |
3271 | 3265 |
3272 // Get rid of the debug event listener. | 3266 // Get rid of the debug event listener. |
3273 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3267 SetDebugEventListener(env->GetIsolate(), nullptr); |
3274 CheckDebuggerUnloaded(env->GetIsolate(), true); | 3268 CheckDebuggerUnloaded(env->GetIsolate(), true); |
3275 } | 3269 } |
3276 | 3270 |
3277 | 3271 |
3278 TEST(StepInOutBranch) { | 3272 TEST(StepInOutBranch) { |
3279 DebugLocalContext env; | 3273 DebugLocalContext env; |
3280 v8::HandleScope scope(env->GetIsolate()); | 3274 v8::HandleScope scope(env->GetIsolate()); |
3281 | 3275 |
3282 // Create a function for checking the function when hitting a break point. | 3276 // Create a function for checking the function when hitting a break point. |
3283 frame_function_name = CompileFunction(&env, | 3277 frame_function_name = CompileFunction(&env, |
3284 frame_function_name_source, | 3278 frame_function_name_source, |
3285 "frame_function_name"); | 3279 "frame_function_name"); |
3286 | 3280 |
3287 // Register a debug event listener which steps and counts. | 3281 // Register a debug event listener which steps and counts. |
3288 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); | 3282 SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
3289 | 3283 |
3290 v8::Local<v8::Context> context = env.context(); | 3284 v8::Local<v8::Context> context = env.context(); |
3291 // Create a function for testing stepping. Run it to allow it to get | 3285 // Create a function for testing stepping. Run it to allow it to get |
3292 // optimized. | 3286 // optimized. |
3293 const char* src = "function a() {b(false);c();}; " | 3287 const char* src = "function a() {b(false);c();}; " |
3294 "function b(x) {if(x){c();};}; " | 3288 "function b(x) {if(x){c();};}; " |
3295 "function c() {}; " | 3289 "function c() {}; " |
3296 "a(); b(); c()"; | 3290 "a(); b(); c()"; |
3297 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3291 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
3298 SetBreakPoint(a, 0); | 3292 SetBreakPoint(a, 0); |
3299 | 3293 |
3300 // Step through invocation of a. | 3294 // Step through invocation of a. |
3301 step_action = StepIn; | 3295 step_action = StepIn; |
3302 break_point_hit_count = 0; | 3296 break_point_hit_count = 0; |
3303 expected_step_sequence = "abbaca"; | 3297 expected_step_sequence = "abbaca"; |
3304 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3298 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3305 CHECK_EQ(StrLength(expected_step_sequence), | 3299 CHECK_EQ(StrLength(expected_step_sequence), |
3306 break_point_hit_count); | 3300 break_point_hit_count); |
3307 | 3301 |
3308 // Get rid of the debug event listener. | 3302 // Get rid of the debug event listener. |
3309 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3303 SetDebugEventListener(env->GetIsolate(), nullptr); |
3310 CheckDebuggerUnloaded(env->GetIsolate()); | 3304 CheckDebuggerUnloaded(env->GetIsolate()); |
3311 } | 3305 } |
3312 | 3306 |
3313 | 3307 |
3314 // Test that step in does not step into native functions. | 3308 // Test that step in does not step into native functions. |
3315 TEST(DebugStepNatives) { | 3309 TEST(DebugStepNatives) { |
3316 DebugLocalContext env; | 3310 DebugLocalContext env; |
3317 v8::HandleScope scope(env->GetIsolate()); | 3311 v8::HandleScope scope(env->GetIsolate()); |
3318 | 3312 |
3319 // Create a function for testing stepping. | 3313 // Create a function for testing stepping. |
3320 v8::Local<v8::Function> foo = CompileFunction( | 3314 v8::Local<v8::Function> foo = CompileFunction( |
3321 &env, | 3315 &env, |
3322 "function foo(){debugger;Math.sin(1);}", | 3316 "function foo(){debugger;Math.sin(1);}", |
3323 "foo"); | 3317 "foo"); |
3324 | 3318 |
3325 // Register a debug event listener which steps and counts. | 3319 // Register a debug event listener which steps and counts. |
3326 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 3320 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
3327 | 3321 |
3328 v8::Local<v8::Context> context = env.context(); | 3322 v8::Local<v8::Context> context = env.context(); |
3329 step_action = StepIn; | 3323 step_action = StepIn; |
3330 break_point_hit_count = 0; | 3324 break_point_hit_count = 0; |
3331 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3325 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3332 | 3326 |
3333 // With stepping all break locations are hit. | 3327 // With stepping all break locations are hit. |
3334 CHECK_EQ(3, break_point_hit_count); | 3328 CHECK_EQ(3, break_point_hit_count); |
3335 | 3329 |
3336 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3330 SetDebugEventListener(env->GetIsolate(), nullptr); |
3337 CheckDebuggerUnloaded(env->GetIsolate()); | 3331 CheckDebuggerUnloaded(env->GetIsolate()); |
3338 | 3332 |
3339 // Register a debug event listener which just counts. | 3333 // Register a debug event listener which just counts. |
3340 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 3334 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
3341 DebugEventBreakPointHitCount); | |
3342 | 3335 |
3343 break_point_hit_count = 0; | 3336 break_point_hit_count = 0; |
3344 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3337 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3345 | 3338 |
3346 // Without stepping only active break points are hit. | 3339 // Without stepping only active break points are hit. |
3347 CHECK_EQ(1, break_point_hit_count); | 3340 CHECK_EQ(1, break_point_hit_count); |
3348 | 3341 |
3349 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3342 SetDebugEventListener(env->GetIsolate(), nullptr); |
3350 CheckDebuggerUnloaded(env->GetIsolate()); | 3343 CheckDebuggerUnloaded(env->GetIsolate()); |
3351 } | 3344 } |
3352 | 3345 |
3353 | 3346 |
3354 // Test that step in works with function.apply. | 3347 // Test that step in works with function.apply. |
3355 TEST(DebugStepFunctionApply) { | 3348 TEST(DebugStepFunctionApply) { |
3356 DebugLocalContext env; | 3349 DebugLocalContext env; |
3357 v8::HandleScope scope(env->GetIsolate()); | 3350 v8::HandleScope scope(env->GetIsolate()); |
3358 | 3351 |
3359 // Create a function for testing stepping. | 3352 // Create a function for testing stepping. |
3360 v8::Local<v8::Function> foo = CompileFunction( | 3353 v8::Local<v8::Function> foo = CompileFunction( |
3361 &env, | 3354 &env, |
3362 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" | 3355 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" |
3363 "function foo(){ debugger; bar.apply(this, [1,2,3]); }", | 3356 "function foo(){ debugger; bar.apply(this, [1,2,3]); }", |
3364 "foo"); | 3357 "foo"); |
3365 | 3358 |
3366 // Register a debug event listener which steps and counts. | 3359 // Register a debug event listener which steps and counts. |
3367 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); | 3360 SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
3368 | 3361 |
3369 v8::Local<v8::Context> context = env.context(); | 3362 v8::Local<v8::Context> context = env.context(); |
3370 step_action = StepIn; | 3363 step_action = StepIn; |
3371 break_point_hit_count = 0; | 3364 break_point_hit_count = 0; |
3372 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3365 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3373 | 3366 |
3374 // With stepping all break locations are hit. | 3367 // With stepping all break locations are hit. |
3375 CHECK_EQ(7, break_point_hit_count); | 3368 CHECK_EQ(7, break_point_hit_count); |
3376 | 3369 |
3377 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3370 SetDebugEventListener(env->GetIsolate(), nullptr); |
3378 CheckDebuggerUnloaded(env->GetIsolate()); | 3371 CheckDebuggerUnloaded(env->GetIsolate()); |
3379 | 3372 |
3380 // Register a debug event listener which just counts. | 3373 // Register a debug event listener which just counts. |
3381 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 3374 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
3382 DebugEventBreakPointHitCount); | |
3383 | 3375 |
3384 break_point_hit_count = 0; | 3376 break_point_hit_count = 0; |
3385 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3377 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3386 | 3378 |
3387 // Without stepping only the debugger statement is hit. | 3379 // Without stepping only the debugger statement is hit. |
3388 CHECK_EQ(1, break_point_hit_count); | 3380 CHECK_EQ(1, break_point_hit_count); |
3389 | 3381 |
3390 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3382 SetDebugEventListener(env->GetIsolate(), nullptr); |
3391 CheckDebuggerUnloaded(env->GetIsolate()); | 3383 CheckDebuggerUnloaded(env->GetIsolate()); |
3392 } | 3384 } |
3393 | 3385 |
3394 | 3386 |
3395 // Test that step in works with function.call. | 3387 // Test that step in works with function.call. |
3396 TEST(DebugStepFunctionCall) { | 3388 TEST(DebugStepFunctionCall) { |
3397 DebugLocalContext env; | 3389 DebugLocalContext env; |
3398 v8::Isolate* isolate = env->GetIsolate(); | 3390 v8::Isolate* isolate = env->GetIsolate(); |
3399 v8::HandleScope scope(isolate); | 3391 v8::HandleScope scope(isolate); |
3400 | 3392 |
3401 v8::Local<v8::Context> context = env.context(); | 3393 v8::Local<v8::Context> context = env.context(); |
3402 // Create a function for testing stepping. | 3394 // Create a function for testing stepping. |
3403 v8::Local<v8::Function> foo = CompileFunction( | 3395 v8::Local<v8::Function> foo = CompileFunction( |
3404 &env, | 3396 &env, |
3405 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" | 3397 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" |
3406 "function foo(a){ debugger;" | 3398 "function foo(a){ debugger;" |
3407 " if (a) {" | 3399 " if (a) {" |
3408 " bar.call(this, 1, 2, 3);" | 3400 " bar.call(this, 1, 2, 3);" |
3409 " } else {" | 3401 " } else {" |
3410 " bar.call(this, 0);" | 3402 " bar.call(this, 0);" |
3411 " }" | 3403 " }" |
3412 "}", | 3404 "}", |
3413 "foo"); | 3405 "foo"); |
3414 | 3406 |
3415 // Register a debug event listener which steps and counts. | 3407 // Register a debug event listener which steps and counts. |
3416 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 3408 SetDebugEventListener(isolate, DebugEventStep); |
3417 step_action = StepIn; | 3409 step_action = StepIn; |
3418 | 3410 |
3419 // Check stepping where the if condition in bar is false. | 3411 // Check stepping where the if condition in bar is false. |
3420 break_point_hit_count = 0; | 3412 break_point_hit_count = 0; |
3421 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3413 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3422 CHECK_EQ(6, break_point_hit_count); | 3414 CHECK_EQ(6, break_point_hit_count); |
3423 | 3415 |
3424 // Check stepping where the if condition in bar is true. | 3416 // Check stepping where the if condition in bar is true. |
3425 break_point_hit_count = 0; | 3417 break_point_hit_count = 0; |
3426 const int argc = 1; | 3418 const int argc = 1; |
3427 v8::Local<v8::Value> argv[argc] = {v8::True(isolate)}; | 3419 v8::Local<v8::Value> argv[argc] = {v8::True(isolate)}; |
3428 foo->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 3420 foo->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
3429 CHECK_EQ(8, break_point_hit_count); | 3421 CHECK_EQ(8, break_point_hit_count); |
3430 | 3422 |
3431 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3423 SetDebugEventListener(isolate, nullptr); |
3432 CheckDebuggerUnloaded(isolate); | 3424 CheckDebuggerUnloaded(isolate); |
3433 | 3425 |
3434 // Register a debug event listener which just counts. | 3426 // Register a debug event listener which just counts. |
3435 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); | 3427 SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
3436 | 3428 |
3437 break_point_hit_count = 0; | 3429 break_point_hit_count = 0; |
3438 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3430 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3439 | 3431 |
3440 // Without stepping only the debugger statement is hit. | 3432 // Without stepping only the debugger statement is hit. |
3441 CHECK_EQ(1, break_point_hit_count); | 3433 CHECK_EQ(1, break_point_hit_count); |
3442 | 3434 |
3443 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3435 SetDebugEventListener(isolate, nullptr); |
3444 CheckDebuggerUnloaded(isolate); | 3436 CheckDebuggerUnloaded(isolate); |
3445 } | 3437 } |
3446 | 3438 |
3447 | 3439 |
3448 // Test that step in works with Function.call.apply. | 3440 // Test that step in works with Function.call.apply. |
3449 TEST(DebugStepFunctionCallApply) { | 3441 TEST(DebugStepFunctionCallApply) { |
3450 DebugLocalContext env; | 3442 DebugLocalContext env; |
3451 v8::Isolate* isolate = env->GetIsolate(); | 3443 v8::Isolate* isolate = env->GetIsolate(); |
3452 v8::HandleScope scope(isolate); | 3444 v8::HandleScope scope(isolate); |
3453 | 3445 |
3454 v8::Local<v8::Context> context = env.context(); | 3446 v8::Local<v8::Context> context = env.context(); |
3455 // Create a function for testing stepping. | 3447 // Create a function for testing stepping. |
3456 v8::Local<v8::Function> foo = | 3448 v8::Local<v8::Function> foo = |
3457 CompileFunction(&env, | 3449 CompileFunction(&env, |
3458 "function bar() { }" | 3450 "function bar() { }" |
3459 "function foo(){ debugger;" | 3451 "function foo(){ debugger;" |
3460 " Function.call.apply(bar);" | 3452 " Function.call.apply(bar);" |
3461 " Function.call.apply(Function.call, " | 3453 " Function.call.apply(Function.call, " |
3462 "[Function.call, bar]);" | 3454 "[Function.call, bar]);" |
3463 "}", | 3455 "}", |
3464 "foo"); | 3456 "foo"); |
3465 | 3457 |
3466 // Register a debug event listener which steps and counts. | 3458 // Register a debug event listener which steps and counts. |
3467 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); | 3459 SetDebugEventListener(isolate, DebugEventStep); |
3468 step_action = StepIn; | 3460 step_action = StepIn; |
3469 | 3461 |
3470 break_point_hit_count = 0; | 3462 break_point_hit_count = 0; |
3471 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3463 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3472 CHECK_EQ(6, break_point_hit_count); | 3464 CHECK_EQ(6, break_point_hit_count); |
3473 | 3465 |
3474 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3466 SetDebugEventListener(isolate, nullptr); |
3475 CheckDebuggerUnloaded(isolate); | 3467 CheckDebuggerUnloaded(isolate); |
3476 | 3468 |
3477 // Register a debug event listener which just counts. | 3469 // Register a debug event listener which just counts. |
3478 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); | 3470 SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
3479 | 3471 |
3480 break_point_hit_count = 0; | 3472 break_point_hit_count = 0; |
3481 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3473 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3482 | 3474 |
3483 // Without stepping only the debugger statement is hit. | 3475 // Without stepping only the debugger statement is hit. |
3484 CHECK_EQ(1, break_point_hit_count); | 3476 CHECK_EQ(1, break_point_hit_count); |
3485 | 3477 |
3486 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3478 SetDebugEventListener(isolate, nullptr); |
3487 CheckDebuggerUnloaded(isolate); | 3479 CheckDebuggerUnloaded(isolate); |
3488 } | 3480 } |
3489 | 3481 |
3490 | 3482 |
3491 // Tests that breakpoint will be hit if it's set in script. | 3483 // Tests that breakpoint will be hit if it's set in script. |
3492 TEST(PauseInScript) { | 3484 TEST(PauseInScript) { |
3493 DebugLocalContext env; | 3485 DebugLocalContext env; |
3494 v8::HandleScope scope(env->GetIsolate()); | 3486 v8::HandleScope scope(env->GetIsolate()); |
3495 env.ExposeDebug(); | 3487 env.ExposeDebug(); |
3496 | 3488 |
3497 // Register a debug event listener which counts. | 3489 // Register a debug event listener which counts. |
3498 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); | 3490 SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
3499 | 3491 |
3500 v8::Local<v8::Context> context = env.context(); | 3492 v8::Local<v8::Context> context = env.context(); |
3501 // Create a script that returns a function. | 3493 // Create a script that returns a function. |
3502 const char* src = "(function (evt) {})"; | 3494 const char* src = "(function (evt) {})"; |
3503 const char* script_name = "StepInHandlerTest"; | 3495 const char* script_name = "StepInHandlerTest"; |
3504 | 3496 |
3505 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name), | 3497 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name), |
3506 v8::Integer::New(env->GetIsolate(), 0)); | 3498 v8::Integer::New(env->GetIsolate(), 0)); |
3507 v8::Local<v8::Script> script = | 3499 v8::Local<v8::Script> script = |
3508 v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin) | 3500 v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin) |
3509 .ToLocalChecked(); | 3501 .ToLocalChecked(); |
3510 | 3502 |
3511 // Set breakpoint in the script. | 3503 // Set breakpoint in the script. |
3512 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); | 3504 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); |
3513 break_point_hit_count = 0; | 3505 break_point_hit_count = 0; |
3514 | 3506 |
3515 v8::Local<v8::Value> r = script->Run(context).ToLocalChecked(); | 3507 v8::Local<v8::Value> r = script->Run(context).ToLocalChecked(); |
3516 | 3508 |
3517 CHECK(r->IsFunction()); | 3509 CHECK(r->IsFunction()); |
3518 CHECK_EQ(1, break_point_hit_count); | 3510 CHECK_EQ(1, break_point_hit_count); |
3519 | 3511 |
3520 // Get rid of the debug event listener. | 3512 // Get rid of the debug event listener. |
3521 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3513 SetDebugEventListener(env->GetIsolate(), nullptr); |
3522 CheckDebuggerUnloaded(env->GetIsolate()); | 3514 CheckDebuggerUnloaded(env->GetIsolate()); |
3523 } | 3515 } |
3524 | 3516 |
3525 | 3517 |
3526 static void DebugEventCounterCheck(int caught, int uncaught, int message) { | 3518 static void DebugEventCounterCheck(int caught, int uncaught, int message) { |
3527 CHECK_EQ(caught, exception_hit_count); | 3519 CHECK_EQ(caught, exception_hit_count); |
3528 CHECK_EQ(uncaught, uncaught_exception_hit_count); | 3520 CHECK_EQ(uncaught, uncaught_exception_hit_count); |
3529 CHECK_EQ(message, message_callback_count); | 3521 CHECK_EQ(message, message_callback_count); |
3530 } | 3522 } |
3531 | 3523 |
(...skipping 22 matching lines...) Expand all Loading... |
3554 &env, "function notCaughtFinally(){try{throws();}finally{}}", | 3546 &env, "function notCaughtFinally(){try{throws();}finally{}}", |
3555 "notCaughtFinally"); | 3547 "notCaughtFinally"); |
3556 // In this edge case, even though this finally does not propagate the | 3548 // In this edge case, even though this finally does not propagate the |
3557 // exception, the debugger considers this uncaught, since we want to break | 3549 // exception, the debugger considers this uncaught, since we want to break |
3558 // at the first throw for the general case where finally implicitly rethrows. | 3550 // at the first throw for the general case where finally implicitly rethrows. |
3559 v8::Local<v8::Function> edgeCaseFinally = CompileFunction( | 3551 v8::Local<v8::Function> edgeCaseFinally = CompileFunction( |
3560 &env, "function caughtFinally(){L:try{throws();}finally{break L;}}", | 3552 &env, "function caughtFinally(){L:try{throws();}finally{break L;}}", |
3561 "caughtFinally"); | 3553 "caughtFinally"); |
3562 | 3554 |
3563 env->GetIsolate()->AddMessageListener(MessageCallbackCount); | 3555 env->GetIsolate()->AddMessageListener(MessageCallbackCount); |
3564 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); | 3556 SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
3565 | 3557 |
3566 // Initial state should be no break on exceptions. | 3558 // Initial state should be no break on exceptions. |
3567 DebugEventCounterClear(); | 3559 DebugEventCounterClear(); |
3568 MessageCallbackCountClear(); | 3560 MessageCallbackCountClear(); |
3569 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3561 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3570 DebugEventCounterCheck(0, 0, 0); | 3562 DebugEventCounterCheck(0, 0, 0); |
3571 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3563 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); |
3572 DebugEventCounterCheck(0, 0, 1); | 3564 DebugEventCounterCheck(0, 0, 1); |
3573 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3565 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); |
3574 DebugEventCounterCheck(0, 0, 2); | 3566 DebugEventCounterCheck(0, 0, 2); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3714 v8::debug::BreakOnAnyException); | 3706 v8::debug::BreakOnAnyException); |
3715 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3707 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3716 DebugEventCounterCheck(1, 0, 0); | 3708 DebugEventCounterCheck(1, 0, 0); |
3717 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3709 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); |
3718 DebugEventCounterCheck(2, 1, 1); | 3710 DebugEventCounterCheck(2, 1, 1); |
3719 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3711 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); |
3720 DebugEventCounterCheck(3, 2, 2); | 3712 DebugEventCounterCheck(3, 2, 2); |
3721 edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3713 edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3722 DebugEventCounterCheck(4, 3, 2); | 3714 DebugEventCounterCheck(4, 3, 2); |
3723 | 3715 |
3724 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3716 SetDebugEventListener(env->GetIsolate(), nullptr); |
3725 CheckDebuggerUnloaded(env->GetIsolate()); | 3717 CheckDebuggerUnloaded(env->GetIsolate()); |
3726 env->GetIsolate()->RemoveMessageListeners(MessageCallbackCount); | 3718 env->GetIsolate()->RemoveMessageListeners(MessageCallbackCount); |
3727 } | 3719 } |
3728 | 3720 |
3729 | 3721 |
3730 static void try_finally_original_message(v8::Local<v8::Message> message, | 3722 static void try_finally_original_message(v8::Local<v8::Message> message, |
3731 v8::Local<v8::Value> data) { | 3723 v8::Local<v8::Value> data) { |
3732 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); | 3724 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); |
3733 CHECK_EQ(2, message->GetLineNumber(context).FromJust()); | 3725 CHECK_EQ(2, message->GetLineNumber(context).FromJust()); |
3734 CHECK_EQ(2, message->GetStartColumn(context).FromJust()); | 3726 CHECK_EQ(2, message->GetStartColumn(context).FromJust()); |
3735 message_callback_count++; | 3727 message_callback_count++; |
3736 } | 3728 } |
3737 | 3729 |
3738 | 3730 |
3739 TEST(TryFinallyOriginalMessage) { | 3731 TEST(TryFinallyOriginalMessage) { |
3740 // Test that the debugger plays nicely with the pending message. | 3732 // Test that the debugger plays nicely with the pending message. |
3741 message_callback_count = 0; | 3733 message_callback_count = 0; |
3742 DebugEventCounterClear(); | 3734 DebugEventCounterClear(); |
3743 DebugLocalContext env; | 3735 DebugLocalContext env; |
3744 v8::Isolate* isolate = CcTest::isolate(); | 3736 v8::Isolate* isolate = CcTest::isolate(); |
3745 isolate->AddMessageListener(try_finally_original_message); | 3737 isolate->AddMessageListener(try_finally_original_message); |
3746 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter); | 3738 SetDebugEventListener(isolate, DebugEventCounter); |
3747 ChangeBreakOnException(true, true); | 3739 ChangeBreakOnException(true, true); |
3748 v8::HandleScope scope(isolate); | 3740 v8::HandleScope scope(isolate); |
3749 CompileRun( | 3741 CompileRun( |
3750 "try {\n" | 3742 "try {\n" |
3751 " throw 1;\n" | 3743 " throw 1;\n" |
3752 "} finally {\n" | 3744 "} finally {\n" |
3753 "}\n"); | 3745 "}\n"); |
3754 DebugEventCounterCheck(1, 1, 1); | 3746 DebugEventCounterCheck(1, 1, 1); |
3755 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3747 SetDebugEventListener(isolate, nullptr); |
3756 isolate->RemoveMessageListeners(try_finally_original_message); | 3748 isolate->RemoveMessageListeners(try_finally_original_message); |
3757 } | 3749 } |
3758 | 3750 |
3759 | 3751 |
3760 // Test break on exception from compiler errors. When compiling using | 3752 // Test break on exception from compiler errors. When compiling using |
3761 // v8::Script::Compile there is no JavaScript stack whereas when compiling using | 3753 // v8::Script::Compile there is no JavaScript stack whereas when compiling using |
3762 // eval there are JavaScript frames. | 3754 // eval there are JavaScript frames. |
3763 TEST(BreakOnCompileException) { | 3755 TEST(BreakOnCompileException) { |
3764 DebugLocalContext env; | 3756 DebugLocalContext env; |
3765 v8::HandleScope scope(env->GetIsolate()); | 3757 v8::HandleScope scope(env->GetIsolate()); |
3766 | 3758 |
3767 v8::Local<v8::Context> context = env.context(); | 3759 v8::Local<v8::Context> context = env.context(); |
3768 // For this test, we want to break on uncaught exceptions: | 3760 // For this test, we want to break on uncaught exceptions: |
3769 ChangeBreakOnException(false, true); | 3761 ChangeBreakOnException(false, true); |
3770 | 3762 |
3771 // Create a function for checking the function when hitting a break point. | 3763 // Create a function for checking the function when hitting a break point. |
3772 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); | 3764 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); |
3773 | 3765 |
3774 env->GetIsolate()->AddMessageListener(MessageCallbackCount); | 3766 env->GetIsolate()->AddMessageListener(MessageCallbackCount); |
3775 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); | 3767 SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
3776 | 3768 |
3777 DebugEventCounterClear(); | 3769 DebugEventCounterClear(); |
3778 MessageCallbackCountClear(); | 3770 MessageCallbackCountClear(); |
3779 | 3771 |
3780 // Check initial state. | 3772 // Check initial state. |
3781 CHECK_EQ(0, exception_hit_count); | 3773 CHECK_EQ(0, exception_hit_count); |
3782 CHECK_EQ(0, uncaught_exception_hit_count); | 3774 CHECK_EQ(0, uncaught_exception_hit_count); |
3783 CHECK_EQ(0, message_callback_count); | 3775 CHECK_EQ(0, message_callback_count); |
3784 CHECK_EQ(-1, last_js_stack_height); | 3776 CHECK_EQ(-1, last_js_stack_height); |
3785 | 3777 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3829 | 3821 |
3830 // For this test, we want to break on uncaught exceptions: | 3822 // For this test, we want to break on uncaught exceptions: |
3831 ChangeBreakOnException(false, true); | 3823 ChangeBreakOnException(false, true); |
3832 | 3824 |
3833 // Create a function for checking the function when hitting a break point. | 3825 // Create a function for checking the function when hitting a break point. |
3834 frame_function_name = CompileFunction(&env, | 3826 frame_function_name = CompileFunction(&env, |
3835 frame_function_name_source, | 3827 frame_function_name_source, |
3836 "frame_function_name"); | 3828 "frame_function_name"); |
3837 | 3829 |
3838 // Register a debug event listener which steps and counts. | 3830 // Register a debug event listener which steps and counts. |
3839 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); | 3831 SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
3840 | 3832 |
3841 v8::Local<v8::Context> context = env.context(); | 3833 v8::Local<v8::Context> context = env.context(); |
3842 // Create functions for testing stepping. | 3834 // Create functions for testing stepping. |
3843 const char* src = "function a() { n(); }; " | 3835 const char* src = "function a() { n(); }; " |
3844 "function b() { c(); }; " | 3836 "function b() { c(); }; " |
3845 "function c() { n(); }; " | 3837 "function c() { n(); }; " |
3846 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " | 3838 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " |
3847 "function e() { n(); }; " | 3839 "function e() { n(); }; " |
3848 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " | 3840 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " |
3849 "function g() { h(); }; " | 3841 "function g() { h(); }; " |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3907 // Step through invocation of f + g + h now with break on caught exceptions. | 3899 // Step through invocation of f + g + h now with break on caught exceptions. |
3908 ChangeBreakOnException(true, true); | 3900 ChangeBreakOnException(true, true); |
3909 step_action = StepIn; | 3901 step_action = StepIn; |
3910 break_point_hit_count = 0; | 3902 break_point_hit_count = 0; |
3911 expected_step_sequence = "ffghhhff"; | 3903 expected_step_sequence = "ffghhhff"; |
3912 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3904 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3913 CHECK_EQ(StrLength(expected_step_sequence), | 3905 CHECK_EQ(StrLength(expected_step_sequence), |
3914 break_point_hit_count); | 3906 break_point_hit_count); |
3915 | 3907 |
3916 // Get rid of the debug event listener. | 3908 // Get rid of the debug event listener. |
3917 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 3909 SetDebugEventListener(env->GetIsolate(), nullptr); |
3918 CheckDebuggerUnloaded(env->GetIsolate()); | 3910 CheckDebuggerUnloaded(env->GetIsolate()); |
3919 } | 3911 } |
3920 | 3912 |
3921 | 3913 |
3922 TEST(DebugBreak) { | 3914 TEST(DebugBreak) { |
3923 i::FLAG_stress_compaction = false; | 3915 i::FLAG_stress_compaction = false; |
3924 #ifdef VERIFY_HEAP | 3916 #ifdef VERIFY_HEAP |
3925 i::FLAG_verify_heap = true; | 3917 i::FLAG_verify_heap = true; |
3926 #endif | 3918 #endif |
3927 DebugLocalContext env; | 3919 DebugLocalContext env; |
3928 v8::Isolate* isolate = env->GetIsolate(); | 3920 v8::Isolate* isolate = env->GetIsolate(); |
3929 v8::HandleScope scope(isolate); | 3921 v8::HandleScope scope(isolate); |
3930 | 3922 |
3931 // Register a debug event listener which sets the break flag and counts. | 3923 // Register a debug event listener which sets the break flag and counts. |
3932 v8::Debug::SetDebugEventListener(isolate, DebugEventBreak); | 3924 SetDebugEventListener(isolate, DebugEventBreak); |
3933 | 3925 |
3934 v8::Local<v8::Context> context = env.context(); | 3926 v8::Local<v8::Context> context = env.context(); |
3935 // Create a function for testing stepping. | 3927 // Create a function for testing stepping. |
3936 const char* src = "function f0() {}" | 3928 const char* src = "function f0() {}" |
3937 "function f1(x1) {}" | 3929 "function f1(x1) {}" |
3938 "function f2(x1,x2) {}" | 3930 "function f2(x1,x2) {}" |
3939 "function f3(x1,x2,x3) {}"; | 3931 "function f3(x1,x2,x3) {}"; |
3940 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); | 3932 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); |
3941 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); | 3933 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); |
3942 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); | 3934 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); |
3943 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); | 3935 v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); |
3944 | 3936 |
3945 // Call the function to make sure it is compiled. | 3937 // Call the function to make sure it is compiled. |
3946 v8::Local<v8::Value> argv[] = { | 3938 v8::Local<v8::Value> argv[] = { |
3947 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1), | 3939 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1), |
3948 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1)}; | 3940 v8::Number::New(isolate, 1), v8::Number::New(isolate, 1)}; |
3949 | 3941 |
3950 // Call all functions to make sure that they are compiled. | 3942 // Call all functions to make sure that they are compiled. |
3951 f0->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3943 f0->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3952 f1->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3944 f1->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3953 f2->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3945 f2->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3954 f3->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3946 f3->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
3955 | 3947 |
3956 // Set the debug break flag. | 3948 // Set the debug break flag. |
3957 v8::Debug::DebugBreak(env->GetIsolate()); | 3949 v8::debug::DebugBreak(env->GetIsolate()); |
3958 | 3950 |
3959 // Call all functions with different argument count. | 3951 // Call all functions with different argument count. |
3960 break_point_hit_count = 0; | 3952 break_point_hit_count = 0; |
3961 for (unsigned int i = 0; i < arraysize(argv); i++) { | 3953 for (unsigned int i = 0; i < arraysize(argv); i++) { |
3962 f0->Call(context, env->Global(), i, argv).ToLocalChecked(); | 3954 f0->Call(context, env->Global(), i, argv).ToLocalChecked(); |
3963 f1->Call(context, env->Global(), i, argv).ToLocalChecked(); | 3955 f1->Call(context, env->Global(), i, argv).ToLocalChecked(); |
3964 f2->Call(context, env->Global(), i, argv).ToLocalChecked(); | 3956 f2->Call(context, env->Global(), i, argv).ToLocalChecked(); |
3965 f3->Call(context, env->Global(), i, argv).ToLocalChecked(); | 3957 f3->Call(context, env->Global(), i, argv).ToLocalChecked(); |
3966 } | 3958 } |
3967 | 3959 |
3968 // One break for each function called. | 3960 // One break for each function called. |
3969 CHECK(4 * arraysize(argv) == break_point_hit_count); | 3961 CHECK(4 * arraysize(argv) == break_point_hit_count); |
3970 | 3962 |
3971 // Get rid of the debug event listener. | 3963 // Get rid of the debug event listener. |
3972 v8::Debug::SetDebugEventListener(isolate, nullptr); | 3964 SetDebugEventListener(isolate, nullptr); |
3973 CheckDebuggerUnloaded(isolate); | 3965 CheckDebuggerUnloaded(isolate); |
3974 } | 3966 } |
3975 | 3967 |
3976 | 3968 |
3977 // Test to ensure that JavaScript code keeps running while the debug break | 3969 // Test to ensure that JavaScript code keeps running while the debug break |
3978 // through the stack limit flag is set but breaks are disabled. | 3970 // through the stack limit flag is set but breaks are disabled. |
3979 TEST(DisableBreak) { | 3971 TEST(DisableBreak) { |
3980 DebugLocalContext env; | 3972 DebugLocalContext env; |
3981 v8::HandleScope scope(env->GetIsolate()); | 3973 v8::HandleScope scope(env->GetIsolate()); |
3982 | 3974 |
3983 // Register a debug event listener which sets the break flag and counts. | 3975 // Register a debug event listener which sets the break flag and counts. |
3984 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); | 3976 SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
3985 | 3977 |
3986 v8::Local<v8::Context> context = env.context(); | 3978 v8::Local<v8::Context> context = env.context(); |
3987 // Create a function for testing stepping. | 3979 // Create a function for testing stepping. |
3988 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; | 3980 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; |
3989 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 3981 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
3990 | 3982 |
3991 // Set, test and cancel debug break. | 3983 // Set, test and cancel debug break. |
3992 v8::Debug::DebugBreak(env->GetIsolate()); | 3984 v8::debug::DebugBreak(env->GetIsolate()); |
3993 v8::Debug::CancelDebugBreak(env->GetIsolate()); | 3985 v8::debug::CancelDebugBreak(env->GetIsolate()); |
3994 | 3986 |
3995 // Set the debug break flag. | 3987 // Set the debug break flag. |
3996 v8::Debug::DebugBreak(env->GetIsolate()); | 3988 v8::debug::DebugBreak(env->GetIsolate()); |
3997 | 3989 |
3998 // Call all functions with different argument count. | 3990 // Call all functions with different argument count. |
3999 break_point_hit_count = 0; | 3991 break_point_hit_count = 0; |
4000 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3992 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
4001 CHECK_EQ(1, break_point_hit_count); | 3993 CHECK_EQ(1, break_point_hit_count); |
4002 | 3994 |
4003 { | 3995 { |
4004 v8::Debug::DebugBreak(env->GetIsolate()); | 3996 v8::debug::DebugBreak(env->GetIsolate()); |
4005 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); | 3997 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); |
4006 v8::internal::DisableBreak disable_break(isolate->debug()); | 3998 v8::internal::DisableBreak disable_break(isolate->debug()); |
4007 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3999 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
4008 CHECK_EQ(1, break_point_hit_count); | 4000 CHECK_EQ(1, break_point_hit_count); |
4009 } | 4001 } |
4010 | 4002 |
4011 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4003 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
4012 CHECK_EQ(2, break_point_hit_count); | 4004 CHECK_EQ(2, break_point_hit_count); |
4013 | 4005 |
4014 // Get rid of the debug event listener. | 4006 // Get rid of the debug event listener. |
4015 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 4007 SetDebugEventListener(env->GetIsolate(), nullptr); |
4016 CheckDebuggerUnloaded(env->GetIsolate()); | 4008 CheckDebuggerUnloaded(env->GetIsolate()); |
4017 } | 4009 } |
4018 | 4010 |
4019 TEST(DisableDebuggerStatement) { | 4011 TEST(DisableDebuggerStatement) { |
4020 DebugLocalContext env; | 4012 DebugLocalContext env; |
4021 v8::HandleScope scope(env->GetIsolate()); | 4013 v8::HandleScope scope(env->GetIsolate()); |
4022 | 4014 |
4023 // Register a debug event listener which sets the break flag and counts. | 4015 // Register a debug event listener which sets the break flag and counts. |
4024 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); | 4016 SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
4025 CompileRun("debugger;"); | 4017 CompileRun("debugger;"); |
4026 CHECK_EQ(1, break_point_hit_count); | 4018 CHECK_EQ(1, break_point_hit_count); |
4027 | 4019 |
4028 // Check that we ignore debugger statement when breakpoints aren't active. | 4020 // Check that we ignore debugger statement when breakpoints aren't active. |
4029 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); | 4021 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); |
4030 isolate->debug()->set_break_points_active(false); | 4022 isolate->debug()->set_break_points_active(false); |
4031 CompileRun("debugger;"); | 4023 CompileRun("debugger;"); |
4032 CHECK_EQ(1, break_point_hit_count); | 4024 CHECK_EQ(1, break_point_hit_count); |
4033 } | 4025 } |
4034 | 4026 |
4035 static const char* kSimpleExtensionSource = | 4027 static const char* kSimpleExtensionSource = |
4036 "(function Foo() {" | 4028 "(function Foo() {" |
4037 " return 4;" | 4029 " return 4;" |
4038 "})() "; | 4030 "})() "; |
4039 | 4031 |
4040 // http://crbug.com/28933 | 4032 // http://crbug.com/28933 |
4041 // Test that debug break is disabled when bootstrapper is active. | 4033 // Test that debug break is disabled when bootstrapper is active. |
4042 TEST(NoBreakWhenBootstrapping) { | 4034 TEST(NoBreakWhenBootstrapping) { |
4043 v8::Isolate* isolate = CcTest::isolate(); | 4035 v8::Isolate* isolate = CcTest::isolate(); |
4044 v8::HandleScope scope(isolate); | 4036 v8::HandleScope scope(isolate); |
4045 | 4037 |
4046 // Register a debug event listener which sets the break flag and counts. | 4038 // Register a debug event listener which sets the break flag and counts. |
4047 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter); | 4039 SetDebugEventListener(isolate, DebugEventCounter); |
4048 | 4040 |
4049 // Set the debug break flag. | 4041 // Set the debug break flag. |
4050 v8::Debug::DebugBreak(isolate); | 4042 v8::debug::DebugBreak(isolate); |
4051 break_point_hit_count = 0; | 4043 break_point_hit_count = 0; |
4052 { | 4044 { |
4053 // Create a context with an extension to make sure that some JavaScript | 4045 // Create a context with an extension to make sure that some JavaScript |
4054 // code is executed during bootstrapping. | 4046 // code is executed during bootstrapping. |
4055 v8::RegisterExtension(new v8::Extension("simpletest", | 4047 v8::RegisterExtension(new v8::Extension("simpletest", |
4056 kSimpleExtensionSource)); | 4048 kSimpleExtensionSource)); |
4057 const char* extension_names[] = { "simpletest" }; | 4049 const char* extension_names[] = { "simpletest" }; |
4058 v8::ExtensionConfiguration extensions(1, extension_names); | 4050 v8::ExtensionConfiguration extensions(1, extension_names); |
4059 v8::HandleScope handle_scope(isolate); | 4051 v8::HandleScope handle_scope(isolate); |
4060 v8::Context::New(isolate, &extensions); | 4052 v8::Context::New(isolate, &extensions); |
4061 } | 4053 } |
4062 // Check that no DebugBreak events occured during the context creation. | 4054 // Check that no DebugBreak events occured during the context creation. |
4063 CHECK_EQ(0, break_point_hit_count); | 4055 CHECK_EQ(0, break_point_hit_count); |
4064 | 4056 |
4065 // Get rid of the debug event listener. | 4057 // Get rid of the debug event listener. |
4066 v8::Debug::SetDebugEventListener(isolate, nullptr); | 4058 SetDebugEventListener(isolate, nullptr); |
4067 CheckDebuggerUnloaded(isolate); | 4059 CheckDebuggerUnloaded(isolate); |
4068 } | 4060 } |
4069 | 4061 |
4070 | 4062 |
4071 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { | 4063 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { |
4072 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); | 4064 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); |
4073 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); | 4065 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
4074 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 0), | 4066 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 0), |
4075 v8_str(info.GetIsolate(), "a")) | 4067 v8_str(info.GetIsolate(), "a")) |
4076 .FromJust()); | 4068 .FromJust()); |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4586 CHECK(CompileRun("obj_mirror.property('a').value().value() == 1") | 4578 CHECK(CompileRun("obj_mirror.property('a').value().value() == 1") |
4587 ->BooleanValue(context) | 4579 ->BooleanValue(context) |
4588 .FromJust()); | 4580 .FromJust()); |
4589 CHECK(CompileRun("obj_mirror.property('b').value().value() == 2") | 4581 CHECK(CompileRun("obj_mirror.property('b').value().value() == 2") |
4590 ->BooleanValue(context) | 4582 ->BooleanValue(context) |
4591 .FromJust()); | 4583 .FromJust()); |
4592 } | 4584 } |
4593 | 4585 |
4594 | 4586 |
4595 TEST(SetDebugEventListenerOnUninitializedVM) { | 4587 TEST(SetDebugEventListenerOnUninitializedVM) { |
4596 v8::Debug::SetDebugEventListener(CcTest::isolate(), DummyDebugEventListener); | 4588 EnableDebugger(CcTest::isolate()); |
4597 } | 4589 } |
4598 | 4590 |
4599 // Source for a JavaScript function which returns the data parameter of a | 4591 // 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 | 4592 // function called in the context of the debugger. If no data parameter is |
4601 // passed it throws an exception. | 4593 // passed it throws an exception. |
4602 static const char* debugger_call_with_data_source = | 4594 static const char* debugger_call_with_data_source = |
4603 "function debugger_call_with_data(exec_state, data) {" | 4595 "function debugger_call_with_data(exec_state, data) {" |
4604 " if (data) return data;" | 4596 " if (data) return data;" |
4605 " throw 'No data!'" | 4597 " throw 'No data!'" |
4606 "}"; | 4598 "}"; |
4607 v8::Local<v8::Function> debugger_call_with_data; | 4599 v8::Local<v8::Function> debugger_call_with_data; |
4608 | 4600 |
4609 | 4601 |
4610 // Source for a JavaScript function which returns the data parameter of a | 4602 // 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 | 4603 // function called in the context of the debugger. If no data parameter is |
4612 // passed it throws an exception. | 4604 // passed it throws an exception. |
4613 static const char* debugger_call_with_closure_source = | 4605 static const char* debugger_call_with_closure_source = |
4614 "var x = 3;" | 4606 "var x = 3;" |
4615 "(function (exec_state) {" | 4607 "(function (exec_state) {" |
4616 " if (exec_state.y) return x - 1;" | 4608 " if (exec_state.y) return x - 1;" |
4617 " exec_state.y = x;" | 4609 " exec_state.y = x;" |
4618 " return exec_state.y" | 4610 " return exec_state.y" |
4619 "})"; | 4611 "})"; |
4620 v8::Local<v8::Function> debugger_call_with_closure; | 4612 v8::Local<v8::Function> debugger_call_with_closure; |
4621 | 4613 |
4622 // Function to retrieve the number of JavaScript frames by calling a JavaScript | 4614 // Function to retrieve the number of JavaScript frames by calling a JavaScript |
4623 // in the debugger. | 4615 // in the debugger. |
4624 static void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4616 static void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4625 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | 4617 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
4626 CHECK(v8::Debug::Call(context, frame_count).ToLocalChecked()->IsNumber()); | 4618 CHECK(v8::debug::Call(context, frame_count).ToLocalChecked()->IsNumber()); |
4627 CHECK_EQ(args[0]->Int32Value(context).FromJust(), | 4619 CHECK_EQ(args[0]->Int32Value(context).FromJust(), |
4628 v8::Debug::Call(context, frame_count) | 4620 v8::debug::Call(context, frame_count) |
4629 .ToLocalChecked() | 4621 .ToLocalChecked() |
4630 ->Int32Value(context) | 4622 ->Int32Value(context) |
4631 .FromJust()); | 4623 .FromJust()); |
4632 } | 4624 } |
4633 | 4625 |
4634 | 4626 |
4635 // Function to retrieve the source line of the top JavaScript frame by calling a | 4627 // Function to retrieve the source line of the top JavaScript frame by calling a |
4636 // JavaScript function in the debugger. | 4628 // JavaScript function in the debugger. |
4637 static void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4629 static void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4638 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | 4630 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
4639 CHECK( | 4631 CHECK( |
4640 v8::Debug::Call(context, frame_source_line).ToLocalChecked()->IsNumber()); | 4632 v8::debug::Call(context, frame_source_line).ToLocalChecked()->IsNumber()); |
4641 CHECK_EQ(args[0]->Int32Value(context).FromJust(), | 4633 CHECK_EQ(args[0]->Int32Value(context).FromJust(), |
4642 v8::Debug::Call(context, frame_source_line) | 4634 v8::debug::Call(context, frame_source_line) |
4643 .ToLocalChecked() | 4635 .ToLocalChecked() |
4644 ->Int32Value(context) | 4636 ->Int32Value(context) |
4645 .FromJust()); | 4637 .FromJust()); |
4646 } | 4638 } |
4647 | 4639 |
4648 | 4640 |
4649 // Function to test passing an additional parameter to a JavaScript function | 4641 // 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 | 4642 // called in the debugger. It also tests that functions called in the debugger |
4651 // can throw exceptions. | 4643 // can throw exceptions. |
4652 static void CheckDataParameter( | 4644 static void CheckDataParameter( |
4653 const v8::FunctionCallbackInfo<v8::Value>& args) { | 4645 const v8::FunctionCallbackInfo<v8::Value>& args) { |
4654 v8::Local<v8::String> data = v8_str(args.GetIsolate(), "Test"); | 4646 v8::Local<v8::String> data = v8_str(args.GetIsolate(), "Test"); |
4655 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | 4647 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
4656 CHECK(v8::Debug::Call(context, debugger_call_with_data, data) | 4648 CHECK(v8::debug::Call(context, debugger_call_with_data, data) |
4657 .ToLocalChecked() | 4649 .ToLocalChecked() |
4658 ->IsString()); | 4650 ->IsString()); |
4659 | 4651 |
4660 for (int i = 0; i < 3; i++) { | 4652 for (int i = 0; i < 3; i++) { |
4661 v8::TryCatch catcher(args.GetIsolate()); | 4653 v8::TryCatch catcher(args.GetIsolate()); |
4662 CHECK(v8::Debug::Call(context, debugger_call_with_data).IsEmpty()); | 4654 CHECK(v8::debug::Call(context, debugger_call_with_data).IsEmpty()); |
4663 CHECK(catcher.HasCaught()); | 4655 CHECK(catcher.HasCaught()); |
4664 CHECK(catcher.Exception()->IsString()); | 4656 CHECK(catcher.Exception()->IsString()); |
4665 } | 4657 } |
4666 } | 4658 } |
4667 | 4659 |
4668 | 4660 |
4669 // Function to test using a JavaScript with closure in the debugger. | 4661 // Function to test using a JavaScript with closure in the debugger. |
4670 static void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4662 static void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4671 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | 4663 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
4672 CHECK(v8::Debug::Call(context, debugger_call_with_closure) | 4664 CHECK(v8::debug::Call(context, debugger_call_with_closure) |
4673 .ToLocalChecked() | 4665 .ToLocalChecked() |
4674 ->IsNumber()); | 4666 ->IsNumber()); |
4675 CHECK_EQ(3, v8::Debug::Call(context, debugger_call_with_closure) | 4667 CHECK_EQ(3, v8::debug::Call(context, debugger_call_with_closure) |
4676 .ToLocalChecked() | 4668 .ToLocalChecked() |
4677 ->Int32Value(context) | 4669 ->Int32Value(context) |
4678 .FromJust()); | 4670 .FromJust()); |
4679 } | 4671 } |
4680 | 4672 |
4681 | 4673 |
4682 // Test functions called through the debugger. | 4674 // Test functions called through the debugger. |
4683 TEST(CallFunctionInDebugger) { | 4675 TEST(CallFunctionInDebugger) { |
4684 // Create and enter a context with the functions CheckFrameCount, | 4676 // Create and enter a context with the functions CheckFrameCount, |
4685 // CheckSourceLine and CheckDataParameter installed. | 4677 // CheckSourceLine and CheckDataParameter installed. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4734 v8::Script::Compile(context, | 4726 v8::Script::Compile(context, |
4735 v8_str(isolate, debugger_call_with_closure_source)) | 4727 v8_str(isolate, debugger_call_with_closure_source)) |
4736 .ToLocalChecked() | 4728 .ToLocalChecked() |
4737 ->Run(context) | 4729 ->Run(context) |
4738 .ToLocalChecked()); | 4730 .ToLocalChecked()); |
4739 | 4731 |
4740 // Calling a function through the debugger returns 0 frames if there are | 4732 // Calling a function through the debugger returns 0 frames if there are |
4741 // no JavaScript frames. | 4733 // no JavaScript frames. |
4742 CHECK(v8::Integer::New(isolate, 0) | 4734 CHECK(v8::Integer::New(isolate, 0) |
4743 ->Equals(context, | 4735 ->Equals(context, |
4744 v8::Debug::Call(context, frame_count).ToLocalChecked()) | 4736 v8::debug::Call(context, frame_count).ToLocalChecked()) |
4745 .FromJust()); | 4737 .FromJust()); |
4746 | 4738 |
4747 // Test that the number of frames can be retrieved. | 4739 // Test that the number of frames can be retrieved. |
4748 v8::Script::Compile(context, v8_str(isolate, "CheckFrameCount(1)")) | 4740 v8::Script::Compile(context, v8_str(isolate, "CheckFrameCount(1)")) |
4749 .ToLocalChecked() | 4741 .ToLocalChecked() |
4750 ->Run(context) | 4742 ->Run(context) |
4751 .ToLocalChecked(); | 4743 .ToLocalChecked(); |
4752 v8::Script::Compile(context, v8_str(isolate, | 4744 v8::Script::Compile(context, v8_str(isolate, |
4753 "function f() {" | 4745 "function f() {" |
4754 " CheckFrameCount(2);" | 4746 " CheckFrameCount(2);" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4807 // Test that clearing the debug event listener actually clears all break points | 4799 // Test that clearing the debug event listener actually clears all break points |
4808 // and related information. | 4800 // and related information. |
4809 TEST(DebuggerUnload) { | 4801 TEST(DebuggerUnload) { |
4810 DebugLocalContext env; | 4802 DebugLocalContext env; |
4811 | 4803 |
4812 // Check debugger is unloaded before it is used. | 4804 // Check debugger is unloaded before it is used. |
4813 CheckDebuggerUnloaded(env->GetIsolate()); | 4805 CheckDebuggerUnloaded(env->GetIsolate()); |
4814 | 4806 |
4815 // Set a debug event listener. | 4807 // Set a debug event listener. |
4816 break_point_hit_count = 0; | 4808 break_point_hit_count = 0; |
4817 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 4809 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
4818 DebugEventBreakPointHitCount); | |
4819 v8::Local<v8::Context> context = env.context(); | 4810 v8::Local<v8::Context> context = env.context(); |
4820 { | 4811 { |
4821 v8::HandleScope scope(env->GetIsolate()); | 4812 v8::HandleScope scope(env->GetIsolate()); |
4822 // Create a couple of functions for the test. | 4813 // Create a couple of functions for the test. |
4823 v8::Local<v8::Function> foo = | 4814 v8::Local<v8::Function> foo = |
4824 CompileFunction(&env, "function foo(){x=1}", "foo"); | 4815 CompileFunction(&env, "function foo(){x=1}", "foo"); |
4825 v8::Local<v8::Function> bar = | 4816 v8::Local<v8::Function> bar = |
4826 CompileFunction(&env, "function bar(){y=2}", "bar"); | 4817 CompileFunction(&env, "function bar(){y=2}", "bar"); |
4827 | 4818 |
4828 // Set some break points. | 4819 // Set some break points. |
4829 SetBreakPoint(foo, 0); | 4820 SetBreakPoint(foo, 0); |
4830 SetBreakPoint(foo, 4); | 4821 SetBreakPoint(foo, 4); |
4831 SetBreakPoint(bar, 0); | 4822 SetBreakPoint(bar, 0); |
4832 SetBreakPoint(bar, 4); | 4823 SetBreakPoint(bar, 4); |
4833 | 4824 |
4834 // Make sure that the break points are there. | 4825 // Make sure that the break points are there. |
4835 break_point_hit_count = 0; | 4826 break_point_hit_count = 0; |
4836 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4827 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
4837 CHECK_EQ(2, break_point_hit_count); | 4828 CHECK_EQ(2, break_point_hit_count); |
4838 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4829 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
4839 CHECK_EQ(4, break_point_hit_count); | 4830 CHECK_EQ(4, break_point_hit_count); |
4840 } | 4831 } |
4841 | 4832 |
4842 // Remove the debug event listener without clearing breakpoints. Do this | 4833 // Remove the debug event listener without clearing breakpoints. Do this |
4843 // outside a handle scope. | 4834 // outside a handle scope. |
4844 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 4835 SetDebugEventListener(env->GetIsolate(), nullptr); |
4845 CheckDebuggerUnloaded(env->GetIsolate(), true); | 4836 CheckDebuggerUnloaded(env->GetIsolate(), true); |
4846 } | 4837 } |
4847 | 4838 |
4848 int event_listener_hit_count = 0; | 4839 int event_listener_hit_count = 0; |
4849 | 4840 |
4850 // Debugger event listener which clears itself while active. | 4841 // Debugger event listener which clears itself while active. |
4851 static void EventListenerClearingItself( | 4842 static void EventListenerClearingItself( |
4852 const v8::Debug::EventDetails& details) { | 4843 const v8::Debug::EventDetails& details) { |
4853 event_listener_hit_count++; | 4844 event_listener_hit_count++; |
4854 | 4845 |
4855 // Clear debug event listener. | 4846 // Clear debug event listener. |
4856 v8::Debug::SetDebugEventListener(details.GetIsolate(), nullptr); | 4847 SetDebugEventListener(details.GetIsolate(), nullptr); |
4857 } | 4848 } |
4858 | 4849 |
4859 | 4850 |
4860 // Test clearing the debug message handler while processing a debug event. | 4851 // Test clearing the debug message handler while processing a debug event. |
4861 TEST(DebuggerClearEventListenerWhileActive) { | 4852 TEST(DebuggerClearEventListenerWhileActive) { |
4862 DebugLocalContext env; | 4853 DebugLocalContext env; |
4863 v8::HandleScope scope(env->GetIsolate()); | 4854 v8::HandleScope scope(env->GetIsolate()); |
4864 | 4855 |
4865 // Check debugger is unloaded before it is used. | 4856 // Check debugger is unloaded before it is used. |
4866 CheckDebuggerUnloaded(env->GetIsolate()); | 4857 CheckDebuggerUnloaded(env->GetIsolate()); |
4867 | 4858 |
4868 // Set a debug event listener. | 4859 // Set a debug event listener. |
4869 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 4860 SetDebugEventListener(env->GetIsolate(), EventListenerClearingItself); |
4870 EventListenerClearingItself); | |
4871 | 4861 |
4872 // Run code to throw an uncaught exception. This should trigger the listener. | 4862 // Run code to throw an uncaught exception. This should trigger the listener. |
4873 CompileRun("throw 1"); | 4863 CompileRun("throw 1"); |
4874 | 4864 |
4875 // The event listener should have been called. | 4865 // The event listener should have been called. |
4876 CHECK_EQ(1, event_listener_hit_count); | 4866 CHECK_EQ(1, event_listener_hit_count); |
4877 | 4867 |
4878 CheckDebuggerUnloaded(env->GetIsolate(), true); | 4868 CheckDebuggerUnloaded(env->GetIsolate(), true); |
4879 } | 4869 } |
4880 | 4870 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4941 DebugLocalContext env; | 4931 DebugLocalContext env; |
4942 v8::HandleScope scope(env->GetIsolate()); | 4932 v8::HandleScope scope(env->GetIsolate()); |
4943 env.ExposeDebug(); | 4933 env.ExposeDebug(); |
4944 | 4934 |
4945 // Create functions for retrieving script name and data for the function on | 4935 // Create functions for retrieving script name and data for the function on |
4946 // the top frame when hitting a break point. | 4936 // the top frame when hitting a break point. |
4947 frame_script_name = CompileFunction(&env, | 4937 frame_script_name = CompileFunction(&env, |
4948 frame_script_name_source, | 4938 frame_script_name_source, |
4949 "frame_script_name"); | 4939 "frame_script_name"); |
4950 | 4940 |
4951 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 4941 SetDebugEventListener(env->GetIsolate(), DebugEventBreakPointHitCount); |
4952 DebugEventBreakPointHitCount); | |
4953 | 4942 |
4954 v8::Local<v8::Context> context = env.context(); | 4943 v8::Local<v8::Context> context = env.context(); |
4955 // Test function source. | 4944 // Test function source. |
4956 v8::Local<v8::String> script = v8_str(env->GetIsolate(), | 4945 v8::Local<v8::String> script = v8_str(env->GetIsolate(), |
4957 "function f() {\n" | 4946 "function f() {\n" |
4958 " debugger;\n" | 4947 " debugger;\n" |
4959 "}\n"); | 4948 "}\n"); |
4960 | 4949 |
4961 v8::ScriptOrigin origin1 = | 4950 v8::ScriptOrigin origin1 = |
4962 v8::ScriptOrigin(v8_str(env->GetIsolate(), "name")); | 4951 v8::ScriptOrigin(v8_str(env->GetIsolate(), "name")); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5045 | 5034 |
5046 // Create two contexts. | 5035 // Create two contexts. |
5047 v8::Local<v8::Context> context_1; | 5036 v8::Local<v8::Context> context_1; |
5048 v8::Local<v8::Context> context_2; | 5037 v8::Local<v8::Context> context_2; |
5049 v8::Local<v8::ObjectTemplate> global_template = | 5038 v8::Local<v8::ObjectTemplate> global_template = |
5050 v8::Local<v8::ObjectTemplate>(); | 5039 v8::Local<v8::ObjectTemplate>(); |
5051 v8::Local<v8::Value> global_object = v8::Local<v8::Value>(); | 5040 v8::Local<v8::Value> global_object = v8::Local<v8::Value>(); |
5052 context_1 = v8::Context::New(isolate, NULL, global_template, global_object); | 5041 context_1 = v8::Context::New(isolate, NULL, global_template, global_object); |
5053 context_2 = v8::Context::New(isolate, NULL, global_template, global_object); | 5042 context_2 = v8::Context::New(isolate, NULL, global_template, global_object); |
5054 | 5043 |
5055 v8::Debug::SetDebugEventListener(isolate, ContextCheckEventListener); | 5044 SetDebugEventListener(isolate, ContextCheckEventListener); |
5056 | 5045 |
5057 // Default data value is undefined. | 5046 // Default data value is undefined. |
5058 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); | 5047 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); |
5059 CHECK(context_2->GetEmbedderData(0)->IsUndefined()); | 5048 CHECK(context_2->GetEmbedderData(0)->IsUndefined()); |
5060 | 5049 |
5061 // Set and check different data values. | 5050 // Set and check different data values. |
5062 v8::Local<v8::String> data_1 = v8_str(isolate, "1"); | 5051 v8::Local<v8::String> data_1 = v8_str(isolate, "1"); |
5063 v8::Local<v8::String> data_2 = v8_str(isolate, "2"); | 5052 v8::Local<v8::String> data_2 = v8_str(isolate, "2"); |
5064 context_1->SetEmbedderData(0, data_1); | 5053 context_1->SetEmbedderData(0, data_1); |
5065 context_2->SetEmbedderData(0, data_2); | 5054 context_2->SetEmbedderData(0, data_2); |
(...skipping 18 matching lines...) Expand all Loading... |
5084 v8::Context::Scope context_scope(context_2); | 5073 v8::Context::Scope context_scope(context_2); |
5085 expected_context = context_2; | 5074 expected_context = context_2; |
5086 expected_context_data = data_2; | 5075 expected_context_data = data_2; |
5087 v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); | 5076 v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); |
5088 f->Call(context_2, context_2->Global(), 0, NULL).ToLocalChecked(); | 5077 f->Call(context_2, context_2->Global(), 0, NULL).ToLocalChecked(); |
5089 } | 5078 } |
5090 | 5079 |
5091 // Two times compile event and two times break event. | 5080 // Two times compile event and two times break event. |
5092 CHECK_GT(event_listener_hit_count, 3); | 5081 CHECK_GT(event_listener_hit_count, 3); |
5093 | 5082 |
5094 v8::Debug::SetDebugEventListener(isolate, nullptr); | 5083 SetDebugEventListener(isolate, nullptr); |
5095 CheckDebuggerUnloaded(isolate); | 5084 CheckDebuggerUnloaded(isolate); |
5096 } | 5085 } |
5097 | 5086 |
5098 // Debug event listener which issues a debug break when it hits a break event. | 5087 // Debug event listener which issues a debug break when it hits a break event. |
5099 static int event_listener_break_hit_count = 0; | 5088 static int event_listener_break_hit_count = 0; |
5100 static void DebugBreakEventListener(const v8::Debug::EventDetails& details) { | 5089 static void DebugBreakEventListener(const v8::Debug::EventDetails& details) { |
5101 // Schedule a debug break for break events. | 5090 // Schedule a debug break for break events. |
5102 if (details.GetEvent() == v8::Break) { | 5091 if (details.GetEvent() == v8::Break) { |
5103 event_listener_break_hit_count++; | 5092 event_listener_break_hit_count++; |
5104 if (event_listener_break_hit_count == 1) { | 5093 if (event_listener_break_hit_count == 1) { |
5105 v8::Debug::DebugBreak(details.GetIsolate()); | 5094 v8::debug::DebugBreak(details.GetIsolate()); |
5106 } | 5095 } |
5107 } | 5096 } |
5108 } | 5097 } |
5109 | 5098 |
5110 // Test that a debug break can be scheduled while in a event listener. | 5099 // Test that a debug break can be scheduled while in a event listener. |
5111 TEST(DebugBreakInEventListener) { | 5100 TEST(DebugBreakInEventListener) { |
5112 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f. | 5101 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f. |
5113 DebugLocalContext env; | 5102 DebugLocalContext env; |
5114 v8::HandleScope scope(env->GetIsolate()); | 5103 v8::HandleScope scope(env->GetIsolate()); |
5115 | 5104 |
5116 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakEventListener); | 5105 SetDebugEventListener(env->GetIsolate(), DebugBreakEventListener); |
5117 | 5106 |
5118 v8::Local<v8::Context> context = env.context(); | 5107 v8::Local<v8::Context> context = env.context(); |
5119 // Test functions. | 5108 // Test functions. |
5120 const char* script = "function f() { debugger; g(); } function g() { }"; | 5109 const char* script = "function f() { debugger; g(); } function g() { }"; |
5121 CompileRun(script); | 5110 CompileRun(script); |
5122 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 5111 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
5123 env->Global() | 5112 env->Global() |
5124 ->Get(context, v8_str(env->GetIsolate(), "f")) | 5113 ->Get(context, v8_str(env->GetIsolate(), "f")) |
5125 .ToLocalChecked()); | 5114 .ToLocalChecked()); |
5126 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 5115 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5163 } else { | 5152 } else { |
5164 CHECK(result->IsString()); | 5153 CHECK(result->IsString()); |
5165 v8::Local<v8::String> function_name( | 5154 v8::Local<v8::String> function_name( |
5166 result->ToString(context).ToLocalChecked()); | 5155 result->ToString(context).ToLocalChecked()); |
5167 function_name->WriteUtf8(last_function_hit); | 5156 function_name->WriteUtf8(last_function_hit); |
5168 } | 5157 } |
5169 } | 5158 } |
5170 | 5159 |
5171 // Keep forcing breaks. | 5160 // Keep forcing breaks. |
5172 if (break_point_hit_count < 20) { | 5161 if (break_point_hit_count < 20) { |
5173 v8::Debug::DebugBreak(CcTest::isolate()); | 5162 v8::debug::DebugBreak(CcTest::isolate()); |
5174 } | 5163 } |
5175 } | 5164 } |
5176 } | 5165 } |
5177 | 5166 |
5178 | 5167 |
5179 TEST(RegExpDebugBreak) { | 5168 TEST(RegExpDebugBreak) { |
5180 // This test only applies to native regexps. | 5169 // This test only applies to native regexps. |
5181 DebugLocalContext env; | 5170 DebugLocalContext env; |
5182 v8::HandleScope scope(env->GetIsolate()); | 5171 v8::HandleScope scope(env->GetIsolate()); |
5183 v8::Local<v8::Context> context = env.context(); | 5172 v8::Local<v8::Context> context = env.context(); |
5184 // Create a function for checking the function when hitting a break point. | 5173 // Create a function for checking the function when hitting a break point. |
5185 frame_function_name = CompileFunction(&env, | 5174 frame_function_name = CompileFunction(&env, |
5186 frame_function_name_source, | 5175 frame_function_name_source, |
5187 "frame_function_name"); | 5176 "frame_function_name"); |
5188 | 5177 |
5189 // Test RegExp which matches white spaces and comments at the begining of a | 5178 // Test RegExp which matches white spaces and comments at the begining of a |
5190 // source line. | 5179 // source line. |
5191 const char* script = | 5180 const char* script = |
5192 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" | 5181 "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" |
5193 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; | 5182 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; |
5194 | 5183 |
5195 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); | 5184 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); |
5196 const int argc = 1; | 5185 const int argc = 1; |
5197 v8::Local<v8::Value> argv[argc] = { | 5186 v8::Local<v8::Value> argv[argc] = { |
5198 v8_str(env->GetIsolate(), " /* xxx */ a=0;")}; | 5187 v8_str(env->GetIsolate(), " /* xxx */ a=0;")}; |
5199 v8::Local<v8::Value> result = | 5188 v8::Local<v8::Value> result = |
5200 f->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 5189 f->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
5201 CHECK_EQ(12, result->Int32Value(context).FromJust()); | 5190 CHECK_EQ(12, result->Int32Value(context).FromJust()); |
5202 | 5191 |
5203 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak); | 5192 SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak); |
5204 v8::Debug::DebugBreak(env->GetIsolate()); | 5193 v8::debug::DebugBreak(env->GetIsolate()); |
5205 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 5194 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
5206 | 5195 |
5207 // Check that there was only one break event. Matching RegExp should not | 5196 // Check that there was only one break event. Matching RegExp should not |
5208 // cause Break events. | 5197 // cause Break events. |
5209 CHECK_EQ(1, break_point_hit_count); | 5198 CHECK_EQ(1, break_point_hit_count); |
5210 CHECK_EQ(0, strcmp("f", last_function_hit)); | 5199 CHECK_EQ(0, strcmp("f", last_function_hit)); |
5211 } | 5200 } |
5212 #endif // V8_INTERPRETED_REGEXP | 5201 #endif // V8_INTERPRETED_REGEXP |
5213 | 5202 |
5214 // Test which creates a context and sets embedder data on it. Checks that this | 5203 // Test which creates a context and sets embedder data on it. Checks that this |
5215 // data is set correctly and that when the debug event listener is called for | 5204 // data is set correctly and that when the debug event listener is called for |
5216 // break event in an eval statement the expected context is the one returned by | 5205 // break event in an eval statement the expected context is the one returned by |
5217 // Message.GetEventContext. | 5206 // Message.GetEventContext. |
5218 TEST(EvalContextData) { | 5207 TEST(EvalContextData) { |
5219 v8::HandleScope scope(CcTest::isolate()); | 5208 v8::HandleScope scope(CcTest::isolate()); |
5220 | 5209 |
5221 v8::Local<v8::Context> context_1; | 5210 v8::Local<v8::Context> context_1; |
5222 v8::Local<v8::ObjectTemplate> global_template = | 5211 v8::Local<v8::ObjectTemplate> global_template = |
5223 v8::Local<v8::ObjectTemplate>(); | 5212 v8::Local<v8::ObjectTemplate>(); |
5224 context_1 = | 5213 context_1 = |
5225 v8::Context::New(CcTest::isolate(), NULL, global_template); | 5214 v8::Context::New(CcTest::isolate(), NULL, global_template); |
5226 | 5215 |
5227 v8::Debug::SetDebugEventListener(CcTest::isolate(), | 5216 SetDebugEventListener(CcTest::isolate(), ContextCheckEventListener); |
5228 ContextCheckEventListener); | |
5229 | 5217 |
5230 // Default data value is undefined. | 5218 // Default data value is undefined. |
5231 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); | 5219 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); |
5232 | 5220 |
5233 // Set and check a data value. | 5221 // Set and check a data value. |
5234 v8::Local<v8::String> data_1 = v8_str(CcTest::isolate(), "1"); | 5222 v8::Local<v8::String> data_1 = v8_str(CcTest::isolate(), "1"); |
5235 context_1->SetEmbedderData(0, data_1); | 5223 context_1->SetEmbedderData(0, data_1); |
5236 CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); | 5224 CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); |
5237 | 5225 |
5238 // Simple test function with eval that causes a break. | 5226 // Simple test function with eval that causes a break. |
5239 const char* source = "function f() { eval('debugger;'); }"; | 5227 const char* source = "function f() { eval('debugger;'); }"; |
5240 | 5228 |
5241 // Enter and run function in the context. | 5229 // Enter and run function in the context. |
5242 { | 5230 { |
5243 v8::Context::Scope context_scope(context_1); | 5231 v8::Context::Scope context_scope(context_1); |
5244 expected_context = context_1; | 5232 expected_context = context_1; |
5245 expected_context_data = data_1; | 5233 expected_context_data = data_1; |
5246 v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f"); | 5234 v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f"); |
5247 f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked(); | 5235 f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked(); |
5248 } | 5236 } |
5249 | 5237 |
5250 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); | 5238 SetDebugEventListener(CcTest::isolate(), nullptr); |
5251 | 5239 |
5252 // One time compile event and one time break event. | 5240 // One time compile event and one time break event. |
5253 CHECK_GT(event_listener_hit_count, 2); | 5241 CHECK_GT(event_listener_hit_count, 2); |
5254 CheckDebuggerUnloaded(CcTest::isolate()); | 5242 CheckDebuggerUnloaded(CcTest::isolate()); |
5255 } | 5243 } |
5256 | 5244 |
5257 | 5245 |
5258 // Debug event listener which counts the after compile events. | 5246 // Debug event listener which counts the after compile events. |
5259 int after_compile_event_count = 0; | 5247 int after_compile_event_count = 0; |
5260 static void AfterCompileEventListener(const v8::Debug::EventDetails& details) { | 5248 static void AfterCompileEventListener(const v8::Debug::EventDetails& details) { |
5261 // Count the number of scripts collected. | 5249 // Count the number of scripts collected. |
5262 if (details.GetEvent() == v8::AfterCompile) { | 5250 if (details.GetEvent() == v8::AfterCompile) { |
5263 after_compile_event_count++; | 5251 after_compile_event_count++; |
5264 } | 5252 } |
5265 } | 5253 } |
5266 | 5254 |
5267 | 5255 |
5268 // Tests that after compile event is sent as many times as there are scripts | 5256 // Tests that after compile event is sent as many times as there are scripts |
5269 // compiled. | 5257 // compiled. |
5270 TEST(AfterCompileEventWhenEventListenerIsReset) { | 5258 TEST(AfterCompileEventWhenEventListenerIsReset) { |
5271 DebugLocalContext env; | 5259 DebugLocalContext env; |
5272 v8::HandleScope scope(env->GetIsolate()); | 5260 v8::HandleScope scope(env->GetIsolate()); |
5273 v8::Local<v8::Context> context = env.context(); | 5261 v8::Local<v8::Context> context = env.context(); |
5274 const char* script = "var a=1"; | 5262 const char* script = "var a=1"; |
5275 | 5263 |
5276 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5264 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5277 AfterCompileEventListener); | |
5278 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 5265 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
5279 .ToLocalChecked() | 5266 .ToLocalChecked() |
5280 ->Run(context) | 5267 ->Run(context) |
5281 .ToLocalChecked(); | 5268 .ToLocalChecked(); |
5282 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5269 SetDebugEventListener(env->GetIsolate(), nullptr); |
5283 | 5270 |
5284 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5271 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5285 AfterCompileEventListener); | 5272 v8::debug::DebugBreak(env->GetIsolate()); |
5286 v8::Debug::DebugBreak(env->GetIsolate()); | |
5287 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 5273 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
5288 .ToLocalChecked() | 5274 .ToLocalChecked() |
5289 ->Run(context) | 5275 ->Run(context) |
5290 .ToLocalChecked(); | 5276 .ToLocalChecked(); |
5291 | 5277 |
5292 // Setting listener to NULL should cause debugger unload. | 5278 // Setting listener to NULL should cause debugger unload. |
5293 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5279 SetDebugEventListener(env->GetIsolate(), nullptr); |
5294 CheckDebuggerUnloaded(env->GetIsolate()); | 5280 CheckDebuggerUnloaded(env->GetIsolate()); |
5295 | 5281 |
5296 // Compilation cache should be disabled when debugger is active. | 5282 // Compilation cache should be disabled when debugger is active. |
5297 CHECK_EQ(2, after_compile_event_count); | 5283 CHECK_EQ(2, after_compile_event_count); |
5298 } | 5284 } |
5299 | 5285 |
5300 | 5286 |
5301 // Syntax error event handler which counts a number of events. | 5287 // Syntax error event handler which counts a number of events. |
5302 int compile_error_event_count = 0; | 5288 int compile_error_event_count = 0; |
5303 | 5289 |
(...skipping 13 matching lines...) Expand all Loading... |
5317 | 5303 |
5318 // Tests that syntax error event is sent as many times as there are scripts | 5304 // Tests that syntax error event is sent as many times as there are scripts |
5319 // with syntax error compiled. | 5305 // with syntax error compiled. |
5320 TEST(SyntaxErrorEventOnSyntaxException) { | 5306 TEST(SyntaxErrorEventOnSyntaxException) { |
5321 DebugLocalContext env; | 5307 DebugLocalContext env; |
5322 v8::HandleScope scope(env->GetIsolate()); | 5308 v8::HandleScope scope(env->GetIsolate()); |
5323 | 5309 |
5324 // For this test, we want to break on uncaught exceptions: | 5310 // For this test, we want to break on uncaught exceptions: |
5325 ChangeBreakOnException(false, true); | 5311 ChangeBreakOnException(false, true); |
5326 | 5312 |
5327 v8::Debug::SetDebugEventListener(env->GetIsolate(), CompileErrorEventCounter); | 5313 SetDebugEventListener(env->GetIsolate(), CompileErrorEventCounter); |
5328 v8::Local<v8::Context> context = env.context(); | 5314 v8::Local<v8::Context> context = env.context(); |
5329 | 5315 |
5330 CompileErrorEventCounterClear(); | 5316 CompileErrorEventCounterClear(); |
5331 | 5317 |
5332 // Check initial state. | 5318 // Check initial state. |
5333 CHECK_EQ(0, compile_error_event_count); | 5319 CHECK_EQ(0, compile_error_event_count); |
5334 | 5320 |
5335 // Throws SyntaxError: Unexpected end of input | 5321 // Throws SyntaxError: Unexpected end of input |
5336 CHECK( | 5322 CHECK( |
5337 v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty()); | 5323 v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty()); |
(...skipping 21 matching lines...) Expand all Loading... |
5359 CHECK_EQ(3, compile_error_event_count); | 5345 CHECK_EQ(3, compile_error_event_count); |
5360 } | 5346 } |
5361 | 5347 |
5362 // Tests that break event is sent when event listener is reset. | 5348 // Tests that break event is sent when event listener is reset. |
5363 TEST(BreakEventWhenEventListenerIsReset) { | 5349 TEST(BreakEventWhenEventListenerIsReset) { |
5364 DebugLocalContext env; | 5350 DebugLocalContext env; |
5365 v8::HandleScope scope(env->GetIsolate()); | 5351 v8::HandleScope scope(env->GetIsolate()); |
5366 v8::Local<v8::Context> context = env.context(); | 5352 v8::Local<v8::Context> context = env.context(); |
5367 const char* script = "function f() {};"; | 5353 const char* script = "function f() {};"; |
5368 | 5354 |
5369 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5355 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5370 AfterCompileEventListener); | |
5371 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 5356 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
5372 .ToLocalChecked() | 5357 .ToLocalChecked() |
5373 ->Run(context) | 5358 ->Run(context) |
5374 .ToLocalChecked(); | 5359 .ToLocalChecked(); |
5375 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5360 SetDebugEventListener(env->GetIsolate(), nullptr); |
5376 | 5361 |
5377 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5362 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5378 AfterCompileEventListener); | 5363 v8::debug::DebugBreak(env->GetIsolate()); |
5379 v8::Debug::DebugBreak(env->GetIsolate()); | |
5380 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 5364 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
5381 env->Global() | 5365 env->Global() |
5382 ->Get(context, v8_str(env->GetIsolate(), "f")) | 5366 ->Get(context, v8_str(env->GetIsolate(), "f")) |
5383 .ToLocalChecked()); | 5367 .ToLocalChecked()); |
5384 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 5368 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
5385 | 5369 |
5386 // Setting event listener to NULL should cause debugger unload. | 5370 // Setting event listener to NULL should cause debugger unload. |
5387 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5371 SetDebugEventListener(env->GetIsolate(), nullptr); |
5388 CheckDebuggerUnloaded(env->GetIsolate()); | 5372 CheckDebuggerUnloaded(env->GetIsolate()); |
5389 | 5373 |
5390 // Compilation cache should be disabled when debugger is active. | 5374 // Compilation cache should be disabled when debugger is active. |
5391 CHECK_EQ(1, after_compile_event_count); | 5375 CHECK_EQ(1, after_compile_event_count); |
5392 } | 5376 } |
5393 | 5377 |
5394 | 5378 |
5395 static int exception_event_count = 0; | 5379 static int exception_event_count = 0; |
5396 static void ExceptionEventListener(const v8::Debug::EventDetails& details) { | 5380 static void ExceptionEventListener(const v8::Debug::EventDetails& details) { |
5397 if (details.GetEvent() == v8::Exception) exception_event_count++; | 5381 if (details.GetEvent() == v8::Exception) exception_event_count++; |
5398 } | 5382 } |
5399 | 5383 |
5400 // Tests that exception event is sent when event listener is reset. | 5384 // Tests that exception event is sent when event listener is reset. |
5401 TEST(ExceptionEventWhenEventListenerIsReset) { | 5385 TEST(ExceptionEventWhenEventListenerIsReset) { |
5402 DebugLocalContext env; | 5386 DebugLocalContext env; |
5403 v8::HandleScope scope(env->GetIsolate()); | 5387 v8::HandleScope scope(env->GetIsolate()); |
5404 | 5388 |
5405 v8::Local<v8::Context> context = env.context(); | 5389 v8::Local<v8::Context> context = env.context(); |
5406 // For this test, we want to break on uncaught exceptions: | 5390 // For this test, we want to break on uncaught exceptions: |
5407 ChangeBreakOnException(false, true); | 5391 ChangeBreakOnException(false, true); |
5408 | 5392 |
5409 exception_event_count = 0; | 5393 exception_event_count = 0; |
5410 const char* script = "function f() {throw new Error()};"; | 5394 const char* script = "function f() {throw new Error()};"; |
5411 | 5395 |
5412 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5396 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5413 AfterCompileEventListener); | |
5414 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 5397 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
5415 .ToLocalChecked() | 5398 .ToLocalChecked() |
5416 ->Run(context) | 5399 ->Run(context) |
5417 .ToLocalChecked(); | 5400 .ToLocalChecked(); |
5418 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5401 SetDebugEventListener(env->GetIsolate(), nullptr); |
5419 | 5402 |
5420 v8::Debug::SetDebugEventListener(env->GetIsolate(), ExceptionEventListener); | 5403 SetDebugEventListener(env->GetIsolate(), ExceptionEventListener); |
5421 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 5404 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
5422 env->Global() | 5405 env->Global() |
5423 ->Get(context, v8_str(env->GetIsolate(), "f")) | 5406 ->Get(context, v8_str(env->GetIsolate(), "f")) |
5424 .ToLocalChecked()); | 5407 .ToLocalChecked()); |
5425 CHECK(f->Call(context, env->Global(), 0, NULL).IsEmpty()); | 5408 CHECK(f->Call(context, env->Global(), 0, NULL).IsEmpty()); |
5426 | 5409 |
5427 // Setting event listener to NULL should cause debugger unload. | 5410 // Setting event listener to NULL should cause debugger unload. |
5428 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5411 SetDebugEventListener(env->GetIsolate(), nullptr); |
5429 CheckDebuggerUnloaded(env->GetIsolate()); | 5412 CheckDebuggerUnloaded(env->GetIsolate()); |
5430 | 5413 |
5431 CHECK_EQ(1, exception_event_count); | 5414 CHECK_EQ(1, exception_event_count); |
5432 } | 5415 } |
5433 | 5416 |
5434 | 5417 |
5435 // Tests after compile event is sent when there are some provisional | 5418 // Tests after compile event is sent when there are some provisional |
5436 // breakpoints out of the scripts lines range. | 5419 // breakpoints out of the scripts lines range. |
5437 TEST(ProvisionalBreakpointOnLineOutOfRange) { | 5420 TEST(ProvisionalBreakpointOnLineOutOfRange) { |
5438 DebugLocalContext env; | 5421 DebugLocalContext env; |
5439 v8::HandleScope scope(env->GetIsolate()); | 5422 v8::HandleScope scope(env->GetIsolate()); |
5440 env.ExposeDebug(); | 5423 env.ExposeDebug(); |
5441 const char* script = "function f() {};"; | 5424 const char* script = "function f() {};"; |
5442 const char* resource_name = "test_resource"; | 5425 const char* resource_name = "test_resource"; |
5443 | 5426 |
5444 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5427 SetDebugEventListener(env->GetIsolate(), AfterCompileEventListener); |
5445 AfterCompileEventListener); | |
5446 v8::Local<v8::Context> context = env.context(); | 5428 v8::Local<v8::Context> context = env.context(); |
5447 | 5429 |
5448 // Set a couple of provisional breakpoint on lines out of the script lines | 5430 // Set a couple of provisional breakpoint on lines out of the script lines |
5449 // range. | 5431 // range. |
5450 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, | 5432 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, |
5451 3, -1 /* no column */); | 5433 3, -1 /* no column */); |
5452 int sbp2 = | 5434 int sbp2 = |
5453 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); | 5435 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); |
5454 | 5436 |
5455 after_compile_event_count = 0; | 5437 after_compile_event_count = 0; |
5456 | 5438 |
5457 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), resource_name), | 5439 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), resource_name), |
5458 v8::Integer::New(env->GetIsolate(), 10), | 5440 v8::Integer::New(env->GetIsolate(), 10), |
5459 v8::Integer::New(env->GetIsolate(), 1)); | 5441 v8::Integer::New(env->GetIsolate(), 1)); |
5460 // Compile a script whose first line number is greater than the breakpoints' | 5442 // Compile a script whose first line number is greater than the breakpoints' |
5461 // lines. | 5443 // lines. |
5462 v8::Script::Compile(context, v8_str(env->GetIsolate(), script), &origin) | 5444 v8::Script::Compile(context, v8_str(env->GetIsolate(), script), &origin) |
5463 .ToLocalChecked() | 5445 .ToLocalChecked() |
5464 ->Run(context) | 5446 ->Run(context) |
5465 .ToLocalChecked(); | 5447 .ToLocalChecked(); |
5466 | 5448 |
5467 // If the script is compiled successfully there is exactly one after compile | 5449 // If the script is compiled successfully there is exactly one after compile |
5468 // event. In case of an exception in debugger code after compile event is not | 5450 // event. In case of an exception in debugger code after compile event is not |
5469 // sent. | 5451 // sent. |
5470 CHECK_EQ(1, after_compile_event_count); | 5452 CHECK_EQ(1, after_compile_event_count); |
5471 | 5453 |
5472 ClearBreakPointFromJS(env->GetIsolate(), sbp1); | 5454 ClearBreakPointFromJS(env->GetIsolate(), sbp1); |
5473 ClearBreakPointFromJS(env->GetIsolate(), sbp2); | 5455 ClearBreakPointFromJS(env->GetIsolate(), sbp2); |
5474 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5456 SetDebugEventListener(env->GetIsolate(), nullptr); |
5475 CheckDebuggerUnloaded(env->GetIsolate()); | 5457 CheckDebuggerUnloaded(env->GetIsolate()); |
5476 } | 5458 } |
5477 | 5459 |
5478 static void BreakEventListener(const v8::Debug::EventDetails& details) { | 5460 static void BreakEventListener(const v8::Debug::EventDetails& details) { |
5479 if (details.GetEvent() == v8::Break) break_point_hit_count++; | 5461 if (details.GetEvent() == v8::Break) break_point_hit_count++; |
5480 } | 5462 } |
5481 | 5463 |
5482 | 5464 |
5483 // Test that if DebugBreak is forced it is ignored when code from | 5465 // Test that if DebugBreak is forced it is ignored when code from |
5484 // debug-delay.js is executed. | 5466 // debug-delay.js is executed. |
5485 TEST(NoDebugBreakInAfterCompileEventListener) { | 5467 TEST(NoDebugBreakInAfterCompileEventListener) { |
5486 DebugLocalContext env; | 5468 DebugLocalContext env; |
5487 v8::HandleScope scope(env->GetIsolate()); | 5469 v8::HandleScope scope(env->GetIsolate()); |
5488 v8::Local<v8::Context> context = env.context(); | 5470 v8::Local<v8::Context> context = env.context(); |
5489 | 5471 |
5490 // Register a debug event listener which sets the break flag and counts. | 5472 // Register a debug event listener which sets the break flag and counts. |
5491 v8::Debug::SetDebugEventListener(env->GetIsolate(), BreakEventListener); | 5473 SetDebugEventListener(env->GetIsolate(), BreakEventListener); |
5492 | 5474 |
5493 // Set the debug break flag. | 5475 // Set the debug break flag. |
5494 v8::Debug::DebugBreak(env->GetIsolate()); | 5476 v8::debug::DebugBreak(env->GetIsolate()); |
5495 | 5477 |
5496 // Create a function for testing stepping. | 5478 // Create a function for testing stepping. |
5497 const char* src = "function f() { eval('var x = 10;'); } "; | 5479 const char* src = "function f() { eval('var x = 10;'); } "; |
5498 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 5480 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
5499 | 5481 |
5500 // There should be only one break event. | 5482 // There should be only one break event. |
5501 CHECK_EQ(1, break_point_hit_count); | 5483 CHECK_EQ(1, break_point_hit_count); |
5502 | 5484 |
5503 // Set the debug break flag again. | 5485 // Set the debug break flag again. |
5504 v8::Debug::DebugBreak(env->GetIsolate()); | 5486 v8::debug::DebugBreak(env->GetIsolate()); |
5505 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 5487 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
5506 // There should be one more break event when the script is evaluated in 'f'. | 5488 // There should be one more break event when the script is evaluated in 'f'. |
5507 CHECK_EQ(2, break_point_hit_count); | 5489 CHECK_EQ(2, break_point_hit_count); |
5508 | 5490 |
5509 // Get rid of the debug event listener. | 5491 // Get rid of the debug event listener. |
5510 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5492 SetDebugEventListener(env->GetIsolate(), nullptr); |
5511 CheckDebuggerUnloaded(env->GetIsolate()); | 5493 CheckDebuggerUnloaded(env->GetIsolate()); |
5512 } | 5494 } |
5513 | 5495 |
5514 | 5496 |
5515 // Test that the debug break flag works with function.apply. | 5497 // Test that the debug break flag works with function.apply. |
5516 TEST(DebugBreakFunctionApply) { | 5498 TEST(DebugBreakFunctionApply) { |
5517 DebugLocalContext env; | 5499 DebugLocalContext env; |
5518 v8::HandleScope scope(env->GetIsolate()); | 5500 v8::HandleScope scope(env->GetIsolate()); |
5519 v8::Local<v8::Context> context = env.context(); | 5501 v8::Local<v8::Context> context = env.context(); |
5520 | 5502 |
5521 // Create a function for testing breaking in apply. | 5503 // Create a function for testing breaking in apply. |
5522 v8::Local<v8::Function> foo = CompileFunction( | 5504 v8::Local<v8::Function> foo = CompileFunction( |
5523 &env, | 5505 &env, |
5524 "function baz(x) { }" | 5506 "function baz(x) { }" |
5525 "function bar(x) { baz(); }" | 5507 "function bar(x) { baz(); }" |
5526 "function foo(){ bar.apply(this, [1]); }", | 5508 "function foo(){ bar.apply(this, [1]); }", |
5527 "foo"); | 5509 "foo"); |
5528 | 5510 |
5529 // Register a debug event listener which steps and counts. | 5511 // Register a debug event listener which steps and counts. |
5530 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); | 5512 SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); |
5531 | 5513 |
5532 // Set the debug break flag before calling the code using function.apply. | 5514 // Set the debug break flag before calling the code using function.apply. |
5533 v8::Debug::DebugBreak(env->GetIsolate()); | 5515 v8::debug::DebugBreak(env->GetIsolate()); |
5534 | 5516 |
5535 // Limit the number of debug breaks. This is a regression test for issue 493 | 5517 // Limit the number of debug breaks. This is a regression test for issue 493 |
5536 // where this test would enter an infinite loop. | 5518 // where this test would enter an infinite loop. |
5537 break_point_hit_count = 0; | 5519 break_point_hit_count = 0; |
5538 max_break_point_hit_count = 10000; // 10000 => infinite loop. | 5520 max_break_point_hit_count = 10000; // 10000 => infinite loop. |
5539 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 5521 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
5540 | 5522 |
5541 // When keeping the debug break several break will happen. | 5523 // When keeping the debug break several break will happen. |
5542 CHECK_GT(break_point_hit_count, 1); | 5524 CHECK_GT(break_point_hit_count, 1); |
5543 | 5525 |
5544 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5526 SetDebugEventListener(env->GetIsolate(), nullptr); |
5545 CheckDebuggerUnloaded(env->GetIsolate()); | 5527 CheckDebuggerUnloaded(env->GetIsolate()); |
5546 } | 5528 } |
5547 | 5529 |
5548 | 5530 |
5549 v8::Local<v8::Context> debugee_context; | 5531 v8::Local<v8::Context> debugee_context; |
5550 v8::Local<v8::Context> debugger_context; | 5532 v8::Local<v8::Context> debugger_context; |
5551 | 5533 |
5552 | 5534 |
5553 // Property getter that checks that current and calling contexts | 5535 // Property getter that checks that current and calling contexts |
5554 // are both the debugee contexts. | 5536 // are both the debugee contexts. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5602 | 5584 |
5603 // Create object with 'a' property accessor. | 5585 // Create object with 'a' property accessor. |
5604 v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate); | 5586 v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate); |
5605 named->SetAccessor(v8_str(isolate, "a"), NamedGetterWithCallingContextCheck); | 5587 named->SetAccessor(v8_str(isolate, "a"), NamedGetterWithCallingContextCheck); |
5606 CHECK(env->Global() | 5588 CHECK(env->Global() |
5607 ->Set(debugee_context, v8_str(isolate, "obj"), | 5589 ->Set(debugee_context, v8_str(isolate, "obj"), |
5608 named->NewInstance(debugee_context).ToLocalChecked()) | 5590 named->NewInstance(debugee_context).ToLocalChecked()) |
5609 .FromJust()); | 5591 .FromJust()); |
5610 | 5592 |
5611 // Register the debug event listener | 5593 // Register the debug event listener |
5612 v8::Debug::SetDebugEventListener(isolate, DebugEventGetAtgumentPropertyValue); | 5594 SetDebugEventListener(isolate, DebugEventGetAtgumentPropertyValue); |
5613 | 5595 |
5614 // Create a function that invokes debugger. | 5596 // Create a function that invokes debugger. |
5615 v8::Local<v8::Function> foo = CompileFunction( | 5597 v8::Local<v8::Function> foo = CompileFunction( |
5616 &env, | 5598 &env, |
5617 "function bar(x) { debugger; }" | 5599 "function bar(x) { debugger; }" |
5618 "function foo(){ bar(obj); }", | 5600 "function foo(){ bar(obj); }", |
5619 "foo"); | 5601 "foo"); |
5620 | 5602 |
5621 break_point_hit_count = 0; | 5603 break_point_hit_count = 0; |
5622 foo->Call(debugee_context, env->Global(), 0, NULL).ToLocalChecked(); | 5604 foo->Call(debugee_context, env->Global(), 0, NULL).ToLocalChecked(); |
5623 CHECK_EQ(1, break_point_hit_count); | 5605 CHECK_EQ(1, break_point_hit_count); |
5624 | 5606 |
5625 v8::Debug::SetDebugEventListener(isolate, nullptr); | 5607 SetDebugEventListener(isolate, nullptr); |
5626 debugee_context = v8::Local<v8::Context>(); | 5608 debugee_context = v8::Local<v8::Context>(); |
5627 debugger_context = v8::Local<v8::Context>(); | 5609 debugger_context = v8::Local<v8::Context>(); |
5628 CheckDebuggerUnloaded(isolate); | 5610 CheckDebuggerUnloaded(isolate); |
5629 } | 5611 } |
5630 | 5612 |
5631 | 5613 |
5632 static v8::Local<v8::Value> expected_callback_data; | 5614 static v8::Local<v8::Value> expected_callback_data; |
5633 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { | 5615 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { |
5634 CHECK(details.GetEventContext() == expected_context); | 5616 CHECK(details.GetEventContext() == expected_context); |
5635 CHECK(expected_callback_data->Equals(details.GetEventContext(), | 5617 CHECK(expected_callback_data->Equals(details.GetEventContext(), |
5636 details.GetCallbackData()) | 5618 details.GetCallbackData()) |
5637 .FromJust()); | 5619 .FromJust()); |
5638 } | 5620 } |
5639 | 5621 |
5640 | 5622 |
5641 // Check that event details contain context where debug event occured. | 5623 // Check that event details contain context where debug event occured. |
5642 TEST(DebugEventContext) { | 5624 TEST(DebugEventContext) { |
5643 v8::Isolate* isolate = CcTest::isolate(); | 5625 v8::Isolate* isolate = CcTest::isolate(); |
5644 v8::HandleScope scope(isolate); | 5626 v8::HandleScope scope(isolate); |
5645 expected_context = v8::Context::New(isolate); | 5627 expected_context = v8::Context::New(isolate); |
5646 expected_callback_data = v8::Int32::New(isolate, 2010); | 5628 expected_callback_data = v8::Int32::New(isolate, 2010); |
5647 v8::Debug::SetDebugEventListener(isolate, DebugEventContextChecker, | 5629 SetDebugEventListener(isolate, DebugEventContextChecker, |
5648 expected_callback_data); | 5630 expected_callback_data); |
5649 v8::Context::Scope context_scope(expected_context); | 5631 v8::Context::Scope context_scope(expected_context); |
5650 v8::Script::Compile(expected_context, | 5632 v8::Script::Compile(expected_context, |
5651 v8_str(isolate, "(function(){debugger;})();")) | 5633 v8_str(isolate, "(function(){debugger;})();")) |
5652 .ToLocalChecked() | 5634 .ToLocalChecked() |
5653 ->Run(expected_context) | 5635 ->Run(expected_context) |
5654 .ToLocalChecked(); | 5636 .ToLocalChecked(); |
5655 expected_context.Clear(); | 5637 expected_context.Clear(); |
5656 v8::Debug::SetDebugEventListener(isolate, nullptr); | 5638 SetDebugEventListener(isolate, nullptr); |
5657 expected_context_data = v8::Local<v8::Value>(); | 5639 expected_context_data = v8::Local<v8::Value>(); |
5658 CheckDebuggerUnloaded(isolate); | 5640 CheckDebuggerUnloaded(isolate); |
5659 } | 5641 } |
5660 | 5642 |
5661 | 5643 |
5662 static bool debug_event_break_deoptimize_done = false; | 5644 static bool debug_event_break_deoptimize_done = false; |
5663 | 5645 |
5664 static void DebugEventBreakDeoptimize( | 5646 static void DebugEventBreakDeoptimize( |
5665 const v8::Debug::EventDetails& event_details) { | 5647 const v8::Debug::EventDetails& event_details) { |
5666 v8::DebugEvent event = event_details.GetEvent(); | 5648 v8::DebugEvent event = event_details.GetEvent(); |
(...skipping 14 matching lines...) Expand all Loading... |
5681 v8::Local<v8::String> function_name( | 5663 v8::Local<v8::String> function_name( |
5682 result->ToString(context).ToLocalChecked()); | 5664 result->ToString(context).ToLocalChecked()); |
5683 function_name->WriteUtf8(fn); | 5665 function_name->WriteUtf8(fn); |
5684 if (strcmp(fn, "bar") == 0) { | 5666 if (strcmp(fn, "bar") == 0) { |
5685 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); | 5667 i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); |
5686 debug_event_break_deoptimize_done = true; | 5668 debug_event_break_deoptimize_done = true; |
5687 } | 5669 } |
5688 } | 5670 } |
5689 } | 5671 } |
5690 | 5672 |
5691 v8::Debug::DebugBreak(CcTest::isolate()); | 5673 v8::debug::DebugBreak(CcTest::isolate()); |
5692 } | 5674 } |
5693 } | 5675 } |
5694 | 5676 |
5695 | 5677 |
5696 // Test deoptimization when execution is broken using the debug break stack | 5678 // Test deoptimization when execution is broken using the debug break stack |
5697 // check interrupt. | 5679 // check interrupt. |
5698 TEST(DeoptimizeDuringDebugBreak) { | 5680 TEST(DeoptimizeDuringDebugBreak) { |
5699 DebugLocalContext env; | 5681 DebugLocalContext env; |
5700 v8::HandleScope scope(env->GetIsolate()); | 5682 v8::HandleScope scope(env->GetIsolate()); |
5701 env.ExposeDebug(); | 5683 env.ExposeDebug(); |
5702 v8::Local<v8::Context> context = env.context(); | 5684 v8::Local<v8::Context> context = env.context(); |
5703 | 5685 |
5704 // Create a function for checking the function when hitting a break point. | 5686 // Create a function for checking the function when hitting a break point. |
5705 frame_function_name = CompileFunction(&env, | 5687 frame_function_name = CompileFunction(&env, |
5706 frame_function_name_source, | 5688 frame_function_name_source, |
5707 "frame_function_name"); | 5689 "frame_function_name"); |
5708 | 5690 |
5709 // Set a debug event listener which will keep interrupting execution until | 5691 // Set a debug event listener which will keep interrupting execution until |
5710 // debug break. When inside function bar it will deoptimize all functions. | 5692 // debug break. When inside function bar it will deoptimize all functions. |
5711 // This tests lazy deoptimization bailout for the stack check, as the first | 5693 // This tests lazy deoptimization bailout for the stack check, as the first |
5712 // time in function bar when using debug break and no break points will be at | 5694 // time in function bar when using debug break and no break points will be at |
5713 // the initial stack check. | 5695 // the initial stack check. |
5714 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 5696 SetDebugEventListener(env->GetIsolate(), DebugEventBreakDeoptimize); |
5715 DebugEventBreakDeoptimize); | |
5716 | 5697 |
5717 // Compile and run function bar which will optimize it for some flag settings. | 5698 // Compile and run function bar which will optimize it for some flag settings. |
5718 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar"); | 5699 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar"); |
5719 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); | 5700 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); |
5720 | 5701 |
5721 // Set debug break and call bar again. | 5702 // Set debug break and call bar again. |
5722 v8::Debug::DebugBreak(env->GetIsolate()); | 5703 v8::debug::DebugBreak(env->GetIsolate()); |
5723 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); | 5704 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); |
5724 | 5705 |
5725 CHECK(debug_event_break_deoptimize_done); | 5706 CHECK(debug_event_break_deoptimize_done); |
5726 | 5707 |
5727 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5708 SetDebugEventListener(env->GetIsolate(), nullptr); |
5728 } | 5709 } |
5729 | 5710 |
5730 | 5711 |
5731 static void DebugEventBreakWithOptimizedStack( | 5712 static void DebugEventBreakWithOptimizedStack( |
5732 const v8::Debug::EventDetails& event_details) { | 5713 const v8::Debug::EventDetails& event_details) { |
5733 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); | 5714 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); |
5734 v8::DebugEvent event = event_details.GetEvent(); | 5715 v8::DebugEvent event = event_details.GetEvent(); |
5735 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); | 5716 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); |
5736 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 5717 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
5737 if (event == v8::Break) { | 5718 if (event == v8::Break) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5784 .ToLocalChecked(); | 5765 .ToLocalChecked(); |
5785 CHECK(result->IsUndefined() || | 5766 CHECK(result->IsUndefined() || |
5786 (result->Int32Value(context).FromJust() == 42)); | 5767 (result->Int32Value(context).FromJust() == 42)); |
5787 } | 5768 } |
5788 } | 5769 } |
5789 } | 5770 } |
5790 } | 5771 } |
5791 | 5772 |
5792 | 5773 |
5793 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5774 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5794 v8::Debug::SetDebugEventListener(args.GetIsolate(), | 5775 SetDebugEventListener(args.GetIsolate(), DebugEventBreakWithOptimizedStack); |
5795 DebugEventBreakWithOptimizedStack); | 5776 v8::debug::DebugBreak(args.GetIsolate()); |
5796 v8::Debug::DebugBreak(args.GetIsolate()); | |
5797 } | 5777 } |
5798 | 5778 |
5799 | 5779 |
5800 TEST(DebugBreakStackInspection) { | 5780 TEST(DebugBreakStackInspection) { |
5801 DebugLocalContext env; | 5781 DebugLocalContext env; |
5802 v8::HandleScope scope(env->GetIsolate()); | 5782 v8::HandleScope scope(env->GetIsolate()); |
5803 v8::Local<v8::Context> context = env.context(); | 5783 v8::Local<v8::Context> context = env.context(); |
5804 | 5784 |
5805 frame_function_name = | 5785 frame_function_name = |
5806 CompileFunction(&env, frame_function_name_source, "frame_function_name"); | 5786 CompileFunction(&env, frame_function_name_source, "frame_function_name"); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5859 } | 5839 } |
5860 | 5840 |
5861 break_point_hit_count = 0; | 5841 break_point_hit_count = 0; |
5862 max_break_point_hit_count = kBreaksPerTest; | 5842 max_break_point_hit_count = kBreaksPerTest; |
5863 terminate_after_max_break_point_hit = true; | 5843 terminate_after_max_break_point_hit = true; |
5864 | 5844 |
5865 // Function with infinite loop. | 5845 // Function with infinite loop. |
5866 CompileRun(buffer.start()); | 5846 CompileRun(buffer.start()); |
5867 | 5847 |
5868 // Set the debug break to enter the debugger as soon as possible. | 5848 // Set the debug break to enter the debugger as soon as possible. |
5869 v8::Debug::DebugBreak(CcTest::isolate()); | 5849 v8::debug::DebugBreak(CcTest::isolate()); |
5870 | 5850 |
5871 // Call function with infinite loop. | 5851 // Call function with infinite loop. |
5872 CompileRun("f();"); | 5852 CompileRun("f();"); |
5873 CHECK_EQ(kBreaksPerTest, break_point_hit_count); | 5853 CHECK_EQ(kBreaksPerTest, break_point_hit_count); |
5874 | 5854 |
5875 CHECK(!CcTest::isolate()->IsExecutionTerminating()); | 5855 CHECK(!CcTest::isolate()->IsExecutionTerminating()); |
5876 } | 5856 } |
5877 } | 5857 } |
5878 } | 5858 } |
5879 | 5859 |
(...skipping 15 matching lines...) Expand all Loading... |
5895 "switch (a) { case 1: continue; break; default: h() }", | 5875 "switch (a) { case 1: continue; break; default: h() }", |
5896 NULL}; | 5876 NULL}; |
5897 | 5877 |
5898 | 5878 |
5899 void DebugBreakLoop(const char* loop_header, const char** loop_bodies, | 5879 void DebugBreakLoop(const char* loop_header, const char** loop_bodies, |
5900 const char* loop_footer) { | 5880 const char* loop_footer) { |
5901 DebugLocalContext env; | 5881 DebugLocalContext env; |
5902 v8::HandleScope scope(env->GetIsolate()); | 5882 v8::HandleScope scope(env->GetIsolate()); |
5903 | 5883 |
5904 // Register a debug event listener which sets the break flag and counts. | 5884 // Register a debug event listener which sets the break flag and counts. |
5905 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); | 5885 SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); |
5906 | 5886 |
5907 CompileRun( | 5887 CompileRun( |
5908 "var a = 1;\n" | 5888 "var a = 1;\n" |
5909 "function g() { }\n" | 5889 "function g() { }\n" |
5910 "function h() { }"); | 5890 "function h() { }"); |
5911 | 5891 |
5912 TestDebugBreakInLoop(loop_header, loop_bodies, loop_footer); | 5892 TestDebugBreakInLoop(loop_header, loop_bodies, loop_footer); |
5913 | 5893 |
5914 // Get rid of the debug event listener. | 5894 // Get rid of the debug event listener. |
5915 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 5895 SetDebugEventListener(env->GetIsolate(), nullptr); |
5916 CheckDebuggerUnloaded(env->GetIsolate()); | 5896 CheckDebuggerUnloaded(env->GetIsolate()); |
5917 } | 5897 } |
5918 | 5898 |
5919 | 5899 |
5920 TEST(DebugBreakInWhileTrue1) { | 5900 TEST(DebugBreakInWhileTrue1) { |
5921 DebugBreakLoop("while (true) {", loop_bodies_1, "}"); | 5901 DebugBreakLoop("while (true) {", loop_bodies_1, "}"); |
5922 } | 5902 } |
5923 | 5903 |
5924 | 5904 |
5925 TEST(DebugBreakInWhileTrue2) { | 5905 TEST(DebugBreakInWhileTrue2) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5999 | 5979 |
6000 for (int i = 0; i < frame_count; i++) { | 5980 for (int i = 0; i < frame_count; i++) { |
6001 // The 6. element in the returned array of GetFrameDetails contains the | 5981 // The 6. element in the returned array of GetFrameDetails contains the |
6002 // source position of that frame. | 5982 // source position of that frame. |
6003 SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[6]", break_id, i); | 5983 SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[6]", break_id, i); |
6004 v8::Local<v8::Value> result = CompileRun(script); | 5984 v8::Local<v8::Value> result = CompileRun(script); |
6005 CHECK_EQ(expected_line_number[i], | 5985 CHECK_EQ(expected_line_number[i], |
6006 i::Script::GetLineNumber(source_script, | 5986 i::Script::GetLineNumber(source_script, |
6007 result->Int32Value(context).FromJust())); | 5987 result->Int32Value(context).FromJust())); |
6008 } | 5988 } |
6009 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); | 5989 SetDebugEventListener(CcTest::isolate(), nullptr); |
6010 CcTest::isolate()->TerminateExecution(); | 5990 CcTest::isolate()->TerminateExecution(); |
6011 } | 5991 } |
6012 | 5992 |
6013 | 5993 |
6014 TEST(DebugBreakInline) { | 5994 TEST(DebugBreakInline) { |
6015 i::FLAG_allow_natives_syntax = true; | 5995 i::FLAG_allow_natives_syntax = true; |
6016 DebugLocalContext env; | 5996 DebugLocalContext env; |
6017 v8::HandleScope scope(env->GetIsolate()); | 5997 v8::HandleScope scope(env->GetIsolate()); |
6018 v8::Local<v8::Context> context = env.context(); | 5998 v8::Local<v8::Context> context = env.context(); |
6019 const char* source = | 5999 const char* source = |
6020 "function debug(b) { \n" | 6000 "function debug(b) { \n" |
6021 " if (b) debugger; \n" | 6001 " if (b) debugger; \n" |
6022 "} \n" | 6002 "} \n" |
6023 "function f(b) { \n" | 6003 "function f(b) { \n" |
6024 " debug(b) \n" | 6004 " debug(b) \n" |
6025 "}; \n" | 6005 "}; \n" |
6026 "function g(b) { \n" | 6006 "function g(b) { \n" |
6027 " f(b); \n" | 6007 " f(b); \n" |
6028 "}; \n" | 6008 "}; \n" |
6029 "g(false); \n" | 6009 "g(false); \n" |
6030 "g(false); \n" | 6010 "g(false); \n" |
6031 "%OptimizeFunctionOnNextCall(g); \n" | 6011 "%OptimizeFunctionOnNextCall(g); \n" |
6032 "g(true);"; | 6012 "g(true);"; |
6033 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); | 6013 SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); |
6034 inline_script = | 6014 inline_script = |
6035 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) | 6015 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) |
6036 .ToLocalChecked(); | 6016 .ToLocalChecked(); |
6037 inline_script->Run(context).ToLocalChecked(); | 6017 inline_script->Run(context).ToLocalChecked(); |
6038 } | 6018 } |
6039 | 6019 |
6040 | 6020 |
6041 static void DebugEventStepNext( | 6021 static void DebugEventStepNext( |
6042 const v8::Debug::EventDetails& event_details) { | 6022 const v8::Debug::EventDetails& event_details) { |
6043 v8::DebugEvent event = event_details.GetEvent(); | 6023 v8::DebugEvent event = event_details.GetEvent(); |
(...skipping 14 matching lines...) Expand all Loading... |
6058 // Bug description: | 6038 // Bug description: |
6059 // When doing StepNext through the first script, the debugger is not reset | 6039 // When doing StepNext through the first script, the debugger is not reset |
6060 // after exiting through exception. A flawed implementation enabling the | 6040 // after exiting through exception. A flawed implementation enabling the |
6061 // debugger to step into Array.prototype.forEach breaks inside the callback | 6041 // debugger to step into Array.prototype.forEach breaks inside the callback |
6062 // for forEach in the second script under the assumption that we are in a | 6042 // for forEach in the second script under the assumption that we are in a |
6063 // recursive call. In an attempt to step out, we crawl the stack using the | 6043 // recursive call. In an attempt to step out, we crawl the stack using the |
6064 // recorded frame pointer from the first script and fail when not finding it | 6044 // recorded frame pointer from the first script and fail when not finding it |
6065 // on the stack. | 6045 // on the stack. |
6066 DebugLocalContext env; | 6046 DebugLocalContext env; |
6067 v8::HandleScope scope(env->GetIsolate()); | 6047 v8::HandleScope scope(env->GetIsolate()); |
6068 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepNext); | 6048 SetDebugEventListener(env->GetIsolate(), DebugEventStepNext); |
6069 | 6049 |
6070 // We step through the first script. It exits through an exception. We run | 6050 // We step through the first script. It exits through an exception. We run |
6071 // this inside a new frame to record a different FP than the second script | 6051 // this inside a new frame to record a different FP than the second script |
6072 // would expect. | 6052 // would expect. |
6073 const char* script_1 = "debugger; throw new Error();"; | 6053 const char* script_1 = "debugger; throw new Error();"; |
6074 RunScriptInANewCFrame(script_1); | 6054 RunScriptInANewCFrame(script_1); |
6075 | 6055 |
6076 // The second script uses forEach. | 6056 // The second script uses forEach. |
6077 const char* script_2 = "[0].forEach(function() { });"; | 6057 const char* script_2 = "[0].forEach(function() { });"; |
6078 CompileRun(script_2); | 6058 CompileRun(script_2); |
6079 | 6059 |
6080 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 6060 SetDebugEventListener(env->GetIsolate(), nullptr); |
6081 } | 6061 } |
6082 | 6062 |
6083 | 6063 |
6084 // Import from test-heap.cc | 6064 // Import from test-heap.cc |
6085 namespace v8 { | 6065 namespace v8 { |
6086 namespace internal { | 6066 namespace internal { |
6087 | 6067 |
6088 int CountNativeContexts(); | 6068 int CountNativeContexts(); |
6089 } | 6069 } |
6090 } | 6070 } |
6091 | 6071 |
6092 | 6072 |
6093 static void NopListener(const v8::Debug::EventDetails& event_details) { | 6073 static void NopListener(const v8::Debug::EventDetails& event_details) { |
6094 } | 6074 } |
6095 | 6075 |
6096 | 6076 |
6097 TEST(DebuggerCreatesContextIffActive) { | 6077 TEST(DebuggerCreatesContextIffActive) { |
6098 DebugLocalContext env; | 6078 DebugLocalContext env; |
6099 v8::HandleScope scope(env->GetIsolate()); | 6079 v8::HandleScope scope(env->GetIsolate()); |
6100 CHECK_EQ(1, v8::internal::CountNativeContexts()); | 6080 CHECK_EQ(1, v8::internal::CountNativeContexts()); |
6101 | 6081 |
6102 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 6082 SetDebugEventListener(env->GetIsolate(), nullptr); |
6103 CompileRun("debugger;"); | 6083 CompileRun("debugger;"); |
6104 CHECK_EQ(1, v8::internal::CountNativeContexts()); | 6084 CHECK_EQ(1, v8::internal::CountNativeContexts()); |
6105 | 6085 |
6106 v8::Debug::SetDebugEventListener(env->GetIsolate(), NopListener); | 6086 SetDebugEventListener(env->GetIsolate(), NopListener); |
6107 CompileRun("debugger;"); | 6087 CompileRun("debugger;"); |
6108 CHECK_EQ(2, v8::internal::CountNativeContexts()); | 6088 CHECK_EQ(2, v8::internal::CountNativeContexts()); |
6109 | 6089 |
6110 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 6090 SetDebugEventListener(env->GetIsolate(), nullptr); |
6111 } | 6091 } |
6112 | 6092 |
6113 | 6093 |
6114 TEST(LiveEditEnabled) { | 6094 TEST(LiveEditEnabled) { |
6115 v8::internal::FLAG_allow_natives_syntax = true; | 6095 v8::internal::FLAG_allow_natives_syntax = true; |
6116 LocalContext env; | 6096 LocalContext env; |
6117 v8::HandleScope scope(env->GetIsolate()); | 6097 v8::HandleScope scope(env->GetIsolate()); |
6118 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), true); | 6098 v8::debug::SetLiveEditEnabled(env->GetIsolate(), true); |
6119 CompileRun("%LiveEditCompareStrings('', '')"); | 6099 CompileRun("%LiveEditCompareStrings('', '')"); |
6120 } | 6100 } |
6121 | 6101 |
6122 | 6102 |
6123 TEST(LiveEditDisabled) { | 6103 TEST(LiveEditDisabled) { |
6124 v8::internal::FLAG_allow_natives_syntax = true; | 6104 v8::internal::FLAG_allow_natives_syntax = true; |
6125 LocalContext env; | 6105 LocalContext env; |
6126 v8::HandleScope scope(env->GetIsolate()); | 6106 v8::HandleScope scope(env->GetIsolate()); |
6127 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), false); | 6107 v8::debug::SetLiveEditEnabled(env->GetIsolate(), false); |
6128 CompileRun("%LiveEditCompareStrings('', '')"); | 6108 CompileRun("%LiveEditCompareStrings('', '')"); |
6129 } | 6109 } |
6130 | 6110 |
6131 | 6111 |
6132 TEST(PrecompiledFunction) { | 6112 TEST(PrecompiledFunction) { |
6133 // Regression test for crbug.com/346207. If we have preparse data, parsing the | 6113 // 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 | 6114 // 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 | 6115 // succeed. The bug was that preparsing was done lazily and parsing was done |
6136 // eagerly, so, the symbol streams didn't match. | 6116 // eagerly, so, the symbol streams didn't match. |
6137 DebugLocalContext env; | 6117 DebugLocalContext env; |
6138 v8::HandleScope scope(env->GetIsolate()); | 6118 v8::HandleScope scope(env->GetIsolate()); |
6139 env.ExposeDebug(); | 6119 env.ExposeDebug(); |
6140 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); | 6120 SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); |
6141 | 6121 |
6142 v8::Local<v8::Function> break_here = | 6122 v8::Local<v8::Function> break_here = |
6143 CompileFunction(&env, "function break_here(){}", "break_here"); | 6123 CompileFunction(&env, "function break_here(){}", "break_here"); |
6144 SetBreakPoint(break_here, 0); | 6124 SetBreakPoint(break_here, 0); |
6145 | 6125 |
6146 const char* source = | 6126 const char* source = |
6147 "var a = b = c = 1; \n" | 6127 "var a = b = c = 1; \n" |
6148 "function this_is_lazy() { \n" | 6128 "function this_is_lazy() { \n" |
6149 // This symbol won't appear in the preparse data. | 6129 // This symbol won't appear in the preparse data. |
6150 " var a; \n" | 6130 " var a; \n" |
6151 "} \n" | 6131 "} \n" |
6152 "function bar() { \n" | 6132 "function bar() { \n" |
6153 " return \"bar\"; \n" | 6133 " return \"bar\"; \n" |
6154 "}; \n" | 6134 "}; \n" |
6155 "a = b = c = 2; \n" | 6135 "a = b = c = 2; \n" |
6156 "bar(); \n"; | 6136 "bar(); \n"; |
6157 v8::Local<v8::Value> result = ParserCacheCompileRun(source); | 6137 v8::Local<v8::Value> result = ParserCacheCompileRun(source); |
6158 CHECK(result->IsString()); | 6138 CHECK(result->IsString()); |
6159 v8::String::Utf8Value utf8(result); | 6139 v8::String::Utf8Value utf8(result); |
6160 CHECK_EQ(0, strcmp("bar", *utf8)); | 6140 CHECK_EQ(0, strcmp("bar", *utf8)); |
6161 | 6141 |
6162 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 6142 SetDebugEventListener(env->GetIsolate(), nullptr); |
6163 CheckDebuggerUnloaded(env->GetIsolate()); | 6143 CheckDebuggerUnloaded(env->GetIsolate()); |
6164 } | 6144 } |
6165 | 6145 |
6166 | 6146 |
6167 static void DebugBreakStackTraceListener( | 6147 static void DebugBreakStackTraceListener( |
6168 const v8::Debug::EventDetails& event_details) { | 6148 const v8::Debug::EventDetails& event_details) { |
6169 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10); | 6149 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10); |
6170 } | 6150 } |
6171 | 6151 |
6172 | 6152 |
6173 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { | 6153 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { |
6174 v8::Debug::DebugBreak(args.GetIsolate()); | 6154 v8::debug::DebugBreak(args.GetIsolate()); |
6175 } | 6155 } |
6176 | 6156 |
6177 | 6157 |
6178 TEST(DebugBreakStackTrace) { | 6158 TEST(DebugBreakStackTrace) { |
6179 DebugLocalContext env; | 6159 DebugLocalContext env; |
6180 v8::HandleScope scope(env->GetIsolate()); | 6160 v8::HandleScope scope(env->GetIsolate()); |
6181 v8::Debug::SetDebugEventListener(env->GetIsolate(), | 6161 SetDebugEventListener(env->GetIsolate(), DebugBreakStackTraceListener); |
6182 DebugBreakStackTraceListener); | |
6183 v8::Local<v8::Context> context = env.context(); | 6162 v8::Local<v8::Context> context = env.context(); |
6184 v8::Local<v8::FunctionTemplate> add_debug_break_template = | 6163 v8::Local<v8::FunctionTemplate> add_debug_break_template = |
6185 v8::FunctionTemplate::New(env->GetIsolate(), AddDebugBreak); | 6164 v8::FunctionTemplate::New(env->GetIsolate(), AddDebugBreak); |
6186 v8::Local<v8::Function> add_debug_break = | 6165 v8::Local<v8::Function> add_debug_break = |
6187 add_debug_break_template->GetFunction(context).ToLocalChecked(); | 6166 add_debug_break_template->GetFunction(context).ToLocalChecked(); |
6188 CHECK(env->Global() | 6167 CHECK(env->Global() |
6189 ->Set(context, v8_str("add_debug_break"), add_debug_break) | 6168 ->Set(context, v8_str("add_debug_break"), add_debug_break) |
6190 .FromJust()); | 6169 .FromJust()); |
6191 | 6170 |
6192 CompileRun("(function loop() {" | 6171 CompileRun("(function loop() {" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6227 | 6206 |
6228 private: | 6207 private: |
6229 v8::Isolate* isolate_; | 6208 v8::Isolate* isolate_; |
6230 }; | 6209 }; |
6231 | 6210 |
6232 | 6211 |
6233 TEST(DebugBreakOffThreadTerminate) { | 6212 TEST(DebugBreakOffThreadTerminate) { |
6234 DebugLocalContext env; | 6213 DebugLocalContext env; |
6235 v8::Isolate* isolate = env->GetIsolate(); | 6214 v8::Isolate* isolate = env->GetIsolate(); |
6236 v8::HandleScope scope(isolate); | 6215 v8::HandleScope scope(isolate); |
6237 v8::Debug::SetDebugEventListener(isolate, DebugBreakTriggerTerminate); | 6216 SetDebugEventListener(isolate, DebugBreakTriggerTerminate); |
6238 TerminationThread terminator(isolate); | 6217 TerminationThread terminator(isolate); |
6239 terminator.Start(); | 6218 terminator.Start(); |
6240 v8::TryCatch try_catch(env->GetIsolate()); | 6219 v8::TryCatch try_catch(env->GetIsolate()); |
6241 v8::Debug::DebugBreak(isolate); | 6220 v8::debug::DebugBreak(isolate); |
6242 CompileRun("while (true);"); | 6221 CompileRun("while (true);"); |
6243 CHECK(try_catch.HasTerminated()); | 6222 CHECK(try_catch.HasTerminated()); |
6244 } | 6223 } |
6245 | 6224 |
6246 | 6225 |
6247 static void DebugEventExpectNoException( | 6226 static void DebugEventExpectNoException( |
6248 const v8::Debug::EventDetails& event_details) { | 6227 const v8::Debug::EventDetails& event_details) { |
6249 v8::DebugEvent event = event_details.GetEvent(); | 6228 v8::DebugEvent event = event_details.GetEvent(); |
6250 CHECK_NE(v8::Exception, event); | 6229 CHECK_NE(v8::Exception, event); |
6251 } | 6230 } |
6252 | 6231 |
6253 | 6232 |
6254 static void TryCatchWrappedThrowCallback( | 6233 static void TryCatchWrappedThrowCallback( |
6255 const v8::FunctionCallbackInfo<v8::Value>& args) { | 6234 const v8::FunctionCallbackInfo<v8::Value>& args) { |
6256 v8::TryCatch try_catch(args.GetIsolate()); | 6235 v8::TryCatch try_catch(args.GetIsolate()); |
6257 CompileRun("throw 'rejection';"); | 6236 CompileRun("throw 'rejection';"); |
6258 CHECK(try_catch.HasCaught()); | 6237 CHECK(try_catch.HasCaught()); |
6259 } | 6238 } |
6260 | 6239 |
6261 | 6240 |
6262 TEST(DebugPromiseInterceptedByTryCatch) { | 6241 TEST(DebugPromiseInterceptedByTryCatch) { |
6263 DebugLocalContext env; | 6242 DebugLocalContext env; |
6264 v8::Isolate* isolate = env->GetIsolate(); | 6243 v8::Isolate* isolate = env->GetIsolate(); |
6265 v8::HandleScope scope(isolate); | 6244 v8::HandleScope scope(isolate); |
6266 v8::Debug::SetDebugEventListener(isolate, &DebugEventExpectNoException); | 6245 SetDebugEventListener(isolate, &DebugEventExpectNoException); |
6267 v8::Local<v8::Context> context = env.context(); | 6246 v8::Local<v8::Context> context = env.context(); |
6268 ChangeBreakOnException(false, true); | 6247 ChangeBreakOnException(false, true); |
6269 | 6248 |
6270 v8::Local<v8::FunctionTemplate> fun = | 6249 v8::Local<v8::FunctionTemplate> fun = |
6271 v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback); | 6250 v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback); |
6272 CHECK(env->Global() | 6251 CHECK(env->Global() |
6273 ->Set(context, v8_str("fun"), | 6252 ->Set(context, v8_str("fun"), |
6274 fun->GetFunction(context).ToLocalChecked()) | 6253 fun->GetFunction(context).ToLocalChecked()) |
6275 .FromJust()); | 6254 .FromJust()); |
6276 | 6255 |
(...skipping 18 matching lines...) Expand all Loading... |
6295 | 6274 |
6296 static void ThrowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 6275 static void ThrowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
6297 CompileRun("throw 'rejection';"); | 6276 CompileRun("throw 'rejection';"); |
6298 } | 6277 } |
6299 | 6278 |
6300 | 6279 |
6301 TEST(DebugPromiseRejectedByCallback) { | 6280 TEST(DebugPromiseRejectedByCallback) { |
6302 DebugLocalContext env; | 6281 DebugLocalContext env; |
6303 v8::Isolate* isolate = env->GetIsolate(); | 6282 v8::Isolate* isolate = env->GetIsolate(); |
6304 v8::HandleScope scope(isolate); | 6283 v8::HandleScope scope(isolate); |
6305 v8::Debug::SetDebugEventListener(isolate, &DebugEventCountException); | 6284 SetDebugEventListener(isolate, &DebugEventCountException); |
6306 v8::Local<v8::Context> context = env.context(); | 6285 v8::Local<v8::Context> context = env.context(); |
6307 ChangeBreakOnException(false, true); | 6286 ChangeBreakOnException(false, true); |
6308 exception_event_counter = 0; | 6287 exception_event_counter = 0; |
6309 | 6288 |
6310 v8::Local<v8::FunctionTemplate> fun = | 6289 v8::Local<v8::FunctionTemplate> fun = |
6311 v8::FunctionTemplate::New(isolate, ThrowCallback); | 6290 v8::FunctionTemplate::New(isolate, ThrowCallback); |
6312 CHECK(env->Global() | 6291 CHECK(env->Global() |
6313 ->Set(context, v8_str("fun"), | 6292 ->Set(context, v8_str("fun"), |
6314 fun->GetFunction(context).ToLocalChecked()) | 6293 fun->GetFunction(context).ToLocalChecked()) |
6315 .FromJust()); | 6294 .FromJust()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6356 ExpectInt32("frame.evaluate('x + y').value_", 11); | 6335 ExpectInt32("frame.evaluate('x + y').value_", 11); |
6357 } | 6336 } |
6358 | 6337 |
6359 | 6338 |
6360 TEST(DebugBreakInLexicalScopes) { | 6339 TEST(DebugBreakInLexicalScopes) { |
6361 i::FLAG_allow_natives_syntax = true; | 6340 i::FLAG_allow_natives_syntax = true; |
6362 | 6341 |
6363 DebugLocalContext env; | 6342 DebugLocalContext env; |
6364 v8::Isolate* isolate = env->GetIsolate(); | 6343 v8::Isolate* isolate = env->GetIsolate(); |
6365 v8::HandleScope scope(isolate); | 6344 v8::HandleScope scope(isolate); |
6366 v8::Debug::SetDebugEventListener(isolate, DebugHarmonyScopingListener); | 6345 SetDebugEventListener(isolate, DebugHarmonyScopingListener); |
6367 | 6346 |
6368 CompileRun( | 6347 CompileRun( |
6369 "'use strict'; \n" | 6348 "'use strict'; \n" |
6370 "let x = 1; \n"); | 6349 "let x = 1; \n"); |
6371 ExpectInt32( | 6350 ExpectInt32( |
6372 "'use strict'; \n" | 6351 "'use strict'; \n" |
6373 "let y = 2; \n" | 6352 "let y = 2; \n" |
6374 "debugger; \n" | 6353 "debugger; \n" |
6375 "x * y", | 6354 "x * y", |
6376 30); | 6355 30); |
(...skipping 16 matching lines...) Expand all Loading... |
6393 // Do not allow nested AfterCompile events. | 6372 // Do not allow nested AfterCompile events. |
6394 CHECK(after_compile_handler_depth <= 1); | 6373 CHECK(after_compile_handler_depth <= 1); |
6395 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); | 6374 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); |
6396 isolate->RequestInterrupt(&HandleInterrupt, nullptr); | 6375 isolate->RequestInterrupt(&HandleInterrupt, nullptr); |
6397 CompileRun("function foo() {}; foo();"); | 6376 CompileRun("function foo() {}; foo();"); |
6398 --after_compile_handler_depth; | 6377 --after_compile_handler_depth; |
6399 } | 6378 } |
6400 | 6379 |
6401 TEST(NoInterruptsInDebugListener) { | 6380 TEST(NoInterruptsInDebugListener) { |
6402 DebugLocalContext env; | 6381 DebugLocalContext env; |
6403 v8::Debug::SetDebugEventListener(env->GetIsolate(), NoInterruptsOnDebugEvent); | 6382 SetDebugEventListener(env->GetIsolate(), NoInterruptsOnDebugEvent); |
6404 CompileRun("void(0);"); | 6383 CompileRun("void(0);"); |
6405 } | 6384 } |
6406 | 6385 |
6407 TEST(BreakLocationIterator) { | 6386 TEST(BreakLocationIterator) { |
6408 DebugLocalContext env; | 6387 DebugLocalContext env; |
6409 v8::Isolate* isolate = env->GetIsolate(); | 6388 v8::Isolate* isolate = env->GetIsolate(); |
6410 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6389 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6411 v8::HandleScope scope(isolate); | 6390 v8::HandleScope scope(isolate); |
6412 | 6391 |
6413 v8::Local<v8::Value> result = CompileRun( | 6392 v8::Local<v8::Value> result = CompileRun( |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6452 | 6431 |
6453 TEST(DisableTailCallElimination) { | 6432 TEST(DisableTailCallElimination) { |
6454 i::FLAG_allow_natives_syntax = true; | 6433 i::FLAG_allow_natives_syntax = true; |
6455 i::FLAG_harmony_tailcalls = true; | 6434 i::FLAG_harmony_tailcalls = true; |
6456 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes | 6435 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes |
6457 // stack[2].getFunctionName() return null. | 6436 // stack[2].getFunctionName() return null. |
6458 i::FLAG_turbo_inlining = false; | 6437 i::FLAG_turbo_inlining = false; |
6459 | 6438 |
6460 DebugLocalContext env; | 6439 DebugLocalContext env; |
6461 v8::Isolate* isolate = env->GetIsolate(); | 6440 v8::Isolate* isolate = env->GetIsolate(); |
| 6441 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6462 v8::HandleScope scope(isolate); | 6442 v8::HandleScope scope(isolate); |
6463 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); | 6443 CHECK(i_isolate->is_tail_call_elimination_enabled()); |
6464 | 6444 |
6465 CompileRun( | 6445 CompileRun( |
6466 "'use strict'; \n" | 6446 "'use strict'; \n" |
6467 "Error.prepareStackTrace = (error,stack) => { \n" | 6447 "Error.prepareStackTrace = (error,stack) => { \n" |
6468 " error.strace = stack; \n" | 6448 " error.strace = stack; \n" |
6469 " return error.message + \"\\n at \" + stack.join(\"\\n at \"); \n" | 6449 " return error.message + \"\\n at \" + stack.join(\"\\n at \"); \n" |
6470 "} \n" | 6450 "} \n" |
6471 " \n" | 6451 " \n" |
6472 "function getCaller() { \n" | 6452 "function getCaller() { \n" |
6473 " var e = new Error(); \n" | 6453 " var e = new Error(); \n" |
(...skipping 16 matching lines...) Expand all Loading... |
6490 "function h() { \n" | 6470 "function h() { \n" |
6491 " var result = g(); \n" | 6471 " var result = g(); \n" |
6492 " return result; \n" | 6472 " return result; \n" |
6493 "} \n" | 6473 "} \n" |
6494 "%NeverOptimizeFunction(getCaller); \n" | 6474 "%NeverOptimizeFunction(getCaller); \n" |
6495 "%NeverOptimizeFunction(f); \n" | 6475 "%NeverOptimizeFunction(f); \n" |
6496 "%NeverOptimizeFunction(h); \n" | 6476 "%NeverOptimizeFunction(h); \n" |
6497 ""); | 6477 ""); |
6498 ExpectInt32("h();", 2); | 6478 ExpectInt32("h();", 2); |
6499 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); | 6479 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); |
6500 v8::Debug::SetTailCallEliminationEnabled(isolate, false); | 6480 i_isolate->SetTailCallEliminationEnabled(false); |
6501 CHECK(!v8::Debug::IsTailCallEliminationEnabled(isolate)); | 6481 CHECK(!i_isolate->is_tail_call_elimination_enabled()); |
6502 ExpectInt32("h();", 1); | 6482 ExpectInt32("h();", 1); |
6503 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 1); | 6483 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 1); |
6504 v8::Debug::SetTailCallEliminationEnabled(isolate, true); | 6484 i_isolate->SetTailCallEliminationEnabled(true); |
6505 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); | 6485 CHECK(i_isolate->is_tail_call_elimination_enabled()); |
6506 ExpectInt32("h();", 2); | 6486 ExpectInt32("h();", 2); |
6507 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); | 6487 ExpectInt32("h(); %OptimizeFunctionOnNextCall(g); h();", 2); |
6508 } | 6488 } |
6509 | 6489 |
6510 TEST(DebugStepNextTailCallEliminiation) { | 6490 TEST(DebugStepNextTailCallEliminiation) { |
6511 i::FLAG_allow_natives_syntax = true; | 6491 i::FLAG_allow_natives_syntax = true; |
6512 i::FLAG_harmony_tailcalls = true; | 6492 i::FLAG_harmony_tailcalls = true; |
6513 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes | 6493 // TODO(ishell, 4698): Investigate why TurboFan in --always-opt mode makes |
6514 // stack[2].getFunctionName() return null. | 6494 // stack[2].getFunctionName() return null. |
6515 i::FLAG_turbo_inlining = false; | 6495 i::FLAG_turbo_inlining = false; |
6516 | 6496 |
6517 DebugLocalContext env; | 6497 DebugLocalContext env; |
6518 env.ExposeDebug(); | 6498 env.ExposeDebug(); |
6519 v8::Isolate* isolate = env->GetIsolate(); | 6499 v8::Isolate* isolate = env->GetIsolate(); |
| 6500 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6520 v8::HandleScope scope(isolate); | 6501 v8::HandleScope scope(isolate); |
6521 CHECK(v8::Debug::IsTailCallEliminationEnabled(isolate)); | 6502 CHECK(i_isolate->is_tail_call_elimination_enabled()); |
6522 | 6503 |
6523 const char* source = | 6504 const char* source = |
6524 "'use strict'; \n" | 6505 "'use strict'; \n" |
6525 "var Debug = debug.Debug; \n" | 6506 "var Debug = debug.Debug; \n" |
6526 "var exception = null; \n" | 6507 "var exception = null; \n" |
6527 "var breaks = 0; \n" | 6508 "var breaks = 0; \n" |
6528 "var log = []; \n" | 6509 "var log = []; \n" |
6529 "function f(x) { \n" | 6510 "function f(x) { \n" |
6530 " if (x == 2) { \n" | 6511 " if (x == 2) { \n" |
6531 " debugger; // Break a \n" | 6512 " debugger; // Break a \n" |
(...skipping 15 matching lines...) Expand all Loading... |
6547 " }; \n" | 6528 " }; \n" |
6548 "}; \n" | 6529 "}; \n" |
6549 "Debug.setListener(listener); \n" | 6530 "Debug.setListener(listener); \n" |
6550 "f(4); \n" | 6531 "f(4); \n" |
6551 "Debug.setListener(null); // Break d \n"; | 6532 "Debug.setListener(null); // Break d \n"; |
6552 | 6533 |
6553 CompileRun(source); | 6534 CompileRun(source); |
6554 ExpectNull("exception"); | 6535 ExpectNull("exception"); |
6555 ExpectString("JSON.stringify(log)", "[\"a4\",\"b2\",\"c4\",\"c11\",\"d0\"]"); | 6536 ExpectString("JSON.stringify(log)", "[\"a4\",\"b2\",\"c4\",\"c11\",\"d0\"]"); |
6556 | 6537 |
6557 v8::Debug::SetTailCallEliminationEnabled(isolate, false); | 6538 i_isolate->SetTailCallEliminationEnabled(false); |
6558 CompileRun( | 6539 CompileRun( |
6559 "log = []; \n" | 6540 "log = []; \n" |
6560 "Debug.setListener(listener); \n" | 6541 "Debug.setListener(listener); \n" |
6561 "f(5); \n" | 6542 "f(5); \n" |
6562 "Debug.setListener(null); // Break f \n"); | 6543 "Debug.setListener(null); // Break f \n"); |
6563 ExpectNull("exception"); | 6544 ExpectNull("exception"); |
6564 ExpectString("JSON.stringify(log)", | 6545 ExpectString("JSON.stringify(log)", |
6565 "[\"a4\",\"b2\",\"c4\",\"e0\",\"e0\",\"e0\",\"e0\",\"f0\"]"); | 6546 "[\"a4\",\"b2\",\"c4\",\"e0\",\"e0\",\"e0\",\"e0\",\"f0\"]"); |
6566 } | 6547 } |
6567 | 6548 |
6568 size_t current_action = 0; | 6549 size_t current_action = 0; |
6569 StepAction actions[] = {StepNext, StepNext}; | 6550 StepAction actions[] = {StepNext, StepNext}; |
6570 static void DebugStepOverFunctionWithCaughtExceptionListener( | 6551 static void DebugStepOverFunctionWithCaughtExceptionListener( |
6571 const v8::Debug::EventDetails& event_details) { | 6552 const v8::Debug::EventDetails& event_details) { |
6572 v8::DebugEvent event = event_details.GetEvent(); | 6553 v8::DebugEvent event = event_details.GetEvent(); |
6573 if (event != v8::Break) return; | 6554 if (event != v8::Break) return; |
6574 ++break_point_hit_count; | 6555 ++break_point_hit_count; |
6575 if (current_action >= 2) return; | 6556 if (current_action >= 2) return; |
6576 PrepareStep(actions[current_action]); | 6557 PrepareStep(actions[current_action]); |
6577 } | 6558 } |
6578 | 6559 |
6579 TEST(DebugStepOverFunctionWithCaughtException) { | 6560 TEST(DebugStepOverFunctionWithCaughtException) { |
6580 i::FLAG_allow_natives_syntax = true; | 6561 i::FLAG_allow_natives_syntax = true; |
6581 | 6562 |
6582 DebugLocalContext env; | 6563 DebugLocalContext env; |
6583 v8::Isolate* isolate = env->GetIsolate(); | 6564 v8::Isolate* isolate = env->GetIsolate(); |
6584 v8::HandleScope scope(isolate); | 6565 v8::HandleScope scope(isolate); |
6585 v8::Debug::SetDebugEventListener( | 6566 SetDebugEventListener(isolate, |
6586 isolate, DebugStepOverFunctionWithCaughtExceptionListener); | 6567 DebugStepOverFunctionWithCaughtExceptionListener); |
6587 | 6568 |
6588 break_point_hit_count = 0; | 6569 break_point_hit_count = 0; |
6589 CompileRun( | 6570 CompileRun( |
6590 "function foo() {\n" | 6571 "function foo() {\n" |
6591 " try { throw new Error(); } catch (e) {}\n" | 6572 " try { throw new Error(); } catch (e) {}\n" |
6592 "}\n" | 6573 "}\n" |
6593 "debugger;\n" | 6574 "debugger;\n" |
6594 "foo();\n" | 6575 "foo();\n" |
6595 "foo();\n"); | 6576 "foo();\n"); |
6596 | 6577 |
6597 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); | 6578 SetDebugEventListener(env->GetIsolate(), nullptr); |
6598 CHECK_EQ(4, break_point_hit_count); | 6579 CHECK_EQ(4, break_point_hit_count); |
6599 } | 6580 } |
6600 | 6581 |
6601 bool out_of_memory_callback_called = false; | 6582 bool out_of_memory_callback_called = false; |
6602 void OutOfMemoryCallback(void* data) { | 6583 void OutOfMemoryCallback(void* data) { |
6603 out_of_memory_callback_called = true; | 6584 out_of_memory_callback_called = true; |
6604 reinterpret_cast<v8::Isolate*>(data)->IncreaseHeapLimitForDebugging(); | 6585 reinterpret_cast<v8::Isolate*>(data)->IncreaseHeapLimitForDebugging(); |
6605 } | 6586 } |
6606 | 6587 |
6607 UNINITIALIZED_TEST(DebugSetOutOfMemoryListener) { | 6588 UNINITIALIZED_TEST(DebugSetOutOfMemoryListener) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6662 | 6643 |
6663 function_data = script_data.GetFunctionData(1); | 6644 function_data = script_data.GetFunctionData(1); |
6664 start = script->GetSourceLocation(function_data.StartOffset()); | 6645 start = script->GetSourceLocation(function_data.StartOffset()); |
6665 end = script->GetSourceLocation(function_data.EndOffset()); | 6646 end = script->GetSourceLocation(function_data.EndOffset()); |
6666 CHECK_EQ(0, start.GetLineNumber()); | 6647 CHECK_EQ(0, start.GetLineNumber()); |
6667 CHECK_EQ(0, start.GetColumnNumber()); | 6648 CHECK_EQ(0, start.GetColumnNumber()); |
6668 CHECK_EQ(1, end.GetLineNumber()); | 6649 CHECK_EQ(1, end.GetLineNumber()); |
6669 CHECK_EQ(1, end.GetColumnNumber()); | 6650 CHECK_EQ(1, end.GetColumnNumber()); |
6670 CHECK_EQ(2, function_data.Count()); | 6651 CHECK_EQ(2, function_data.Count()); |
6671 } | 6652 } |
OLD | NEW |