| 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 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 } | 414 } |
| 415 } | 415 } |
| 416 } | 416 } |
| 417 | 417 |
| 418 | 418 |
| 419 } // namespace internal | 419 } // namespace internal |
| 420 } // namespace v8 | 420 } // namespace v8 |
| 421 | 421 |
| 422 | 422 |
| 423 // Check that the debugger has been fully unloaded. | 423 // Check that the debugger has been fully unloaded. |
| 424 static void CheckDebuggerUnloaded(bool check_functions = false) { | 424 static void CheckDebuggerUnloaded(v8::Isolate* isolate, |
| 425 bool check_functions = false) { |
| 425 // Let debugger to unload itself synchronously | 426 // Let debugger to unload itself synchronously |
| 426 v8::Debug::ProcessDebugMessages(); | 427 v8::Debug::ProcessDebugMessages(isolate); |
| 427 | 428 |
| 428 v8::internal::CheckDebuggerUnloaded(check_functions); | 429 v8::internal::CheckDebuggerUnloaded(check_functions); |
| 429 } | 430 } |
| 430 | 431 |
| 431 | 432 |
| 432 // --- D e b u g E v e n t H a n d l e r s | 433 // --- D e b u g E v e n t H a n d l e r s |
| 433 // --- | 434 // --- |
| 434 // --- The different tests uses a number of debug event handlers. | 435 // --- The different tests uses a number of debug event handlers. |
| 435 // --- | 436 // --- |
| 436 | 437 |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 v8::HandleScope scope(env->GetIsolate()); | 912 v8::HandleScope scope(env->GetIsolate()); |
| 912 // Create a couple of functions for the test. | 913 // Create a couple of functions for the test. |
| 913 v8::Local<v8::Function> foo = | 914 v8::Local<v8::Function> foo = |
| 914 CompileFunction(&env, "function foo(){}", "foo"); | 915 CompileFunction(&env, "function foo(){}", "foo"); |
| 915 v8::Local<v8::Function> bar = | 916 v8::Local<v8::Function> bar = |
| 916 CompileFunction(&env, "function bar(){}", "bar"); | 917 CompileFunction(&env, "function bar(){}", "bar"); |
| 917 // Initially no functions are debugged. | 918 // Initially no functions are debugged. |
| 918 CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); | 919 CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); |
| 919 CHECK(!HasDebugInfo(foo)); | 920 CHECK(!HasDebugInfo(foo)); |
| 920 CHECK(!HasDebugInfo(bar)); | 921 CHECK(!HasDebugInfo(bar)); |
| 921 EnableDebugger(); | 922 EnableDebugger(env->GetIsolate()); |
| 922 // One function (foo) is debugged. | 923 // One function (foo) is debugged. |
| 923 int bp1 = SetBreakPoint(foo, 0); | 924 int bp1 = SetBreakPoint(foo, 0); |
| 924 CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); | 925 CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); |
| 925 CHECK(HasDebugInfo(foo)); | 926 CHECK(HasDebugInfo(foo)); |
| 926 CHECK(!HasDebugInfo(bar)); | 927 CHECK(!HasDebugInfo(bar)); |
| 927 // Two functions are debugged. | 928 // Two functions are debugged. |
| 928 int bp2 = SetBreakPoint(bar, 0); | 929 int bp2 = SetBreakPoint(bar, 0); |
| 929 CHECK_EQ(2, v8::internal::GetDebuggedFunctions()->length()); | 930 CHECK_EQ(2, v8::internal::GetDebuggedFunctions()->length()); |
| 930 CHECK(HasDebugInfo(foo)); | 931 CHECK(HasDebugInfo(foo)); |
| 931 CHECK(HasDebugInfo(bar)); | 932 CHECK(HasDebugInfo(bar)); |
| 932 // One function (bar) is debugged. | 933 // One function (bar) is debugged. |
| 933 ClearBreakPoint(bp1); | 934 ClearBreakPoint(bp1); |
| 934 CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); | 935 CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); |
| 935 CHECK(!HasDebugInfo(foo)); | 936 CHECK(!HasDebugInfo(foo)); |
| 936 CHECK(HasDebugInfo(bar)); | 937 CHECK(HasDebugInfo(bar)); |
| 937 // No functions are debugged. | 938 // No functions are debugged. |
| 938 ClearBreakPoint(bp2); | 939 ClearBreakPoint(bp2); |
| 939 DisableDebugger(); | 940 DisableDebugger(env->GetIsolate()); |
| 940 CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); | 941 CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); |
| 941 CHECK(!HasDebugInfo(foo)); | 942 CHECK(!HasDebugInfo(foo)); |
| 942 CHECK(!HasDebugInfo(bar)); | 943 CHECK(!HasDebugInfo(bar)); |
| 943 } | 944 } |
| 944 | 945 |
| 945 | 946 |
| 946 // Test that a break point can be set at an IC store location. | 947 // Test that a break point can be set at an IC store location. |
| 947 TEST(BreakPointICStore) { | 948 TEST(BreakPointICStore) { |
| 948 break_point_hit_count = 0; | 949 break_point_hit_count = 0; |
| 949 DebugLocalContext env; | 950 DebugLocalContext env; |
| 950 v8::HandleScope scope(env->GetIsolate()); | 951 v8::HandleScope scope(env->GetIsolate()); |
| 951 | 952 |
| 952 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 953 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 954 DebugEventBreakPointHitCount); |
| 953 v8::Local<v8::Function> foo = | 955 v8::Local<v8::Function> foo = |
| 954 CompileFunction(&env, "function foo(){bar=0;}", "foo"); | 956 CompileFunction(&env, "function foo(){bar=0;}", "foo"); |
| 955 | 957 |
| 956 // Run without breakpoints. | 958 // Run without breakpoints. |
| 957 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 959 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 958 CHECK_EQ(0, break_point_hit_count); | 960 CHECK_EQ(0, break_point_hit_count); |
| 959 | 961 |
| 960 // Run with breakpoint | 962 // Run with breakpoint |
| 961 int bp = SetBreakPoint(foo, 0); | 963 int bp = SetBreakPoint(foo, 0); |
| 962 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 964 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 963 CHECK_EQ(1, break_point_hit_count); | 965 CHECK_EQ(1, break_point_hit_count); |
| 964 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 966 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 965 CHECK_EQ(2, break_point_hit_count); | 967 CHECK_EQ(2, break_point_hit_count); |
| 966 | 968 |
| 967 // Run without breakpoints. | 969 // Run without breakpoints. |
| 968 ClearBreakPoint(bp); | 970 ClearBreakPoint(bp); |
| 969 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 971 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 970 CHECK_EQ(2, break_point_hit_count); | 972 CHECK_EQ(2, break_point_hit_count); |
| 971 | 973 |
| 972 v8::Debug::SetDebugEventListener(NULL); | 974 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 973 CheckDebuggerUnloaded(); | 975 CheckDebuggerUnloaded(env->GetIsolate()); |
| 974 } | 976 } |
| 975 | 977 |
| 976 | 978 |
| 977 // Test that a break point can be set at an IC load location. | 979 // Test that a break point can be set at an IC load location. |
| 978 TEST(BreakPointICLoad) { | 980 TEST(BreakPointICLoad) { |
| 979 break_point_hit_count = 0; | 981 break_point_hit_count = 0; |
| 980 DebugLocalContext env; | 982 DebugLocalContext env; |
| 981 v8::HandleScope scope(env->GetIsolate()); | 983 v8::HandleScope scope(env->GetIsolate()); |
| 982 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 984 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 985 DebugEventBreakPointHitCount); |
| 983 | 986 |
| 984 CompileRunChecked(env->GetIsolate(), "bar=1"); | 987 CompileRunChecked(env->GetIsolate(), "bar=1"); |
| 985 v8::Local<v8::Function> foo = | 988 v8::Local<v8::Function> foo = |
| 986 CompileFunction(&env, "function foo(){var x=bar;}", "foo"); | 989 CompileFunction(&env, "function foo(){var x=bar;}", "foo"); |
| 987 | 990 |
| 988 // Run without breakpoints. | 991 // Run without breakpoints. |
| 989 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 992 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 990 CHECK_EQ(0, break_point_hit_count); | 993 CHECK_EQ(0, break_point_hit_count); |
| 991 | 994 |
| 992 // Run with breakpoint. | 995 // Run with breakpoint. |
| 993 int bp = SetBreakPoint(foo, 0); | 996 int bp = SetBreakPoint(foo, 0); |
| 994 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 997 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 995 CHECK_EQ(1, break_point_hit_count); | 998 CHECK_EQ(1, break_point_hit_count); |
| 996 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 999 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 997 CHECK_EQ(2, break_point_hit_count); | 1000 CHECK_EQ(2, break_point_hit_count); |
| 998 | 1001 |
| 999 // Run without breakpoints. | 1002 // Run without breakpoints. |
| 1000 ClearBreakPoint(bp); | 1003 ClearBreakPoint(bp); |
| 1001 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1004 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1002 CHECK_EQ(2, break_point_hit_count); | 1005 CHECK_EQ(2, break_point_hit_count); |
| 1003 | 1006 |
| 1004 v8::Debug::SetDebugEventListener(NULL); | 1007 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1005 CheckDebuggerUnloaded(); | 1008 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1006 } | 1009 } |
| 1007 | 1010 |
| 1008 | 1011 |
| 1009 // Test that a break point can be set at an IC call location. | 1012 // Test that a break point can be set at an IC call location. |
| 1010 TEST(BreakPointICCall) { | 1013 TEST(BreakPointICCall) { |
| 1011 break_point_hit_count = 0; | 1014 break_point_hit_count = 0; |
| 1012 DebugLocalContext env; | 1015 DebugLocalContext env; |
| 1013 v8::HandleScope scope(env->GetIsolate()); | 1016 v8::HandleScope scope(env->GetIsolate()); |
| 1014 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1017 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1018 DebugEventBreakPointHitCount); |
| 1015 CompileRunChecked(env->GetIsolate(), "function bar(){}"); | 1019 CompileRunChecked(env->GetIsolate(), "function bar(){}"); |
| 1016 v8::Local<v8::Function> foo = | 1020 v8::Local<v8::Function> foo = |
| 1017 CompileFunction(&env, "function foo(){bar();}", "foo"); | 1021 CompileFunction(&env, "function foo(){bar();}", "foo"); |
| 1018 | 1022 |
| 1019 // Run without breakpoints. | 1023 // Run without breakpoints. |
| 1020 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1024 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1021 CHECK_EQ(0, break_point_hit_count); | 1025 CHECK_EQ(0, break_point_hit_count); |
| 1022 | 1026 |
| 1023 // Run with breakpoint | 1027 // Run with breakpoint |
| 1024 int bp = SetBreakPoint(foo, 0); | 1028 int bp = SetBreakPoint(foo, 0); |
| 1025 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1029 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1026 CHECK_EQ(1, break_point_hit_count); | 1030 CHECK_EQ(1, break_point_hit_count); |
| 1027 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1031 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1028 CHECK_EQ(2, break_point_hit_count); | 1032 CHECK_EQ(2, break_point_hit_count); |
| 1029 | 1033 |
| 1030 // Run without breakpoints. | 1034 // Run without breakpoints. |
| 1031 ClearBreakPoint(bp); | 1035 ClearBreakPoint(bp); |
| 1032 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1036 foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1033 CHECK_EQ(2, break_point_hit_count); | 1037 CHECK_EQ(2, break_point_hit_count); |
| 1034 | 1038 |
| 1035 v8::Debug::SetDebugEventListener(NULL); | 1039 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1036 CheckDebuggerUnloaded(); | 1040 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1037 } | 1041 } |
| 1038 | 1042 |
| 1039 | 1043 |
| 1040 // Test that a break point can be set at an IC call location and survive a GC. | 1044 // Test that a break point can be set at an IC call location and survive a GC. |
| 1041 TEST(BreakPointICCallWithGC) { | 1045 TEST(BreakPointICCallWithGC) { |
| 1042 break_point_hit_count = 0; | 1046 break_point_hit_count = 0; |
| 1043 DebugLocalContext env; | 1047 DebugLocalContext env; |
| 1044 v8::HandleScope scope(env->GetIsolate()); | 1048 v8::HandleScope scope(env->GetIsolate()); |
| 1045 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage); | 1049 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1050 DebugEventBreakPointCollectGarbage); |
| 1046 CompileRunChecked(env->GetIsolate(), "function bar(){return 1;}"); | 1051 CompileRunChecked(env->GetIsolate(), "function bar(){return 1;}"); |
| 1047 v8::Local<v8::Function> foo = | 1052 v8::Local<v8::Function> foo = |
| 1048 CompileFunction(&env, "function foo(){return bar();}", "foo"); | 1053 CompileFunction(&env, "function foo(){return bar();}", "foo"); |
| 1049 v8::Local<v8::Context> context = env.context(); | 1054 v8::Local<v8::Context> context = env.context(); |
| 1050 | 1055 |
| 1051 // Run without breakpoints. | 1056 // Run without breakpoints. |
| 1052 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) | 1057 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) |
| 1053 .ToLocalChecked() | 1058 .ToLocalChecked() |
| 1054 ->Int32Value(context) | 1059 ->Int32Value(context) |
| 1055 .FromJust()); | 1060 .FromJust()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1066 .ToLocalChecked() | 1071 .ToLocalChecked() |
| 1067 ->Int32Value(context) | 1072 ->Int32Value(context) |
| 1068 .FromJust()); | 1073 .FromJust()); |
| 1069 CHECK_EQ(2, break_point_hit_count); | 1074 CHECK_EQ(2, break_point_hit_count); |
| 1070 | 1075 |
| 1071 // Run without breakpoints. | 1076 // Run without breakpoints. |
| 1072 ClearBreakPoint(bp); | 1077 ClearBreakPoint(bp); |
| 1073 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1078 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1074 CHECK_EQ(2, break_point_hit_count); | 1079 CHECK_EQ(2, break_point_hit_count); |
| 1075 | 1080 |
| 1076 v8::Debug::SetDebugEventListener(NULL); | 1081 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1077 CheckDebuggerUnloaded(); | 1082 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1078 } | 1083 } |
| 1079 | 1084 |
| 1080 | 1085 |
| 1081 // Test that a break point can be set at an IC call location and survive a GC. | 1086 // Test that a break point can be set at an IC call location and survive a GC. |
| 1082 TEST(BreakPointConstructCallWithGC) { | 1087 TEST(BreakPointConstructCallWithGC) { |
| 1083 break_point_hit_count = 0; | 1088 break_point_hit_count = 0; |
| 1084 DebugLocalContext env; | 1089 DebugLocalContext env; |
| 1085 v8::HandleScope scope(env->GetIsolate()); | 1090 v8::HandleScope scope(env->GetIsolate()); |
| 1086 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage); | 1091 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1092 DebugEventBreakPointCollectGarbage); |
| 1087 CompileRunChecked(env->GetIsolate(), "function bar(){ this.x = 1;}"); | 1093 CompileRunChecked(env->GetIsolate(), "function bar(){ this.x = 1;}"); |
| 1088 v8::Local<v8::Function> foo = | 1094 v8::Local<v8::Function> foo = |
| 1089 CompileFunction(&env, "function foo(){return new bar(1).x;}", "foo"); | 1095 CompileFunction(&env, "function foo(){return new bar(1).x;}", "foo"); |
| 1090 v8::Local<v8::Context> context = env.context(); | 1096 v8::Local<v8::Context> context = env.context(); |
| 1091 | 1097 |
| 1092 // Run without breakpoints. | 1098 // Run without breakpoints. |
| 1093 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) | 1099 CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL) |
| 1094 .ToLocalChecked() | 1100 .ToLocalChecked() |
| 1095 ->Int32Value(context) | 1101 ->Int32Value(context) |
| 1096 .FromJust()); | 1102 .FromJust()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1107 .ToLocalChecked() | 1113 .ToLocalChecked() |
| 1108 ->Int32Value(context) | 1114 ->Int32Value(context) |
| 1109 .FromJust()); | 1115 .FromJust()); |
| 1110 CHECK_EQ(2, break_point_hit_count); | 1116 CHECK_EQ(2, break_point_hit_count); |
| 1111 | 1117 |
| 1112 // Run without breakpoints. | 1118 // Run without breakpoints. |
| 1113 ClearBreakPoint(bp); | 1119 ClearBreakPoint(bp); |
| 1114 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1120 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1115 CHECK_EQ(2, break_point_hit_count); | 1121 CHECK_EQ(2, break_point_hit_count); |
| 1116 | 1122 |
| 1117 v8::Debug::SetDebugEventListener(NULL); | 1123 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1118 CheckDebuggerUnloaded(); | 1124 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1119 } | 1125 } |
| 1120 | 1126 |
| 1121 | 1127 |
| 1122 // Test that a break point can be set at a return store location. | 1128 // Test that a break point can be set at a return store location. |
| 1123 TEST(BreakPointReturn) { | 1129 TEST(BreakPointReturn) { |
| 1124 break_point_hit_count = 0; | 1130 break_point_hit_count = 0; |
| 1125 DebugLocalContext env; | 1131 DebugLocalContext env; |
| 1126 v8::HandleScope scope(env->GetIsolate()); | 1132 v8::HandleScope scope(env->GetIsolate()); |
| 1127 | 1133 |
| 1128 // Create a functions for checking the source line and column when hitting | 1134 // Create a functions for checking the source line and column when hitting |
| 1129 // a break point. | 1135 // a break point. |
| 1130 frame_source_line = CompileFunction(&env, | 1136 frame_source_line = CompileFunction(&env, |
| 1131 frame_source_line_source, | 1137 frame_source_line_source, |
| 1132 "frame_source_line"); | 1138 "frame_source_line"); |
| 1133 frame_source_column = CompileFunction(&env, | 1139 frame_source_column = CompileFunction(&env, |
| 1134 frame_source_column_source, | 1140 frame_source_column_source, |
| 1135 "frame_source_column"); | 1141 "frame_source_column"); |
| 1136 | 1142 |
| 1137 | 1143 |
| 1138 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1144 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1145 DebugEventBreakPointHitCount); |
| 1139 v8::Local<v8::Function> foo = | 1146 v8::Local<v8::Function> foo = |
| 1140 CompileFunction(&env, "function foo(){}", "foo"); | 1147 CompileFunction(&env, "function foo(){}", "foo"); |
| 1141 v8::Local<v8::Context> context = env.context(); | 1148 v8::Local<v8::Context> context = env.context(); |
| 1142 | 1149 |
| 1143 // Run without breakpoints. | 1150 // Run without breakpoints. |
| 1144 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1151 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1145 CHECK_EQ(0, break_point_hit_count); | 1152 CHECK_EQ(0, break_point_hit_count); |
| 1146 | 1153 |
| 1147 // Run with breakpoint | 1154 // Run with breakpoint |
| 1148 int bp = SetBreakPoint(foo, 0); | 1155 int bp = SetBreakPoint(foo, 0); |
| 1149 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1156 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1150 CHECK_EQ(1, break_point_hit_count); | 1157 CHECK_EQ(1, break_point_hit_count); |
| 1151 CHECK_EQ(0, last_source_line); | 1158 CHECK_EQ(0, last_source_line); |
| 1152 CHECK_EQ(15, last_source_column); | 1159 CHECK_EQ(15, last_source_column); |
| 1153 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1160 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1154 CHECK_EQ(2, break_point_hit_count); | 1161 CHECK_EQ(2, break_point_hit_count); |
| 1155 CHECK_EQ(0, last_source_line); | 1162 CHECK_EQ(0, last_source_line); |
| 1156 CHECK_EQ(15, last_source_column); | 1163 CHECK_EQ(15, last_source_column); |
| 1157 | 1164 |
| 1158 // Run without breakpoints. | 1165 // Run without breakpoints. |
| 1159 ClearBreakPoint(bp); | 1166 ClearBreakPoint(bp); |
| 1160 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1167 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1161 CHECK_EQ(2, break_point_hit_count); | 1168 CHECK_EQ(2, break_point_hit_count); |
| 1162 | 1169 |
| 1163 v8::Debug::SetDebugEventListener(NULL); | 1170 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1164 CheckDebuggerUnloaded(); | 1171 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1165 } | 1172 } |
| 1166 | 1173 |
| 1167 | 1174 |
| 1168 static void CallWithBreakPoints(v8::Local<v8::Context> context, | 1175 static void CallWithBreakPoints(v8::Local<v8::Context> context, |
| 1169 v8::Local<v8::Object> recv, | 1176 v8::Local<v8::Object> recv, |
| 1170 v8::Local<v8::Function> f, | 1177 v8::Local<v8::Function> f, |
| 1171 int break_point_count, int call_count) { | 1178 int break_point_count, int call_count) { |
| 1172 break_point_hit_count = 0; | 1179 break_point_hit_count = 0; |
| 1173 for (int i = 0; i < call_count; i++) { | 1180 for (int i = 0; i < call_count; i++) { |
| 1174 f->Call(context, recv, 0, NULL).ToLocalChecked(); | 1181 f->Call(context, recv, 0, NULL).ToLocalChecked(); |
| 1175 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); | 1182 CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); |
| 1176 } | 1183 } |
| 1177 } | 1184 } |
| 1178 | 1185 |
| 1179 | 1186 |
| 1180 // Test GC during break point processing. | 1187 // Test GC during break point processing. |
| 1181 TEST(GCDuringBreakPointProcessing) { | 1188 TEST(GCDuringBreakPointProcessing) { |
| 1182 break_point_hit_count = 0; | 1189 break_point_hit_count = 0; |
| 1183 DebugLocalContext env; | 1190 DebugLocalContext env; |
| 1184 v8::HandleScope scope(env->GetIsolate()); | 1191 v8::HandleScope scope(env->GetIsolate()); |
| 1185 v8::Local<v8::Context> context = env.context(); | 1192 v8::Local<v8::Context> context = env.context(); |
| 1186 | 1193 |
| 1187 v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage); | 1194 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1195 DebugEventBreakPointCollectGarbage); |
| 1188 v8::Local<v8::Function> foo; | 1196 v8::Local<v8::Function> foo; |
| 1189 | 1197 |
| 1190 // Test IC store break point with garbage collection. | 1198 // Test IC store break point with garbage collection. |
| 1191 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); | 1199 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); |
| 1192 SetBreakPoint(foo, 0); | 1200 SetBreakPoint(foo, 0); |
| 1193 CallWithBreakPoints(context, env->Global(), foo, 1, 10); | 1201 CallWithBreakPoints(context, env->Global(), foo, 1, 10); |
| 1194 | 1202 |
| 1195 // Test IC load break point with garbage collection. | 1203 // Test IC load break point with garbage collection. |
| 1196 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); | 1204 foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); |
| 1197 SetBreakPoint(foo, 0); | 1205 SetBreakPoint(foo, 0); |
| 1198 CallWithBreakPoints(context, env->Global(), foo, 1, 10); | 1206 CallWithBreakPoints(context, env->Global(), foo, 1, 10); |
| 1199 | 1207 |
| 1200 // Test IC call break point with garbage collection. | 1208 // Test IC call break point with garbage collection. |
| 1201 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); | 1209 foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); |
| 1202 SetBreakPoint(foo, 0); | 1210 SetBreakPoint(foo, 0); |
| 1203 CallWithBreakPoints(context, env->Global(), foo, 1, 10); | 1211 CallWithBreakPoints(context, env->Global(), foo, 1, 10); |
| 1204 | 1212 |
| 1205 // Test return break point with garbage collection. | 1213 // Test return break point with garbage collection. |
| 1206 foo = CompileFunction(&env, "function foo(){}", "foo"); | 1214 foo = CompileFunction(&env, "function foo(){}", "foo"); |
| 1207 SetBreakPoint(foo, 0); | 1215 SetBreakPoint(foo, 0); |
| 1208 CallWithBreakPoints(context, env->Global(), foo, 1, 25); | 1216 CallWithBreakPoints(context, env->Global(), foo, 1, 25); |
| 1209 | 1217 |
| 1210 // Test debug break slot break point with garbage collection. | 1218 // Test debug break slot break point with garbage collection. |
| 1211 foo = CompileFunction(&env, "function foo(){var a;}", "foo"); | 1219 foo = CompileFunction(&env, "function foo(){var a;}", "foo"); |
| 1212 SetBreakPoint(foo, 0); | 1220 SetBreakPoint(foo, 0); |
| 1213 CallWithBreakPoints(context, env->Global(), foo, 1, 25); | 1221 CallWithBreakPoints(context, env->Global(), foo, 1, 25); |
| 1214 | 1222 |
| 1215 v8::Debug::SetDebugEventListener(NULL); | 1223 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1216 CheckDebuggerUnloaded(); | 1224 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1217 } | 1225 } |
| 1218 | 1226 |
| 1219 | 1227 |
| 1220 // Call the function three times with different garbage collections in between | 1228 // Call the function three times with different garbage collections in between |
| 1221 // and make sure that the break point survives. | 1229 // and make sure that the break point survives. |
| 1222 static void CallAndGC(v8::Local<v8::Context> context, | 1230 static void CallAndGC(v8::Local<v8::Context> context, |
| 1223 v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { | 1231 v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { |
| 1224 break_point_hit_count = 0; | 1232 break_point_hit_count = 0; |
| 1225 | 1233 |
| 1226 for (int i = 0; i < 3; i++) { | 1234 for (int i = 0; i < 3; i++) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1241 } | 1249 } |
| 1242 | 1250 |
| 1243 | 1251 |
| 1244 // Test that a break point can be set at a return store location. | 1252 // Test that a break point can be set at a return store location. |
| 1245 TEST(BreakPointSurviveGC) { | 1253 TEST(BreakPointSurviveGC) { |
| 1246 break_point_hit_count = 0; | 1254 break_point_hit_count = 0; |
| 1247 DebugLocalContext env; | 1255 DebugLocalContext env; |
| 1248 v8::HandleScope scope(env->GetIsolate()); | 1256 v8::HandleScope scope(env->GetIsolate()); |
| 1249 v8::Local<v8::Context> context = env.context(); | 1257 v8::Local<v8::Context> context = env.context(); |
| 1250 | 1258 |
| 1251 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1259 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1260 DebugEventBreakPointHitCount); |
| 1252 v8::Local<v8::Function> foo; | 1261 v8::Local<v8::Function> foo; |
| 1253 | 1262 |
| 1254 // Test IC store break point with garbage collection. | 1263 // Test IC store break point with garbage collection. |
| 1255 { | 1264 { |
| 1256 CompileFunction(&env, "function foo(){}", "foo"); | 1265 CompileFunction(&env, "function foo(){}", "foo"); |
| 1257 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); | 1266 foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); |
| 1258 SetBreakPoint(foo, 0); | 1267 SetBreakPoint(foo, 0); |
| 1259 } | 1268 } |
| 1260 CallAndGC(context, env->Global(), foo); | 1269 CallAndGC(context, env->Global(), foo); |
| 1261 | 1270 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1287 | 1296 |
| 1288 // Test non IC break point with garbage collection. | 1297 // Test non IC break point with garbage collection. |
| 1289 { | 1298 { |
| 1290 CompileFunction(&env, "function foo(){}", "foo"); | 1299 CompileFunction(&env, "function foo(){}", "foo"); |
| 1291 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo"); | 1300 foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo"); |
| 1292 SetBreakPoint(foo, 0); | 1301 SetBreakPoint(foo, 0); |
| 1293 } | 1302 } |
| 1294 CallAndGC(context, env->Global(), foo); | 1303 CallAndGC(context, env->Global(), foo); |
| 1295 | 1304 |
| 1296 | 1305 |
| 1297 v8::Debug::SetDebugEventListener(NULL); | 1306 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1298 CheckDebuggerUnloaded(); | 1307 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1299 } | 1308 } |
| 1300 | 1309 |
| 1301 | 1310 |
| 1302 // Test that break points can be set using the global Debug object. | 1311 // Test that break points can be set using the global Debug object. |
| 1303 TEST(BreakPointThroughJavaScript) { | 1312 TEST(BreakPointThroughJavaScript) { |
| 1304 break_point_hit_count = 0; | 1313 break_point_hit_count = 0; |
| 1305 DebugLocalContext env; | 1314 DebugLocalContext env; |
| 1306 v8::Isolate* isolate = env->GetIsolate(); | 1315 v8::Isolate* isolate = env->GetIsolate(); |
| 1307 v8::HandleScope scope(isolate); | 1316 v8::HandleScope scope(isolate); |
| 1308 v8::Local<v8::Context> context = env.context(); | 1317 v8::Local<v8::Context> context = env.context(); |
| 1309 env.ExposeDebug(); | 1318 env.ExposeDebug(); |
| 1310 | 1319 |
| 1311 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1320 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 1312 CompileRunChecked(isolate, "function bar(){}"); | 1321 CompileRunChecked(isolate, "function bar(){}"); |
| 1313 CompileFunction(isolate, "function foo(){bar();bar();}", "foo"); | 1322 CompileFunction(isolate, "function foo(){bar();bar();}", "foo"); |
| 1314 // 012345678901234567890 | 1323 // 012345678901234567890 |
| 1315 // 1 2 | 1324 // 1 2 |
| 1316 // Break points are set at position 3 and 9 | 1325 // Break points are set at position 3 and 9 |
| 1317 v8::Local<v8::String> source = v8_str(env->GetIsolate(), "foo()"); | 1326 v8::Local<v8::String> source = v8_str(env->GetIsolate(), "foo()"); |
| 1318 v8::Local<v8::Script> foo = | 1327 v8::Local<v8::Script> foo = |
| 1319 v8::Script::Compile(context, source).ToLocalChecked(); | 1328 v8::Script::Compile(context, source).ToLocalChecked(); |
| 1320 | 1329 |
| 1321 CHECK_EQ(0, break_point_hit_count); | 1330 CHECK_EQ(0, break_point_hit_count); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1339 foo->Run(context).ToLocalChecked(); | 1348 foo->Run(context).ToLocalChecked(); |
| 1340 CHECK_EQ(7, break_point_hit_count); | 1349 CHECK_EQ(7, break_point_hit_count); |
| 1341 foo->Run(context).ToLocalChecked(); | 1350 foo->Run(context).ToLocalChecked(); |
| 1342 CHECK_EQ(8, break_point_hit_count); | 1351 CHECK_EQ(8, break_point_hit_count); |
| 1343 | 1352 |
| 1344 // Run without breakpoints. | 1353 // Run without breakpoints. |
| 1345 ClearBreakPointFromJS(env->GetIsolate(), bp1); | 1354 ClearBreakPointFromJS(env->GetIsolate(), bp1); |
| 1346 foo->Run(context).ToLocalChecked(); | 1355 foo->Run(context).ToLocalChecked(); |
| 1347 CHECK_EQ(8, break_point_hit_count); | 1356 CHECK_EQ(8, break_point_hit_count); |
| 1348 | 1357 |
| 1349 v8::Debug::SetDebugEventListener(NULL); | 1358 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 1350 CheckDebuggerUnloaded(); | 1359 CheckDebuggerUnloaded(isolate); |
| 1351 | 1360 |
| 1352 // Make sure that the break point numbers are consecutive. | 1361 // Make sure that the break point numbers are consecutive. |
| 1353 CHECK_EQ(1, bp1); | 1362 CHECK_EQ(1, bp1); |
| 1354 CHECK_EQ(2, bp2); | 1363 CHECK_EQ(2, bp2); |
| 1355 } | 1364 } |
| 1356 | 1365 |
| 1357 | 1366 |
| 1358 // Test that break points on scripts identified by name can be set using the | 1367 // Test that break points on scripts identified by name can be set using the |
| 1359 // global Debug object. | 1368 // global Debug object. |
| 1360 TEST(ScriptBreakPointByNameThroughJavaScript) { | 1369 TEST(ScriptBreakPointByNameThroughJavaScript) { |
| 1361 break_point_hit_count = 0; | 1370 break_point_hit_count = 0; |
| 1362 DebugLocalContext env; | 1371 DebugLocalContext env; |
| 1363 v8::Isolate* isolate = env->GetIsolate(); | 1372 v8::Isolate* isolate = env->GetIsolate(); |
| 1364 v8::HandleScope scope(isolate); | 1373 v8::HandleScope scope(isolate); |
| 1365 v8::Local<v8::Context> context = env.context(); | 1374 v8::Local<v8::Context> context = env.context(); |
| 1366 env.ExposeDebug(); | 1375 env.ExposeDebug(); |
| 1367 | 1376 |
| 1368 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1377 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 1369 | 1378 |
| 1370 v8::Local<v8::String> script = v8_str(isolate, | 1379 v8::Local<v8::String> script = v8_str(isolate, |
| 1371 "function f() {\n" | 1380 "function f() {\n" |
| 1372 " function h() {\n" | 1381 " function h() {\n" |
| 1373 " a = 0; // line 2\n" | 1382 " a = 0; // line 2\n" |
| 1374 " }\n" | 1383 " }\n" |
| 1375 " b = 1; // line 4\n" | 1384 " b = 1; // line 4\n" |
| 1376 " return h();\n" | 1385 " return h();\n" |
| 1377 "}\n" | 1386 "}\n" |
| 1378 "\n" | 1387 "\n" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 ClearBreakPointFromJS(isolate, sbp2); | 1453 ClearBreakPointFromJS(isolate, sbp2); |
| 1445 ClearBreakPointFromJS(isolate, sbp3); | 1454 ClearBreakPointFromJS(isolate, sbp3); |
| 1446 ClearBreakPointFromJS(isolate, sbp4); | 1455 ClearBreakPointFromJS(isolate, sbp4); |
| 1447 ClearBreakPointFromJS(isolate, sbp5); | 1456 ClearBreakPointFromJS(isolate, sbp5); |
| 1448 ClearBreakPointFromJS(isolate, sbp6); | 1457 ClearBreakPointFromJS(isolate, sbp6); |
| 1449 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1458 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1450 CHECK_EQ(0, break_point_hit_count); | 1459 CHECK_EQ(0, break_point_hit_count); |
| 1451 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1460 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1452 CHECK_EQ(0, break_point_hit_count); | 1461 CHECK_EQ(0, break_point_hit_count); |
| 1453 | 1462 |
| 1454 v8::Debug::SetDebugEventListener(NULL); | 1463 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 1455 CheckDebuggerUnloaded(); | 1464 CheckDebuggerUnloaded(isolate); |
| 1456 | 1465 |
| 1457 // Make sure that the break point numbers are consecutive. | 1466 // Make sure that the break point numbers are consecutive. |
| 1458 CHECK_EQ(1, sbp1); | 1467 CHECK_EQ(1, sbp1); |
| 1459 CHECK_EQ(2, sbp2); | 1468 CHECK_EQ(2, sbp2); |
| 1460 CHECK_EQ(3, sbp3); | 1469 CHECK_EQ(3, sbp3); |
| 1461 CHECK_EQ(4, sbp4); | 1470 CHECK_EQ(4, sbp4); |
| 1462 CHECK_EQ(5, sbp5); | 1471 CHECK_EQ(5, sbp5); |
| 1463 CHECK_EQ(6, sbp6); | 1472 CHECK_EQ(6, sbp6); |
| 1464 } | 1473 } |
| 1465 | 1474 |
| 1466 | 1475 |
| 1467 TEST(ScriptBreakPointByIdThroughJavaScript) { | 1476 TEST(ScriptBreakPointByIdThroughJavaScript) { |
| 1468 break_point_hit_count = 0; | 1477 break_point_hit_count = 0; |
| 1469 DebugLocalContext env; | 1478 DebugLocalContext env; |
| 1470 v8::Isolate* isolate = env->GetIsolate(); | 1479 v8::Isolate* isolate = env->GetIsolate(); |
| 1471 v8::HandleScope scope(isolate); | 1480 v8::HandleScope scope(isolate); |
| 1472 v8::Local<v8::Context> context = env.context(); | 1481 v8::Local<v8::Context> context = env.context(); |
| 1473 env.ExposeDebug(); | 1482 env.ExposeDebug(); |
| 1474 | 1483 |
| 1475 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1484 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 1476 | 1485 |
| 1477 v8::Local<v8::String> source = v8_str(isolate, | 1486 v8::Local<v8::String> source = v8_str(isolate, |
| 1478 "function f() {\n" | 1487 "function f() {\n" |
| 1479 " function h() {\n" | 1488 " function h() {\n" |
| 1480 " a = 0; // line 2\n" | 1489 " a = 0; // line 2\n" |
| 1481 " }\n" | 1490 " }\n" |
| 1482 " b = 1; // line 4\n" | 1491 " b = 1; // line 4\n" |
| 1483 " return h();\n" | 1492 " return h();\n" |
| 1484 "}\n" | 1493 "}\n" |
| 1485 "\n" | 1494 "\n" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 ClearBreakPointFromJS(env->GetIsolate(), sbp2); | 1562 ClearBreakPointFromJS(env->GetIsolate(), sbp2); |
| 1554 ClearBreakPointFromJS(env->GetIsolate(), sbp3); | 1563 ClearBreakPointFromJS(env->GetIsolate(), sbp3); |
| 1555 ClearBreakPointFromJS(env->GetIsolate(), sbp4); | 1564 ClearBreakPointFromJS(env->GetIsolate(), sbp4); |
| 1556 ClearBreakPointFromJS(env->GetIsolate(), sbp5); | 1565 ClearBreakPointFromJS(env->GetIsolate(), sbp5); |
| 1557 ClearBreakPointFromJS(env->GetIsolate(), sbp6); | 1566 ClearBreakPointFromJS(env->GetIsolate(), sbp6); |
| 1558 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1567 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1559 CHECK_EQ(0, break_point_hit_count); | 1568 CHECK_EQ(0, break_point_hit_count); |
| 1560 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1569 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1561 CHECK_EQ(0, break_point_hit_count); | 1570 CHECK_EQ(0, break_point_hit_count); |
| 1562 | 1571 |
| 1563 v8::Debug::SetDebugEventListener(NULL); | 1572 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 1564 CheckDebuggerUnloaded(); | 1573 CheckDebuggerUnloaded(isolate); |
| 1565 | 1574 |
| 1566 // Make sure that the break point numbers are consecutive. | 1575 // Make sure that the break point numbers are consecutive. |
| 1567 CHECK_EQ(1, sbp1); | 1576 CHECK_EQ(1, sbp1); |
| 1568 CHECK_EQ(2, sbp2); | 1577 CHECK_EQ(2, sbp2); |
| 1569 CHECK_EQ(3, sbp3); | 1578 CHECK_EQ(3, sbp3); |
| 1570 CHECK_EQ(4, sbp4); | 1579 CHECK_EQ(4, sbp4); |
| 1571 CHECK_EQ(5, sbp5); | 1580 CHECK_EQ(5, sbp5); |
| 1572 CHECK_EQ(6, sbp6); | 1581 CHECK_EQ(6, sbp6); |
| 1573 } | 1582 } |
| 1574 | 1583 |
| 1575 | 1584 |
| 1576 // Test conditional script break points. | 1585 // Test conditional script break points. |
| 1577 TEST(EnableDisableScriptBreakPoint) { | 1586 TEST(EnableDisableScriptBreakPoint) { |
| 1578 break_point_hit_count = 0; | 1587 break_point_hit_count = 0; |
| 1579 DebugLocalContext env; | 1588 DebugLocalContext env; |
| 1580 v8::Isolate* isolate = env->GetIsolate(); | 1589 v8::Isolate* isolate = env->GetIsolate(); |
| 1581 v8::HandleScope scope(isolate); | 1590 v8::HandleScope scope(isolate); |
| 1582 v8::Local<v8::Context> context = env.context(); | 1591 v8::Local<v8::Context> context = env.context(); |
| 1583 env.ExposeDebug(); | 1592 env.ExposeDebug(); |
| 1584 | 1593 |
| 1585 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1594 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 1586 | 1595 |
| 1587 v8::Local<v8::String> script = v8_str(isolate, | 1596 v8::Local<v8::String> script = v8_str(isolate, |
| 1588 "function f() {\n" | 1597 "function f() {\n" |
| 1589 " a = 0; // line 1\n" | 1598 " a = 0; // line 1\n" |
| 1590 "};"); | 1599 "};"); |
| 1591 | 1600 |
| 1592 // Compile the script and get function f. | 1601 // Compile the script and get function f. |
| 1593 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test")); | 1602 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test")); |
| 1594 v8::Script::Compile(context, script, &origin) | 1603 v8::Script::Compile(context, script, &origin) |
| 1595 .ToLocalChecked() | 1604 .ToLocalChecked() |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1625 .ToLocalChecked(); | 1634 .ToLocalChecked(); |
| 1626 f = v8::Local<v8::Function>::Cast( | 1635 f = v8::Local<v8::Function>::Cast( |
| 1627 env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked()); | 1636 env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked()); |
| 1628 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1637 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1629 CHECK_EQ(2, break_point_hit_count); | 1638 CHECK_EQ(2, break_point_hit_count); |
| 1630 | 1639 |
| 1631 EnableScriptBreakPointFromJS(isolate, sbp); | 1640 EnableScriptBreakPointFromJS(isolate, sbp); |
| 1632 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1641 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1633 CHECK_EQ(3, break_point_hit_count); | 1642 CHECK_EQ(3, break_point_hit_count); |
| 1634 | 1643 |
| 1635 v8::Debug::SetDebugEventListener(NULL); | 1644 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 1636 CheckDebuggerUnloaded(); | 1645 CheckDebuggerUnloaded(isolate); |
| 1637 } | 1646 } |
| 1638 | 1647 |
| 1639 | 1648 |
| 1640 // Test conditional script break points. | 1649 // Test conditional script break points. |
| 1641 TEST(ConditionalScriptBreakPoint) { | 1650 TEST(ConditionalScriptBreakPoint) { |
| 1642 break_point_hit_count = 0; | 1651 break_point_hit_count = 0; |
| 1643 DebugLocalContext env; | 1652 DebugLocalContext env; |
| 1644 v8::HandleScope scope(env->GetIsolate()); | 1653 v8::HandleScope scope(env->GetIsolate()); |
| 1645 env.ExposeDebug(); | 1654 env.ExposeDebug(); |
| 1646 | 1655 |
| 1647 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1656 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1657 DebugEventBreakPointHitCount); |
| 1648 | 1658 |
| 1649 v8::Local<v8::String> script = v8_str(env->GetIsolate(), | 1659 v8::Local<v8::String> script = v8_str(env->GetIsolate(), |
| 1650 "count = 0;\n" | 1660 "count = 0;\n" |
| 1651 "function f() {\n" | 1661 "function f() {\n" |
| 1652 " g(count++); // line 2\n" | 1662 " g(count++); // line 2\n" |
| 1653 "};\n" | 1663 "};\n" |
| 1654 "function g(x) {\n" | 1664 "function g(x) {\n" |
| 1655 " var a=x; // line 5\n" | 1665 " var a=x; // line 5\n" |
| 1656 "};"); | 1666 "};"); |
| 1657 | 1667 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1697 env->Global() | 1707 env->Global() |
| 1698 ->Get(context, v8_str(env->GetIsolate(), "f")) | 1708 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 1699 .ToLocalChecked()); | 1709 .ToLocalChecked()); |
| 1700 | 1710 |
| 1701 break_point_hit_count = 0; | 1711 break_point_hit_count = 0; |
| 1702 for (int i = 0; i < 10; i++) { | 1712 for (int i = 0; i < 10; i++) { |
| 1703 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); | 1713 f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked(); |
| 1704 } | 1714 } |
| 1705 CHECK_EQ(5, break_point_hit_count); | 1715 CHECK_EQ(5, break_point_hit_count); |
| 1706 | 1716 |
| 1707 v8::Debug::SetDebugEventListener(NULL); | 1717 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1708 CheckDebuggerUnloaded(); | 1718 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1709 } | 1719 } |
| 1710 | 1720 |
| 1711 | 1721 |
| 1712 // Test ignore count on script break points. | 1722 // Test ignore count on script break points. |
| 1713 TEST(ScriptBreakPointIgnoreCount) { | 1723 TEST(ScriptBreakPointIgnoreCount) { |
| 1714 break_point_hit_count = 0; | 1724 break_point_hit_count = 0; |
| 1715 DebugLocalContext env; | 1725 DebugLocalContext env; |
| 1716 v8::HandleScope scope(env->GetIsolate()); | 1726 v8::HandleScope scope(env->GetIsolate()); |
| 1717 env.ExposeDebug(); | 1727 env.ExposeDebug(); |
| 1718 | 1728 |
| 1719 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1729 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1730 DebugEventBreakPointHitCount); |
| 1720 | 1731 |
| 1721 v8::Local<v8::String> script = v8_str(env->GetIsolate(), | 1732 v8::Local<v8::String> script = v8_str(env->GetIsolate(), |
| 1722 "function f() {\n" | 1733 "function f() {\n" |
| 1723 " a = 0; // line 1\n" | 1734 " a = 0; // line 1\n" |
| 1724 "};"); | 1735 "};"); |
| 1725 | 1736 |
| 1726 // Compile the script and get function f. | 1737 // Compile the script and get function f. |
| 1727 v8::Local<v8::Context> context = env.context(); | 1738 v8::Local<v8::Context> context = env.context(); |
| 1728 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(env->GetIsolate(), "test")); | 1739 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(env->GetIsolate(), "test")); |
| 1729 v8::Script::Compile(context, script, &origin) | 1740 v8::Script::Compile(context, script, &origin) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 env->Global() | 1773 env->Global() |
| 1763 ->Get(context, v8_str(env->GetIsolate(), "f")) | 1774 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 1764 .ToLocalChecked()); | 1775 .ToLocalChecked()); |
| 1765 | 1776 |
| 1766 break_point_hit_count = 0; | 1777 break_point_hit_count = 0; |
| 1767 for (int i = 0; i < 10; i++) { | 1778 for (int i = 0; i < 10; i++) { |
| 1768 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1779 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1769 } | 1780 } |
| 1770 CHECK_EQ(5, break_point_hit_count); | 1781 CHECK_EQ(5, break_point_hit_count); |
| 1771 | 1782 |
| 1772 v8::Debug::SetDebugEventListener(NULL); | 1783 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1773 CheckDebuggerUnloaded(); | 1784 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1774 } | 1785 } |
| 1775 | 1786 |
| 1776 | 1787 |
| 1777 // Test that script break points survive when a script is reloaded. | 1788 // Test that script break points survive when a script is reloaded. |
| 1778 TEST(ScriptBreakPointReload) { | 1789 TEST(ScriptBreakPointReload) { |
| 1779 break_point_hit_count = 0; | 1790 break_point_hit_count = 0; |
| 1780 DebugLocalContext env; | 1791 DebugLocalContext env; |
| 1781 v8::HandleScope scope(env->GetIsolate()); | 1792 v8::HandleScope scope(env->GetIsolate()); |
| 1782 env.ExposeDebug(); | 1793 env.ExposeDebug(); |
| 1783 | 1794 |
| 1784 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1795 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1796 DebugEventBreakPointHitCount); |
| 1785 | 1797 |
| 1786 v8::Local<v8::Context> context = env.context(); | 1798 v8::Local<v8::Context> context = env.context(); |
| 1787 v8::Local<v8::Function> f; | 1799 v8::Local<v8::Function> f; |
| 1788 v8::Local<v8::String> script = v8_str(env->GetIsolate(), | 1800 v8::Local<v8::String> script = v8_str(env->GetIsolate(), |
| 1789 "function f() {\n" | 1801 "function f() {\n" |
| 1790 " function h() {\n" | 1802 " function h() {\n" |
| 1791 " a = 0; // line 2\n" | 1803 " a = 0; // line 2\n" |
| 1792 " }\n" | 1804 " }\n" |
| 1793 " b = 1; // line 4\n" | 1805 " b = 1; // line 4\n" |
| 1794 " return h();\n" | 1806 " return h();\n" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1839 f = v8::Local<v8::Function>::Cast( | 1851 f = v8::Local<v8::Function>::Cast( |
| 1840 env->Global() | 1852 env->Global() |
| 1841 ->Get(context, v8_str(env->GetIsolate(), "f")) | 1853 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 1842 .ToLocalChecked()); | 1854 .ToLocalChecked()); |
| 1843 | 1855 |
| 1844 // Call f and check that the script break point is active. | 1856 // Call f and check that the script break point is active. |
| 1845 break_point_hit_count = 0; | 1857 break_point_hit_count = 0; |
| 1846 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1858 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1847 CHECK_EQ(1, break_point_hit_count); | 1859 CHECK_EQ(1, break_point_hit_count); |
| 1848 | 1860 |
| 1849 v8::Debug::SetDebugEventListener(NULL); | 1861 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1850 CheckDebuggerUnloaded(); | 1862 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1851 } | 1863 } |
| 1852 | 1864 |
| 1853 | 1865 |
| 1854 // Test when several scripts has the same script data | 1866 // Test when several scripts has the same script data |
| 1855 TEST(ScriptBreakPointMultiple) { | 1867 TEST(ScriptBreakPointMultiple) { |
| 1856 break_point_hit_count = 0; | 1868 break_point_hit_count = 0; |
| 1857 DebugLocalContext env; | 1869 DebugLocalContext env; |
| 1858 v8::HandleScope scope(env->GetIsolate()); | 1870 v8::HandleScope scope(env->GetIsolate()); |
| 1859 env.ExposeDebug(); | 1871 env.ExposeDebug(); |
| 1860 | 1872 |
| 1861 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1873 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1874 DebugEventBreakPointHitCount); |
| 1862 | 1875 |
| 1863 v8::Local<v8::Context> context = env.context(); | 1876 v8::Local<v8::Context> context = env.context(); |
| 1864 v8::Local<v8::Function> f; | 1877 v8::Local<v8::Function> f; |
| 1865 v8::Local<v8::String> script_f = v8_str(env->GetIsolate(), | 1878 v8::Local<v8::String> script_f = v8_str(env->GetIsolate(), |
| 1866 "function f() {\n" | 1879 "function f() {\n" |
| 1867 " a = 0; // line 1\n" | 1880 " a = 0; // line 1\n" |
| 1868 "}"); | 1881 "}"); |
| 1869 | 1882 |
| 1870 v8::Local<v8::Function> g; | 1883 v8::Local<v8::Function> g; |
| 1871 v8::Local<v8::String> script_g = v8_str(env->GetIsolate(), | 1884 v8::Local<v8::String> script_g = v8_str(env->GetIsolate(), |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1916 // Set script break point with the scripts loaded. | 1929 // Set script break point with the scripts loaded. |
| 1917 sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); | 1930 sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); |
| 1918 | 1931 |
| 1919 // Call f and g and check that the script break point is active. | 1932 // Call f and g and check that the script break point is active. |
| 1920 break_point_hit_count = 0; | 1933 break_point_hit_count = 0; |
| 1921 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1934 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1922 CHECK_EQ(1, break_point_hit_count); | 1935 CHECK_EQ(1, break_point_hit_count); |
| 1923 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 1936 g->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1924 CHECK_EQ(2, break_point_hit_count); | 1937 CHECK_EQ(2, break_point_hit_count); |
| 1925 | 1938 |
| 1926 v8::Debug::SetDebugEventListener(NULL); | 1939 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1927 CheckDebuggerUnloaded(); | 1940 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1928 } | 1941 } |
| 1929 | 1942 |
| 1930 | 1943 |
| 1931 // Test the script origin which has both name and line offset. | 1944 // Test the script origin which has both name and line offset. |
| 1932 TEST(ScriptBreakPointLineOffset) { | 1945 TEST(ScriptBreakPointLineOffset) { |
| 1933 break_point_hit_count = 0; | 1946 break_point_hit_count = 0; |
| 1934 DebugLocalContext env; | 1947 DebugLocalContext env; |
| 1935 v8::HandleScope scope(env->GetIsolate()); | 1948 v8::HandleScope scope(env->GetIsolate()); |
| 1936 env.ExposeDebug(); | 1949 env.ExposeDebug(); |
| 1937 | 1950 |
| 1938 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 1951 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 1952 DebugEventBreakPointHitCount); |
| 1939 | 1953 |
| 1940 v8::Local<v8::Context> context = env.context(); | 1954 v8::Local<v8::Context> context = env.context(); |
| 1941 v8::Local<v8::Function> f; | 1955 v8::Local<v8::Function> f; |
| 1942 v8::Local<v8::String> script = | 1956 v8::Local<v8::String> script = |
| 1943 v8_str(env->GetIsolate(), | 1957 v8_str(env->GetIsolate(), |
| 1944 "function f() {\n" | 1958 "function f() {\n" |
| 1945 " a = 0; // line 8 as this script has line offset 7\n" | 1959 " a = 0; // line 8 as this script has line offset 7\n" |
| 1946 " b = 0; // line 9 as this script has line offset 7\n" | 1960 " b = 0; // line 9 as this script has line offset 7\n" |
| 1947 "}"); | 1961 "}"); |
| 1948 | 1962 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1981 CHECK_EQ(0, break_point_hit_count); | 1995 CHECK_EQ(0, break_point_hit_count); |
| 1982 | 1996 |
| 1983 // Set a script break point with the script loaded. | 1997 // Set a script break point with the script loaded. |
| 1984 sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); | 1998 sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); |
| 1985 | 1999 |
| 1986 // Call f and check that the script break point is active. | 2000 // Call f and check that the script break point is active. |
| 1987 break_point_hit_count = 0; | 2001 break_point_hit_count = 0; |
| 1988 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2002 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 1989 CHECK_EQ(1, break_point_hit_count); | 2003 CHECK_EQ(1, break_point_hit_count); |
| 1990 | 2004 |
| 1991 v8::Debug::SetDebugEventListener(NULL); | 2005 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 1992 CheckDebuggerUnloaded(); | 2006 CheckDebuggerUnloaded(env->GetIsolate()); |
| 1993 } | 2007 } |
| 1994 | 2008 |
| 1995 | 2009 |
| 1996 // Test script break points set on lines. | 2010 // Test script break points set on lines. |
| 1997 TEST(ScriptBreakPointLine) { | 2011 TEST(ScriptBreakPointLine) { |
| 1998 DebugLocalContext env; | 2012 DebugLocalContext env; |
| 1999 v8::HandleScope scope(env->GetIsolate()); | 2013 v8::HandleScope scope(env->GetIsolate()); |
| 2000 env.ExposeDebug(); | 2014 env.ExposeDebug(); |
| 2001 | 2015 |
| 2002 // Create a function for checking the function when hitting a break point. | 2016 // Create a function for checking the function when hitting a break point. |
| 2003 frame_function_name = CompileFunction(&env, | 2017 frame_function_name = CompileFunction(&env, |
| 2004 frame_function_name_source, | 2018 frame_function_name_source, |
| 2005 "frame_function_name"); | 2019 "frame_function_name"); |
| 2006 | 2020 |
| 2007 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2021 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2022 DebugEventBreakPointHitCount); |
| 2008 | 2023 |
| 2009 v8::Local<v8::Context> context = env.context(); | 2024 v8::Local<v8::Context> context = env.context(); |
| 2010 v8::Local<v8::Function> f; | 2025 v8::Local<v8::Function> f; |
| 2011 v8::Local<v8::Function> g; | 2026 v8::Local<v8::Function> g; |
| 2012 v8::Local<v8::String> script = | 2027 v8::Local<v8::String> script = |
| 2013 v8_str(env->GetIsolate(), | 2028 v8_str(env->GetIsolate(), |
| 2014 "a = 0 // line 0\n" | 2029 "a = 0 // line 0\n" |
| 2015 "function f() {\n" | 2030 "function f() {\n" |
| 2016 " a = 1; // line 2\n" | 2031 " a = 1; // line 2\n" |
| 2017 "}\n" | 2032 "}\n" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2113 ClearBreakPointFromJS(env->GetIsolate(), sbp1); | 2128 ClearBreakPointFromJS(env->GetIsolate(), sbp1); |
| 2114 ClearBreakPointFromJS(env->GetIsolate(), sbp5); | 2129 ClearBreakPointFromJS(env->GetIsolate(), sbp5); |
| 2115 ClearBreakPointFromJS(env->GetIsolate(), sbp6); | 2130 ClearBreakPointFromJS(env->GetIsolate(), sbp6); |
| 2116 break_point_hit_count = 0; | 2131 break_point_hit_count = 0; |
| 2117 v8::Script::Compile(context, script, &origin) | 2132 v8::Script::Compile(context, script, &origin) |
| 2118 .ToLocalChecked() | 2133 .ToLocalChecked() |
| 2119 ->Run(context) | 2134 ->Run(context) |
| 2120 .ToLocalChecked(); | 2135 .ToLocalChecked(); |
| 2121 CHECK_EQ(0, break_point_hit_count); | 2136 CHECK_EQ(0, break_point_hit_count); |
| 2122 | 2137 |
| 2123 v8::Debug::SetDebugEventListener(NULL); | 2138 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2124 CheckDebuggerUnloaded(); | 2139 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2125 } | 2140 } |
| 2126 | 2141 |
| 2127 | 2142 |
| 2128 // Test top level script break points set on lines. | 2143 // Test top level script break points set on lines. |
| 2129 TEST(ScriptBreakPointLineTopLevel) { | 2144 TEST(ScriptBreakPointLineTopLevel) { |
| 2130 DebugLocalContext env; | 2145 DebugLocalContext env; |
| 2131 v8::HandleScope scope(env->GetIsolate()); | 2146 v8::HandleScope scope(env->GetIsolate()); |
| 2132 env.ExposeDebug(); | 2147 env.ExposeDebug(); |
| 2133 | 2148 |
| 2134 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2149 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2150 DebugEventBreakPointHitCount); |
| 2135 | 2151 |
| 2136 v8::Local<v8::Context> context = env.context(); | 2152 v8::Local<v8::Context> context = env.context(); |
| 2137 v8::Local<v8::String> script = | 2153 v8::Local<v8::String> script = |
| 2138 v8_str(env->GetIsolate(), | 2154 v8_str(env->GetIsolate(), |
| 2139 "function f() {\n" | 2155 "function f() {\n" |
| 2140 " a = 1; // line 1\n" | 2156 " a = 1; // line 1\n" |
| 2141 "}\n" | 2157 "}\n" |
| 2142 "a = 2; // line 3\n"); | 2158 "a = 2; // line 3\n"); |
| 2143 v8::Local<v8::Function> f; | 2159 v8::Local<v8::Function> f; |
| 2144 { | 2160 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2165 CHECK_EQ(1, break_point_hit_count); | 2181 CHECK_EQ(1, break_point_hit_count); |
| 2166 | 2182 |
| 2167 // Call f and check that there are still no break points. | 2183 // Call f and check that there are still no break points. |
| 2168 break_point_hit_count = 0; | 2184 break_point_hit_count = 0; |
| 2169 f = v8::Local<v8::Function>::Cast( | 2185 f = v8::Local<v8::Function>::Cast( |
| 2170 env->Global() | 2186 env->Global() |
| 2171 ->Get(context, v8_str(env->GetIsolate(), "f")) | 2187 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 2172 .ToLocalChecked()); | 2188 .ToLocalChecked()); |
| 2173 CHECK_EQ(0, break_point_hit_count); | 2189 CHECK_EQ(0, break_point_hit_count); |
| 2174 | 2190 |
| 2175 v8::Debug::SetDebugEventListener(NULL); | 2191 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2176 CheckDebuggerUnloaded(); | 2192 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2177 } | 2193 } |
| 2178 | 2194 |
| 2179 | 2195 |
| 2180 // Test that it is possible to add and remove break points in a top level | 2196 // Test that it is possible to add and remove break points in a top level |
| 2181 // function which has no references but has not been collected yet. | 2197 // function which has no references but has not been collected yet. |
| 2182 TEST(ScriptBreakPointTopLevelCrash) { | 2198 TEST(ScriptBreakPointTopLevelCrash) { |
| 2183 DebugLocalContext env; | 2199 DebugLocalContext env; |
| 2184 v8::HandleScope scope(env->GetIsolate()); | 2200 v8::HandleScope scope(env->GetIsolate()); |
| 2185 env.ExposeDebug(); | 2201 env.ExposeDebug(); |
| 2186 | 2202 |
| 2187 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2203 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2204 DebugEventBreakPointHitCount); |
| 2188 | 2205 |
| 2189 v8::Local<v8::String> script_source = v8_str(env->GetIsolate(), | 2206 v8::Local<v8::String> script_source = v8_str(env->GetIsolate(), |
| 2190 "function f() {\n" | 2207 "function f() {\n" |
| 2191 " return 0;\n" | 2208 " return 0;\n" |
| 2192 "}\n" | 2209 "}\n" |
| 2193 "f()"); | 2210 "f()"); |
| 2194 | 2211 |
| 2195 int sbp1 = | 2212 int sbp1 = |
| 2196 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); | 2213 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); |
| 2197 { | 2214 { |
| 2198 v8::HandleScope scope(env->GetIsolate()); | 2215 v8::HandleScope scope(env->GetIsolate()); |
| 2199 break_point_hit_count = 0; | 2216 break_point_hit_count = 0; |
| 2200 CompileRunWithOrigin(script_source, "test.html"); | 2217 CompileRunWithOrigin(script_source, "test.html"); |
| 2201 CHECK_EQ(1, break_point_hit_count); | 2218 CHECK_EQ(1, break_point_hit_count); |
| 2202 } | 2219 } |
| 2203 | 2220 |
| 2204 int sbp2 = | 2221 int sbp2 = |
| 2205 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); | 2222 SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); |
| 2206 ClearBreakPointFromJS(env->GetIsolate(), sbp1); | 2223 ClearBreakPointFromJS(env->GetIsolate(), sbp1); |
| 2207 ClearBreakPointFromJS(env->GetIsolate(), sbp2); | 2224 ClearBreakPointFromJS(env->GetIsolate(), sbp2); |
| 2208 | 2225 |
| 2209 v8::Debug::SetDebugEventListener(NULL); | 2226 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2210 CheckDebuggerUnloaded(); | 2227 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2211 } | 2228 } |
| 2212 | 2229 |
| 2213 | 2230 |
| 2214 // Test that it is possible to remove the last break point for a function | 2231 // Test that it is possible to remove the last break point for a function |
| 2215 // inside the break handling of that break point. | 2232 // inside the break handling of that break point. |
| 2216 TEST(RemoveBreakPointInBreak) { | 2233 TEST(RemoveBreakPointInBreak) { |
| 2217 DebugLocalContext env; | 2234 DebugLocalContext env; |
| 2218 v8::HandleScope scope(env->GetIsolate()); | 2235 v8::HandleScope scope(env->GetIsolate()); |
| 2219 | 2236 |
| 2220 v8::Local<v8::Context> context = env.context(); | 2237 v8::Local<v8::Context> context = env.context(); |
| 2221 v8::Local<v8::Function> foo = | 2238 v8::Local<v8::Function> foo = |
| 2222 CompileFunction(&env, "function foo(){a=1;}", "foo"); | 2239 CompileFunction(&env, "function foo(){a=1;}", "foo"); |
| 2223 | 2240 |
| 2224 // Register the debug event listener pasing the function | 2241 // Register the debug event listener pasing the function |
| 2225 v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo); | 2242 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2243 DebugEventRemoveBreakPoint, foo); |
| 2226 | 2244 |
| 2227 debug_event_remove_break_point = SetBreakPoint(foo, 0); | 2245 debug_event_remove_break_point = SetBreakPoint(foo, 0); |
| 2228 | 2246 |
| 2229 break_point_hit_count = 0; | 2247 break_point_hit_count = 0; |
| 2230 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2248 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2231 CHECK_EQ(1, break_point_hit_count); | 2249 CHECK_EQ(1, break_point_hit_count); |
| 2232 | 2250 |
| 2233 break_point_hit_count = 0; | 2251 break_point_hit_count = 0; |
| 2234 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2252 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2235 CHECK_EQ(0, break_point_hit_count); | 2253 CHECK_EQ(0, break_point_hit_count); |
| 2236 | 2254 |
| 2237 v8::Debug::SetDebugEventListener(NULL); | 2255 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2238 CheckDebuggerUnloaded(); | 2256 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2239 } | 2257 } |
| 2240 | 2258 |
| 2241 | 2259 |
| 2242 // Test that the debugger statement causes a break. | 2260 // Test that the debugger statement causes a break. |
| 2243 TEST(DebuggerStatement) { | 2261 TEST(DebuggerStatement) { |
| 2244 break_point_hit_count = 0; | 2262 break_point_hit_count = 0; |
| 2245 DebugLocalContext env; | 2263 DebugLocalContext env; |
| 2246 v8::HandleScope scope(env->GetIsolate()); | 2264 v8::HandleScope scope(env->GetIsolate()); |
| 2247 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2265 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2266 DebugEventBreakPointHitCount); |
| 2248 v8::Local<v8::Context> context = env.context(); | 2267 v8::Local<v8::Context> context = env.context(); |
| 2249 v8::Script::Compile(context, | 2268 v8::Script::Compile(context, |
| 2250 v8_str(env->GetIsolate(), "function bar(){debugger}")) | 2269 v8_str(env->GetIsolate(), "function bar(){debugger}")) |
| 2251 .ToLocalChecked() | 2270 .ToLocalChecked() |
| 2252 ->Run(context) | 2271 ->Run(context) |
| 2253 .ToLocalChecked(); | 2272 .ToLocalChecked(); |
| 2254 v8::Script::Compile( | 2273 v8::Script::Compile( |
| 2255 context, v8_str(env->GetIsolate(), "function foo(){debugger;debugger;}")) | 2274 context, v8_str(env->GetIsolate(), "function foo(){debugger;debugger;}")) |
| 2256 .ToLocalChecked() | 2275 .ToLocalChecked() |
| 2257 ->Run(context) | 2276 ->Run(context) |
| 2258 .ToLocalChecked(); | 2277 .ToLocalChecked(); |
| 2259 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 2278 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( |
| 2260 env->Global() | 2279 env->Global() |
| 2261 ->Get(context, v8_str(env->GetIsolate(), "foo")) | 2280 ->Get(context, v8_str(env->GetIsolate(), "foo")) |
| 2262 .ToLocalChecked()); | 2281 .ToLocalChecked()); |
| 2263 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( | 2282 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( |
| 2264 env->Global() | 2283 env->Global() |
| 2265 ->Get(context, v8_str(env->GetIsolate(), "bar")) | 2284 ->Get(context, v8_str(env->GetIsolate(), "bar")) |
| 2266 .ToLocalChecked()); | 2285 .ToLocalChecked()); |
| 2267 | 2286 |
| 2268 // Run function with debugger statement | 2287 // Run function with debugger statement |
| 2269 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2288 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2270 CHECK_EQ(1, break_point_hit_count); | 2289 CHECK_EQ(1, break_point_hit_count); |
| 2271 | 2290 |
| 2272 // Run function with two debugger statement | 2291 // Run function with two debugger statement |
| 2273 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2292 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2274 CHECK_EQ(3, break_point_hit_count); | 2293 CHECK_EQ(3, break_point_hit_count); |
| 2275 | 2294 |
| 2276 v8::Debug::SetDebugEventListener(NULL); | 2295 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2277 CheckDebuggerUnloaded(); | 2296 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2278 } | 2297 } |
| 2279 | 2298 |
| 2280 | 2299 |
| 2281 // Test setting a breakpoint on the debugger statement. | 2300 // Test setting a breakpoint on the debugger statement. |
| 2282 TEST(DebuggerStatementBreakpoint) { | 2301 TEST(DebuggerStatementBreakpoint) { |
| 2283 break_point_hit_count = 0; | 2302 break_point_hit_count = 0; |
| 2284 DebugLocalContext env; | 2303 DebugLocalContext env; |
| 2285 v8::HandleScope scope(env->GetIsolate()); | 2304 v8::HandleScope scope(env->GetIsolate()); |
| 2286 v8::Local<v8::Context> context = env.context(); | 2305 v8::Local<v8::Context> context = env.context(); |
| 2287 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2306 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2307 DebugEventBreakPointHitCount); |
| 2288 v8::Script::Compile(context, | 2308 v8::Script::Compile(context, |
| 2289 v8_str(env->GetIsolate(), "function foo(){debugger;}")) | 2309 v8_str(env->GetIsolate(), "function foo(){debugger;}")) |
| 2290 .ToLocalChecked() | 2310 .ToLocalChecked() |
| 2291 ->Run(context) | 2311 ->Run(context) |
| 2292 .ToLocalChecked(); | 2312 .ToLocalChecked(); |
| 2293 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 2313 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( |
| 2294 env->Global() | 2314 env->Global() |
| 2295 ->Get(context, v8_str(env->GetIsolate(), "foo")) | 2315 ->Get(context, v8_str(env->GetIsolate(), "foo")) |
| 2296 .ToLocalChecked()); | 2316 .ToLocalChecked()); |
| 2297 | 2317 |
| 2298 // The debugger statement triggers breakpoint hit | 2318 // The debugger statement triggers breakpoint hit |
| 2299 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2319 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2300 CHECK_EQ(1, break_point_hit_count); | 2320 CHECK_EQ(1, break_point_hit_count); |
| 2301 | 2321 |
| 2302 int bp = SetBreakPoint(foo, 0); | 2322 int bp = SetBreakPoint(foo, 0); |
| 2303 | 2323 |
| 2304 // Set breakpoint does not duplicate hits | 2324 // Set breakpoint does not duplicate hits |
| 2305 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2325 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2306 CHECK_EQ(2, break_point_hit_count); | 2326 CHECK_EQ(2, break_point_hit_count); |
| 2307 | 2327 |
| 2308 ClearBreakPoint(bp); | 2328 ClearBreakPoint(bp); |
| 2309 v8::Debug::SetDebugEventListener(NULL); | 2329 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2310 CheckDebuggerUnloaded(); | 2330 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2311 } | 2331 } |
| 2312 | 2332 |
| 2313 | 2333 |
| 2314 // Test that the evaluation of expressions when a break point is hit generates | 2334 // Test that the evaluation of expressions when a break point is hit generates |
| 2315 // the correct results. | 2335 // the correct results. |
| 2316 TEST(DebugEvaluate) { | 2336 TEST(DebugEvaluate) { |
| 2317 DebugLocalContext env; | 2337 DebugLocalContext env; |
| 2318 v8::Isolate* isolate = env->GetIsolate(); | 2338 v8::Isolate* isolate = env->GetIsolate(); |
| 2319 v8::HandleScope scope(isolate); | 2339 v8::HandleScope scope(isolate); |
| 2320 env.ExposeDebug(); | 2340 env.ExposeDebug(); |
| 2321 | 2341 |
| 2322 // Create a function for checking the evaluation when hitting a break point. | 2342 // Create a function for checking the evaluation when hitting a break point. |
| 2323 evaluate_check_function = CompileFunction(&env, | 2343 evaluate_check_function = CompileFunction(&env, |
| 2324 evaluate_check_source, | 2344 evaluate_check_source, |
| 2325 "evaluate_check"); | 2345 "evaluate_check"); |
| 2326 // Register the debug event listener | 2346 // Register the debug event listener |
| 2327 v8::Debug::SetDebugEventListener(DebugEventEvaluate); | 2347 v8::Debug::SetDebugEventListener(isolate, DebugEventEvaluate); |
| 2328 | 2348 |
| 2329 // Different expected vaules of x and a when in a break point (u = undefined, | 2349 // Different expected vaules of x and a when in a break point (u = undefined, |
| 2330 // d = Hello, world!). | 2350 // d = Hello, world!). |
| 2331 struct EvaluateCheck checks_uu[] = {{"x", v8::Undefined(isolate)}, | 2351 struct EvaluateCheck checks_uu[] = {{"x", v8::Undefined(isolate)}, |
| 2332 {"a", v8::Undefined(isolate)}, | 2352 {"a", v8::Undefined(isolate)}, |
| 2333 {NULL, v8::Local<v8::Value>()}}; | 2353 {NULL, v8::Local<v8::Value>()}}; |
| 2334 struct EvaluateCheck checks_hu[] = { | 2354 struct EvaluateCheck checks_hu[] = { |
| 2335 {"x", v8_str(env->GetIsolate(), "Hello, world!")}, | 2355 {"x", v8_str(env->GetIsolate(), "Hello, world!")}, |
| 2336 {"a", v8::Undefined(isolate)}, | 2356 {"a", v8::Undefined(isolate)}, |
| 2337 {NULL, v8::Local<v8::Value>()}}; | 2357 {NULL, v8::Local<v8::Value>()}}; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2439 bar->Call(context, env->Global(), 2, argv_bar_2).ToLocalChecked(); | 2459 bar->Call(context, env->Global(), 2, argv_bar_2).ToLocalChecked(); |
| 2440 | 2460 |
| 2441 // Call bar setting breakpoint after a=x in barbar and parameter | 2461 // Call bar setting breakpoint after a=x in barbar and parameter |
| 2442 // "Hello, world!". | 2462 // "Hello, world!". |
| 2443 checks = checks_hh; | 2463 checks = checks_hh; |
| 2444 v8::Local<v8::Value> argv_bar_3[2] = { | 2464 v8::Local<v8::Value> argv_bar_3[2] = { |
| 2445 v8_str(env->GetIsolate(), "Hello, world!"), | 2465 v8_str(env->GetIsolate(), "Hello, world!"), |
| 2446 v8::Number::New(env->GetIsolate(), barbar_break_position + 1)}; | 2466 v8::Number::New(env->GetIsolate(), barbar_break_position + 1)}; |
| 2447 bar->Call(context, env->Global(), 2, argv_bar_3).ToLocalChecked(); | 2467 bar->Call(context, env->Global(), 2, argv_bar_3).ToLocalChecked(); |
| 2448 | 2468 |
| 2449 v8::Debug::SetDebugEventListener(NULL); | 2469 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 2450 CheckDebuggerUnloaded(); | 2470 CheckDebuggerUnloaded(isolate); |
| 2451 } | 2471 } |
| 2452 | 2472 |
| 2453 | 2473 |
| 2454 int debugEventCount = 0; | 2474 int debugEventCount = 0; |
| 2455 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { | 2475 static void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { |
| 2456 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; | 2476 if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; |
| 2457 } | 2477 } |
| 2458 | 2478 |
| 2459 | 2479 |
| 2460 // Test that the conditional breakpoints work event if code generation from | 2480 // Test that the conditional breakpoints work event if code generation from |
| 2461 // strings is prohibited in the debugee context. | 2481 // strings is prohibited in the debugee context. |
| 2462 TEST(ConditionalBreakpointWithCodeGenerationDisallowed) { | 2482 TEST(ConditionalBreakpointWithCodeGenerationDisallowed) { |
| 2463 DebugLocalContext env; | 2483 DebugLocalContext env; |
| 2464 v8::HandleScope scope(env->GetIsolate()); | 2484 v8::HandleScope scope(env->GetIsolate()); |
| 2465 env.ExposeDebug(); | 2485 env.ExposeDebug(); |
| 2466 | 2486 |
| 2467 v8::Debug::SetDebugEventListener(CheckDebugEvent); | 2487 v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEvent); |
| 2468 | 2488 |
| 2469 v8::Local<v8::Context> context = env.context(); | 2489 v8::Local<v8::Context> context = env.context(); |
| 2470 v8::Local<v8::Function> foo = CompileFunction(&env, | 2490 v8::Local<v8::Function> foo = CompileFunction(&env, |
| 2471 "function foo(x) {\n" | 2491 "function foo(x) {\n" |
| 2472 " var s = 'String value2';\n" | 2492 " var s = 'String value2';\n" |
| 2473 " return s + x;\n" | 2493 " return s + x;\n" |
| 2474 "}", | 2494 "}", |
| 2475 "foo"); | 2495 "foo"); |
| 2476 | 2496 |
| 2477 // Set conditional breakpoint with condition 'true'. | 2497 // Set conditional breakpoint with condition 'true'. |
| 2478 CompileRun("debug.Debug.setBreakPoint(foo, 2, 0, 'true')"); | 2498 CompileRun("debug.Debug.setBreakPoint(foo, 2, 0, 'true')"); |
| 2479 | 2499 |
| 2480 debugEventCount = 0; | 2500 debugEventCount = 0; |
| 2481 env->AllowCodeGenerationFromStrings(false); | 2501 env->AllowCodeGenerationFromStrings(false); |
| 2482 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2502 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2483 CHECK_EQ(1, debugEventCount); | 2503 CHECK_EQ(1, debugEventCount); |
| 2484 | 2504 |
| 2485 v8::Debug::SetDebugEventListener(NULL); | 2505 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2486 CheckDebuggerUnloaded(); | 2506 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2487 } | 2507 } |
| 2488 | 2508 |
| 2489 | 2509 |
| 2490 bool checkedDebugEvals = true; | 2510 bool checkedDebugEvals = true; |
| 2491 v8::Local<v8::Function> checkGlobalEvalFunction; | 2511 v8::Local<v8::Function> checkGlobalEvalFunction; |
| 2492 v8::Local<v8::Function> checkFrameEvalFunction; | 2512 v8::Local<v8::Function> checkFrameEvalFunction; |
| 2493 static void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) { | 2513 static void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) { |
| 2494 if (eventDetails.GetEvent() == v8::Break) { | 2514 if (eventDetails.GetEvent() == v8::Break) { |
| 2495 ++debugEventCount; | 2515 ++debugEventCount; |
| 2496 v8::HandleScope handleScope(CcTest::isolate()); | 2516 v8::HandleScope handleScope(CcTest::isolate()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2512 | 2532 |
| 2513 | 2533 |
| 2514 // Test that the evaluation of expressions when a break point is hit generates | 2534 // Test that the evaluation of expressions when a break point is hit generates |
| 2515 // the correct results in case code generation from strings is disallowed in the | 2535 // the correct results in case code generation from strings is disallowed in the |
| 2516 // debugee context. | 2536 // debugee context. |
| 2517 TEST(DebugEvaluateWithCodeGenerationDisallowed) { | 2537 TEST(DebugEvaluateWithCodeGenerationDisallowed) { |
| 2518 DebugLocalContext env; | 2538 DebugLocalContext env; |
| 2519 v8::HandleScope scope(env->GetIsolate()); | 2539 v8::HandleScope scope(env->GetIsolate()); |
| 2520 env.ExposeDebug(); | 2540 env.ExposeDebug(); |
| 2521 | 2541 |
| 2522 v8::Debug::SetDebugEventListener(CheckDebugEval); | 2542 v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEval); |
| 2523 | 2543 |
| 2524 v8::Local<v8::Context> context = env.context(); | 2544 v8::Local<v8::Context> context = env.context(); |
| 2525 v8::Local<v8::Function> foo = CompileFunction(&env, | 2545 v8::Local<v8::Function> foo = CompileFunction(&env, |
| 2526 "var global = 'Global';\n" | 2546 "var global = 'Global';\n" |
| 2527 "function foo(x) {\n" | 2547 "function foo(x) {\n" |
| 2528 " var local = 'Local';\n" | 2548 " var local = 'Local';\n" |
| 2529 " debugger;\n" | 2549 " debugger;\n" |
| 2530 " return local + x;\n" | 2550 " return local + x;\n" |
| 2531 "}", | 2551 "}", |
| 2532 "foo"); | 2552 "foo"); |
| 2533 checkGlobalEvalFunction = CompileFunction(&env, | 2553 checkGlobalEvalFunction = CompileFunction(&env, |
| 2534 "function checkGlobalEval(exec_state) {\n" | 2554 "function checkGlobalEval(exec_state) {\n" |
| 2535 " return exec_state.evaluateGlobal('global').value() === 'Global';\n" | 2555 " return exec_state.evaluateGlobal('global').value() === 'Global';\n" |
| 2536 "}", | 2556 "}", |
| 2537 "checkGlobalEval"); | 2557 "checkGlobalEval"); |
| 2538 | 2558 |
| 2539 checkFrameEvalFunction = CompileFunction(&env, | 2559 checkFrameEvalFunction = CompileFunction(&env, |
| 2540 "function checkFrameEval(exec_state) {\n" | 2560 "function checkFrameEval(exec_state) {\n" |
| 2541 " return exec_state.frame(0).evaluate('local').value() === 'Local';\n" | 2561 " return exec_state.frame(0).evaluate('local').value() === 'Local';\n" |
| 2542 "}", | 2562 "}", |
| 2543 "checkFrameEval"); | 2563 "checkFrameEval"); |
| 2544 debugEventCount = 0; | 2564 debugEventCount = 0; |
| 2545 env->AllowCodeGenerationFromStrings(false); | 2565 env->AllowCodeGenerationFromStrings(false); |
| 2546 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2566 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2547 CHECK_EQ(1, debugEventCount); | 2567 CHECK_EQ(1, debugEventCount); |
| 2548 | 2568 |
| 2549 checkGlobalEvalFunction.Clear(); | 2569 checkGlobalEvalFunction.Clear(); |
| 2550 checkFrameEvalFunction.Clear(); | 2570 checkFrameEvalFunction.Clear(); |
| 2551 v8::Debug::SetDebugEventListener(NULL); | 2571 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2552 CheckDebuggerUnloaded(); | 2572 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2553 } | 2573 } |
| 2554 | 2574 |
| 2555 | 2575 |
| 2556 // Copies a C string to a 16-bit string. Does not check for buffer overflow. | 2576 // Copies a C string to a 16-bit string. Does not check for buffer overflow. |
| 2557 // Does not use the V8 engine to convert strings, so it can be used | 2577 // Does not use the V8 engine to convert strings, so it can be used |
| 2558 // in any thread. Returns the length of the string. | 2578 // in any thread. Returns the length of the string. |
| 2559 int AsciiToUtf16(const char* input_buffer, uint16_t* output_buffer) { | 2579 int AsciiToUtf16(const char* input_buffer, uint16_t* output_buffer) { |
| 2560 int i; | 2580 int i; |
| 2561 for (i = 0; input_buffer[i] != '\0'; ++i) { | 2581 for (i = 0; input_buffer[i] != '\0'; ++i) { |
| 2562 // ASCII does not use chars > 127, but be careful anyway. | 2582 // ASCII does not use chars > 127, but be careful anyway. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2646 EvaluateResult::kBufferSize); | 2666 EvaluateResult::kBufferSize); |
| 2647 if (res) { | 2667 if (res) { |
| 2648 process_debug_messages_data.next(); | 2668 process_debug_messages_data.next(); |
| 2649 } | 2669 } |
| 2650 } | 2670 } |
| 2651 | 2671 |
| 2652 | 2672 |
| 2653 // Test that the evaluation of expressions works even from ProcessDebugMessages | 2673 // Test that the evaluation of expressions works even from ProcessDebugMessages |
| 2654 // i.e. with empty stack. | 2674 // i.e. with empty stack. |
| 2655 TEST(DebugEvaluateWithoutStack) { | 2675 TEST(DebugEvaluateWithoutStack) { |
| 2656 v8::Debug::SetMessageHandler(DebugProcessDebugMessagesHandler); | |
| 2657 | |
| 2658 DebugLocalContext env; | 2676 DebugLocalContext env; |
| 2677 v8::Debug::SetMessageHandler(env->GetIsolate(), |
| 2678 DebugProcessDebugMessagesHandler); |
| 2659 v8::HandleScope scope(env->GetIsolate()); | 2679 v8::HandleScope scope(env->GetIsolate()); |
| 2660 | 2680 |
| 2661 const char* source = | 2681 const char* source = |
| 2662 "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }"; | 2682 "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }"; |
| 2663 | 2683 |
| 2664 v8::Local<v8::Context> context = env.context(); | 2684 v8::Local<v8::Context> context = env.context(); |
| 2665 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) | 2685 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) |
| 2666 .ToLocalChecked() | 2686 .ToLocalChecked() |
| 2667 ->Run(context) | 2687 ->Run(context) |
| 2668 .ToLocalChecked(); | 2688 .ToLocalChecked(); |
| 2669 | 2689 |
| 2670 v8::Debug::ProcessDebugMessages(); | 2690 v8::Debug::ProcessDebugMessages(env->GetIsolate()); |
| 2671 | 2691 |
| 2672 const int kBufferSize = 1000; | 2692 const int kBufferSize = 1000; |
| 2673 uint16_t buffer[kBufferSize]; | 2693 uint16_t buffer[kBufferSize]; |
| 2674 | 2694 |
| 2675 const char* command_111 = "{\"seq\":111," | 2695 const char* command_111 = "{\"seq\":111," |
| 2676 "\"type\":\"request\"," | 2696 "\"type\":\"request\"," |
| 2677 "\"command\":\"evaluate\"," | 2697 "\"command\":\"evaluate\"," |
| 2678 "\"arguments\":{" | 2698 "\"arguments\":{" |
| 2679 " \"global\":true," | 2699 " \"global\":true," |
| 2680 " \"expression\":\"v1\",\"disable_break\":true" | 2700 " \"expression\":\"v1\",\"disable_break\":true" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2696 const char* command_113 = "{\"seq\":113," | 2716 const char* command_113 = "{\"seq\":113," |
| 2697 "\"type\":\"request\"," | 2717 "\"type\":\"request\"," |
| 2698 "\"command\":\"evaluate\"," | 2718 "\"command\":\"evaluate\"," |
| 2699 "\"arguments\":{" | 2719 "\"arguments\":{" |
| 2700 " \"global\":true," | 2720 " \"global\":true," |
| 2701 " \"expression\":\"239 + 566\",\"disable_break\":true" | 2721 " \"expression\":\"239 + 566\",\"disable_break\":true" |
| 2702 "}}"; | 2722 "}}"; |
| 2703 | 2723 |
| 2704 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_113, buffer)); | 2724 v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_113, buffer)); |
| 2705 | 2725 |
| 2706 v8::Debug::ProcessDebugMessages(); | 2726 v8::Debug::ProcessDebugMessages(isolate); |
| 2707 | 2727 |
| 2708 CHECK_EQ(3, process_debug_messages_data.counter); | 2728 CHECK_EQ(3, process_debug_messages_data.counter); |
| 2709 | 2729 |
| 2710 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); | 2730 CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); |
| 2711 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), | 2731 CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), |
| 2712 0); | 2732 0); |
| 2713 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); | 2733 CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); |
| 2714 | 2734 |
| 2715 v8::Debug::SetMessageHandler(NULL); | 2735 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 2716 v8::Debug::SetDebugEventListener(NULL); | 2736 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2717 CheckDebuggerUnloaded(); | 2737 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2718 } | 2738 } |
| 2719 | 2739 |
| 2720 | 2740 |
| 2721 // Simple test of the stepping mechanism using only store ICs. | 2741 // Simple test of the stepping mechanism using only store ICs. |
| 2722 TEST(DebugStepLinear) { | 2742 TEST(DebugStepLinear) { |
| 2723 DebugLocalContext env; | 2743 DebugLocalContext env; |
| 2724 v8::HandleScope scope(env->GetIsolate()); | 2744 v8::HandleScope scope(env->GetIsolate()); |
| 2725 | 2745 |
| 2726 // Create a function for testing stepping. | 2746 // Create a function for testing stepping. |
| 2727 v8::Local<v8::Function> foo = CompileFunction(&env, | 2747 v8::Local<v8::Function> foo = CompileFunction(&env, |
| 2728 "function foo(){a=1;b=1;c=1;}", | 2748 "function foo(){a=1;b=1;c=1;}", |
| 2729 "foo"); | 2749 "foo"); |
| 2730 | 2750 |
| 2731 // Run foo to allow it to get optimized. | 2751 // Run foo to allow it to get optimized. |
| 2732 CompileRun("a=0; b=0; c=0; foo();"); | 2752 CompileRun("a=0; b=0; c=0; foo();"); |
| 2733 | 2753 |
| 2734 // Register a debug event listener which steps and counts. | 2754 // Register a debug event listener which steps and counts. |
| 2735 v8::Debug::SetDebugEventListener(DebugEventStep); | 2755 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2736 | 2756 |
| 2737 SetBreakPoint(foo, 3); | 2757 SetBreakPoint(foo, 3); |
| 2738 | 2758 |
| 2739 step_action = StepIn; | 2759 step_action = StepIn; |
| 2740 break_point_hit_count = 0; | 2760 break_point_hit_count = 0; |
| 2741 v8::Local<v8::Context> context = env.context(); | 2761 v8::Local<v8::Context> context = env.context(); |
| 2742 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2762 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2743 | 2763 |
| 2744 // With stepping all break locations are hit. | 2764 // With stepping all break locations are hit. |
| 2745 CHECK_EQ(4, break_point_hit_count); | 2765 CHECK_EQ(4, break_point_hit_count); |
| 2746 | 2766 |
| 2747 v8::Debug::SetDebugEventListener(NULL); | 2767 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2748 CheckDebuggerUnloaded(); | 2768 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2749 | 2769 |
| 2750 // Register a debug event listener which just counts. | 2770 // Register a debug event listener which just counts. |
| 2751 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 2771 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 2772 DebugEventBreakPointHitCount); |
| 2752 | 2773 |
| 2753 SetBreakPoint(foo, 3); | 2774 SetBreakPoint(foo, 3); |
| 2754 break_point_hit_count = 0; | 2775 break_point_hit_count = 0; |
| 2755 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2776 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2756 | 2777 |
| 2757 // Without stepping only active break points are hit. | 2778 // Without stepping only active break points are hit. |
| 2758 CHECK_EQ(1, break_point_hit_count); | 2779 CHECK_EQ(1, break_point_hit_count); |
| 2759 | 2780 |
| 2760 v8::Debug::SetDebugEventListener(NULL); | 2781 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2761 CheckDebuggerUnloaded(); | 2782 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2762 } | 2783 } |
| 2763 | 2784 |
| 2764 | 2785 |
| 2765 // Test of the stepping mechanism for keyed load in a loop. | 2786 // Test of the stepping mechanism for keyed load in a loop. |
| 2766 TEST(DebugStepKeyedLoadLoop) { | 2787 TEST(DebugStepKeyedLoadLoop) { |
| 2767 DebugLocalContext env; | 2788 DebugLocalContext env; |
| 2768 v8::HandleScope scope(env->GetIsolate()); | 2789 v8::HandleScope scope(env->GetIsolate()); |
| 2769 | 2790 |
| 2770 // Register a debug event listener which steps and counts. | 2791 // Register a debug event listener which steps and counts. |
| 2771 v8::Debug::SetDebugEventListener(DebugEventStep); | 2792 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2772 | 2793 |
| 2773 // Create a function for testing stepping of keyed load. The statement 'y=1' | 2794 // Create a function for testing stepping of keyed load. The statement 'y=1' |
| 2774 // is there to have more than one breakable statement in the loop, TODO(315). | 2795 // is there to have more than one breakable statement in the loop, TODO(315). |
| 2775 v8::Local<v8::Function> foo = CompileFunction( | 2796 v8::Local<v8::Function> foo = CompileFunction( |
| 2776 &env, | 2797 &env, |
| 2777 "function foo(a) {\n" | 2798 "function foo(a) {\n" |
| 2778 " var x;\n" | 2799 " var x;\n" |
| 2779 " var len = a.length;\n" | 2800 " var len = a.length;\n" |
| 2780 " for (var i = 0; i < len; i++) {\n" | 2801 " for (var i = 0; i < len; i++) {\n" |
| 2781 " y = 1;\n" | 2802 " y = 1;\n" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2801 | 2822 |
| 2802 // Set up break point and step through the function. | 2823 // Set up break point and step through the function. |
| 2803 SetBreakPoint(foo, 3); | 2824 SetBreakPoint(foo, 3); |
| 2804 step_action = StepNext; | 2825 step_action = StepNext; |
| 2805 break_point_hit_count = 0; | 2826 break_point_hit_count = 0; |
| 2806 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); | 2827 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); |
| 2807 | 2828 |
| 2808 // With stepping all break locations are hit. | 2829 // With stepping all break locations are hit. |
| 2809 CHECK_EQ(45, break_point_hit_count); | 2830 CHECK_EQ(45, break_point_hit_count); |
| 2810 | 2831 |
| 2811 v8::Debug::SetDebugEventListener(NULL); | 2832 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2812 CheckDebuggerUnloaded(); | 2833 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2813 } | 2834 } |
| 2814 | 2835 |
| 2815 | 2836 |
| 2816 // Test of the stepping mechanism for keyed store in a loop. | 2837 // Test of the stepping mechanism for keyed store in a loop. |
| 2817 TEST(DebugStepKeyedStoreLoop) { | 2838 TEST(DebugStepKeyedStoreLoop) { |
| 2818 DebugLocalContext env; | 2839 DebugLocalContext env; |
| 2819 v8::HandleScope scope(env->GetIsolate()); | 2840 v8::HandleScope scope(env->GetIsolate()); |
| 2820 | 2841 |
| 2821 // Register a debug event listener which steps and counts. | 2842 // Register a debug event listener which steps and counts. |
| 2822 v8::Debug::SetDebugEventListener(DebugEventStep); | 2843 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2823 | 2844 |
| 2824 // Create a function for testing stepping of keyed store. The statement 'y=1' | 2845 // Create a function for testing stepping of keyed store. The statement 'y=1' |
| 2825 // is there to have more than one breakable statement in the loop, TODO(315). | 2846 // is there to have more than one breakable statement in the loop, TODO(315). |
| 2826 v8::Local<v8::Function> foo = CompileFunction( | 2847 v8::Local<v8::Function> foo = CompileFunction( |
| 2827 &env, | 2848 &env, |
| 2828 "function foo(a) {\n" | 2849 "function foo(a) {\n" |
| 2829 " var len = a.length;\n" | 2850 " var len = a.length;\n" |
| 2830 " for (var i = 0; i < len; i++) {\n" | 2851 " for (var i = 0; i < len; i++) {\n" |
| 2831 " y = 1;\n" | 2852 " y = 1;\n" |
| 2832 " a[i] = 42;\n" | 2853 " a[i] = 42;\n" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2851 | 2872 |
| 2852 // Set up break point and step through the function. | 2873 // Set up break point and step through the function. |
| 2853 SetBreakPoint(foo, 3); | 2874 SetBreakPoint(foo, 3); |
| 2854 step_action = StepNext; | 2875 step_action = StepNext; |
| 2855 break_point_hit_count = 0; | 2876 break_point_hit_count = 0; |
| 2856 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); | 2877 foo->Call(context, env->Global(), kArgc, args).ToLocalChecked(); |
| 2857 | 2878 |
| 2858 // With stepping all break locations are hit. | 2879 // With stepping all break locations are hit. |
| 2859 CHECK_EQ(44, break_point_hit_count); | 2880 CHECK_EQ(44, break_point_hit_count); |
| 2860 | 2881 |
| 2861 v8::Debug::SetDebugEventListener(NULL); | 2882 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2862 CheckDebuggerUnloaded(); | 2883 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2863 } | 2884 } |
| 2864 | 2885 |
| 2865 | 2886 |
| 2866 // Test of the stepping mechanism for named load in a loop. | 2887 // Test of the stepping mechanism for named load in a loop. |
| 2867 TEST(DebugStepNamedLoadLoop) { | 2888 TEST(DebugStepNamedLoadLoop) { |
| 2868 DebugLocalContext env; | 2889 DebugLocalContext env; |
| 2869 v8::HandleScope scope(env->GetIsolate()); | 2890 v8::HandleScope scope(env->GetIsolate()); |
| 2870 | 2891 |
| 2871 // Register a debug event listener which steps and counts. | 2892 // Register a debug event listener which steps and counts. |
| 2872 v8::Debug::SetDebugEventListener(DebugEventStep); | 2893 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2873 | 2894 |
| 2874 v8::Local<v8::Context> context = env.context(); | 2895 v8::Local<v8::Context> context = env.context(); |
| 2875 // Create a function for testing stepping of named load. | 2896 // Create a function for testing stepping of named load. |
| 2876 v8::Local<v8::Function> foo = CompileFunction( | 2897 v8::Local<v8::Function> foo = CompileFunction( |
| 2877 &env, | 2898 &env, |
| 2878 "function foo() {\n" | 2899 "function foo() {\n" |
| 2879 " var a = [];\n" | 2900 " var a = [];\n" |
| 2880 " var s = \"\";\n" | 2901 " var s = \"\";\n" |
| 2881 " for (var i = 0; i < 10; i++) {\n" | 2902 " for (var i = 0; i < 10; i++) {\n" |
| 2882 " var v = new V(i, i + 1);\n" | 2903 " var v = new V(i, i + 1);\n" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2896 | 2917 |
| 2897 // Set up break point and step through the function. | 2918 // Set up break point and step through the function. |
| 2898 SetBreakPoint(foo, 4); | 2919 SetBreakPoint(foo, 4); |
| 2899 step_action = StepNext; | 2920 step_action = StepNext; |
| 2900 break_point_hit_count = 0; | 2921 break_point_hit_count = 0; |
| 2901 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2922 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2902 | 2923 |
| 2903 // With stepping all break locations are hit. | 2924 // With stepping all break locations are hit. |
| 2904 CHECK_EQ(65, break_point_hit_count); | 2925 CHECK_EQ(65, break_point_hit_count); |
| 2905 | 2926 |
| 2906 v8::Debug::SetDebugEventListener(NULL); | 2927 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2907 CheckDebuggerUnloaded(); | 2928 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2908 } | 2929 } |
| 2909 | 2930 |
| 2910 | 2931 |
| 2911 static void DoDebugStepNamedStoreLoop(int expected) { | 2932 static void DoDebugStepNamedStoreLoop(int expected) { |
| 2912 DebugLocalContext env; | 2933 DebugLocalContext env; |
| 2913 v8::HandleScope scope(env->GetIsolate()); | 2934 v8::HandleScope scope(env->GetIsolate()); |
| 2914 | 2935 |
| 2915 // Register a debug event listener which steps and counts. | 2936 // Register a debug event listener which steps and counts. |
| 2916 v8::Debug::SetDebugEventListener(DebugEventStep); | 2937 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2917 | 2938 |
| 2918 // Create a function for testing stepping of named store. | 2939 // Create a function for testing stepping of named store. |
| 2919 v8::Local<v8::Context> context = env.context(); | 2940 v8::Local<v8::Context> context = env.context(); |
| 2920 v8::Local<v8::Function> foo = CompileFunction( | 2941 v8::Local<v8::Function> foo = CompileFunction( |
| 2921 &env, | 2942 &env, |
| 2922 "function foo() {\n" | 2943 "function foo() {\n" |
| 2923 " var a = {a:1};\n" | 2944 " var a = {a:1};\n" |
| 2924 " for (var i = 0; i < 10; i++) {\n" | 2945 " for (var i = 0; i < 10; i++) {\n" |
| 2925 " a.a = 2\n" | 2946 " a.a = 2\n" |
| 2926 " }\n" | 2947 " }\n" |
| 2927 "}\n", | 2948 "}\n", |
| 2928 "foo"); | 2949 "foo"); |
| 2929 | 2950 |
| 2930 // Call function without any break points to ensure inlining is in place. | 2951 // Call function without any break points to ensure inlining is in place. |
| 2931 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2952 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2932 | 2953 |
| 2933 // Set up break point and step through the function. | 2954 // Set up break point and step through the function. |
| 2934 SetBreakPoint(foo, 3); | 2955 SetBreakPoint(foo, 3); |
| 2935 step_action = StepNext; | 2956 step_action = StepNext; |
| 2936 break_point_hit_count = 0; | 2957 break_point_hit_count = 0; |
| 2937 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2958 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2938 | 2959 |
| 2939 // With stepping all expected break locations are hit. | 2960 // With stepping all expected break locations are hit. |
| 2940 CHECK_EQ(expected, break_point_hit_count); | 2961 CHECK_EQ(expected, break_point_hit_count); |
| 2941 | 2962 |
| 2942 v8::Debug::SetDebugEventListener(NULL); | 2963 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2943 CheckDebuggerUnloaded(); | 2964 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2944 } | 2965 } |
| 2945 | 2966 |
| 2946 | 2967 |
| 2947 // Test of the stepping mechanism for named load in a loop. | 2968 // Test of the stepping mechanism for named load in a loop. |
| 2948 TEST(DebugStepNamedStoreLoop) { DoDebugStepNamedStoreLoop(34); } | 2969 TEST(DebugStepNamedStoreLoop) { DoDebugStepNamedStoreLoop(34); } |
| 2949 | 2970 |
| 2950 | 2971 |
| 2951 // Test the stepping mechanism with different ICs. | 2972 // Test the stepping mechanism with different ICs. |
| 2952 TEST(DebugStepLinearMixedICs) { | 2973 TEST(DebugStepLinearMixedICs) { |
| 2953 DebugLocalContext env; | 2974 DebugLocalContext env; |
| 2954 v8::HandleScope scope(env->GetIsolate()); | 2975 v8::HandleScope scope(env->GetIsolate()); |
| 2955 | 2976 |
| 2956 // Register a debug event listener which steps and counts. | 2977 // Register a debug event listener which steps and counts. |
| 2957 v8::Debug::SetDebugEventListener(DebugEventStep); | 2978 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 2958 | 2979 |
| 2959 v8::Local<v8::Context> context = env.context(); | 2980 v8::Local<v8::Context> context = env.context(); |
| 2960 // Create a function for testing stepping. | 2981 // Create a function for testing stepping. |
| 2961 v8::Local<v8::Function> foo = CompileFunction(&env, | 2982 v8::Local<v8::Function> foo = CompileFunction(&env, |
| 2962 "function bar() {};" | 2983 "function bar() {};" |
| 2963 "function foo() {" | 2984 "function foo() {" |
| 2964 " var x;" | 2985 " var x;" |
| 2965 " var index='name';" | 2986 " var index='name';" |
| 2966 " var y = {};" | 2987 " var y = {};" |
| 2967 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); | 2988 " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); |
| 2968 | 2989 |
| 2969 // Run functions to allow them to get optimized. | 2990 // Run functions to allow them to get optimized. |
| 2970 CompileRun("a=0; b=0; bar(); foo();"); | 2991 CompileRun("a=0; b=0; bar(); foo();"); |
| 2971 | 2992 |
| 2972 SetBreakPoint(foo, 0); | 2993 SetBreakPoint(foo, 0); |
| 2973 | 2994 |
| 2974 step_action = StepIn; | 2995 step_action = StepIn; |
| 2975 break_point_hit_count = 0; | 2996 break_point_hit_count = 0; |
| 2976 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 2997 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2977 | 2998 |
| 2978 // With stepping all break locations are hit. | 2999 // With stepping all break locations are hit. |
| 2979 CHECK_EQ(11, break_point_hit_count); | 3000 CHECK_EQ(11, break_point_hit_count); |
| 2980 | 3001 |
| 2981 v8::Debug::SetDebugEventListener(NULL); | 3002 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2982 CheckDebuggerUnloaded(); | 3003 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2983 | 3004 |
| 2984 // Register a debug event listener which just counts. | 3005 // Register a debug event listener which just counts. |
| 2985 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 3006 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 3007 DebugEventBreakPointHitCount); |
| 2986 | 3008 |
| 2987 SetBreakPoint(foo, 0); | 3009 SetBreakPoint(foo, 0); |
| 2988 break_point_hit_count = 0; | 3010 break_point_hit_count = 0; |
| 2989 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3011 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 2990 | 3012 |
| 2991 // Without stepping only active break points are hit. | 3013 // Without stepping only active break points are hit. |
| 2992 CHECK_EQ(1, break_point_hit_count); | 3014 CHECK_EQ(1, break_point_hit_count); |
| 2993 | 3015 |
| 2994 v8::Debug::SetDebugEventListener(NULL); | 3016 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 2995 CheckDebuggerUnloaded(); | 3017 CheckDebuggerUnloaded(env->GetIsolate()); |
| 2996 } | 3018 } |
| 2997 | 3019 |
| 2998 | 3020 |
| 2999 TEST(DebugStepDeclarations) { | 3021 TEST(DebugStepDeclarations) { |
| 3000 DebugLocalContext env; | 3022 DebugLocalContext env; |
| 3001 v8::HandleScope scope(env->GetIsolate()); | 3023 v8::HandleScope scope(env->GetIsolate()); |
| 3002 | 3024 |
| 3003 // Register a debug event listener which steps and counts. | 3025 // Register a debug event listener which steps and counts. |
| 3004 v8::Debug::SetDebugEventListener(DebugEventStep); | 3026 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3005 | 3027 |
| 3006 v8::Local<v8::Context> context = env.context(); | 3028 v8::Local<v8::Context> context = env.context(); |
| 3007 // Create a function for testing stepping. Run it to allow it to get | 3029 // Create a function for testing stepping. Run it to allow it to get |
| 3008 // optimized. | 3030 // optimized. |
| 3009 const char* src = "function foo() { " | 3031 const char* src = "function foo() { " |
| 3010 " var a;" | 3032 " var a;" |
| 3011 " var b = 1;" | 3033 " var b = 1;" |
| 3012 " var c = foo;" | 3034 " var c = foo;" |
| 3013 " var d = Math.floor;" | 3035 " var d = Math.floor;" |
| 3014 " var e = b + d(1.2);" | 3036 " var e = b + d(1.2);" |
| 3015 "}" | 3037 "}" |
| 3016 "foo()"; | 3038 "foo()"; |
| 3017 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3039 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3018 | 3040 |
| 3019 SetBreakPoint(foo, 0); | 3041 SetBreakPoint(foo, 0); |
| 3020 | 3042 |
| 3021 // Stepping through the declarations. | 3043 // Stepping through the declarations. |
| 3022 step_action = StepIn; | 3044 step_action = StepIn; |
| 3023 break_point_hit_count = 0; | 3045 break_point_hit_count = 0; |
| 3024 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3046 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3025 CHECK_EQ(6, break_point_hit_count); | 3047 CHECK_EQ(6, break_point_hit_count); |
| 3026 | 3048 |
| 3027 // Get rid of the debug event listener. | 3049 // Get rid of the debug event listener. |
| 3028 v8::Debug::SetDebugEventListener(NULL); | 3050 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3029 CheckDebuggerUnloaded(); | 3051 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3030 } | 3052 } |
| 3031 | 3053 |
| 3032 | 3054 |
| 3033 TEST(DebugStepLocals) { | 3055 TEST(DebugStepLocals) { |
| 3034 DebugLocalContext env; | 3056 DebugLocalContext env; |
| 3035 v8::HandleScope scope(env->GetIsolate()); | 3057 v8::HandleScope scope(env->GetIsolate()); |
| 3036 | 3058 |
| 3037 // Register a debug event listener which steps and counts. | 3059 // Register a debug event listener which steps and counts. |
| 3038 v8::Debug::SetDebugEventListener(DebugEventStep); | 3060 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3039 | 3061 |
| 3040 v8::Local<v8::Context> context = env.context(); | 3062 v8::Local<v8::Context> context = env.context(); |
| 3041 // Create a function for testing stepping. Run it to allow it to get | 3063 // Create a function for testing stepping. Run it to allow it to get |
| 3042 // optimized. | 3064 // optimized. |
| 3043 const char* src = "function foo() { " | 3065 const char* src = "function foo() { " |
| 3044 " var a,b;" | 3066 " var a,b;" |
| 3045 " a = 1;" | 3067 " a = 1;" |
| 3046 " b = a + 2;" | 3068 " b = a + 2;" |
| 3047 " b = 1 + 2 + 3;" | 3069 " b = 1 + 2 + 3;" |
| 3048 " a = Math.floor(b);" | 3070 " a = Math.floor(b);" |
| 3049 "}" | 3071 "}" |
| 3050 "foo()"; | 3072 "foo()"; |
| 3051 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3073 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3052 | 3074 |
| 3053 SetBreakPoint(foo, 0); | 3075 SetBreakPoint(foo, 0); |
| 3054 | 3076 |
| 3055 // Stepping through the declarations. | 3077 // Stepping through the declarations. |
| 3056 step_action = StepIn; | 3078 step_action = StepIn; |
| 3057 break_point_hit_count = 0; | 3079 break_point_hit_count = 0; |
| 3058 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3080 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3059 CHECK_EQ(6, break_point_hit_count); | 3081 CHECK_EQ(6, break_point_hit_count); |
| 3060 | 3082 |
| 3061 // Get rid of the debug event listener. | 3083 // Get rid of the debug event listener. |
| 3062 v8::Debug::SetDebugEventListener(NULL); | 3084 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3063 CheckDebuggerUnloaded(); | 3085 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3064 } | 3086 } |
| 3065 | 3087 |
| 3066 | 3088 |
| 3067 TEST(DebugStepIf) { | 3089 TEST(DebugStepIf) { |
| 3068 DebugLocalContext env; | 3090 DebugLocalContext env; |
| 3069 v8::Isolate* isolate = env->GetIsolate(); | 3091 v8::Isolate* isolate = env->GetIsolate(); |
| 3070 v8::HandleScope scope(isolate); | 3092 v8::HandleScope scope(isolate); |
| 3071 | 3093 |
| 3072 // Register a debug event listener which steps and counts. | 3094 // Register a debug event listener which steps and counts. |
| 3073 v8::Debug::SetDebugEventListener(DebugEventStep); | 3095 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3074 | 3096 |
| 3075 v8::Local<v8::Context> context = env.context(); | 3097 v8::Local<v8::Context> context = env.context(); |
| 3076 // Create a function for testing stepping. Run it to allow it to get | 3098 // Create a function for testing stepping. Run it to allow it to get |
| 3077 // optimized. | 3099 // optimized. |
| 3078 const int argc = 1; | 3100 const int argc = 1; |
| 3079 const char* src = "function foo(x) { " | 3101 const char* src = "function foo(x) { " |
| 3080 " a = 1;" | 3102 " a = 1;" |
| 3081 " if (x) {" | 3103 " if (x) {" |
| 3082 " b = 1;" | 3104 " b = 1;" |
| 3083 " } else {" | 3105 " } else {" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3097 CHECK_EQ(4, break_point_hit_count); | 3119 CHECK_EQ(4, break_point_hit_count); |
| 3098 | 3120 |
| 3099 // Stepping through the false part. | 3121 // Stepping through the false part. |
| 3100 step_action = StepIn; | 3122 step_action = StepIn; |
| 3101 break_point_hit_count = 0; | 3123 break_point_hit_count = 0; |
| 3102 v8::Local<v8::Value> argv_false[argc] = {v8::False(isolate)}; | 3124 v8::Local<v8::Value> argv_false[argc] = {v8::False(isolate)}; |
| 3103 foo->Call(context, env->Global(), argc, argv_false).ToLocalChecked(); | 3125 foo->Call(context, env->Global(), argc, argv_false).ToLocalChecked(); |
| 3104 CHECK_EQ(5, break_point_hit_count); | 3126 CHECK_EQ(5, break_point_hit_count); |
| 3105 | 3127 |
| 3106 // Get rid of the debug event listener. | 3128 // Get rid of the debug event listener. |
| 3107 v8::Debug::SetDebugEventListener(NULL); | 3129 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3108 CheckDebuggerUnloaded(); | 3130 CheckDebuggerUnloaded(isolate); |
| 3109 } | 3131 } |
| 3110 | 3132 |
| 3111 | 3133 |
| 3112 TEST(DebugStepSwitch) { | 3134 TEST(DebugStepSwitch) { |
| 3113 DebugLocalContext env; | 3135 DebugLocalContext env; |
| 3114 v8::Isolate* isolate = env->GetIsolate(); | 3136 v8::Isolate* isolate = env->GetIsolate(); |
| 3115 v8::HandleScope scope(isolate); | 3137 v8::HandleScope scope(isolate); |
| 3116 | 3138 |
| 3117 // Register a debug event listener which steps and counts. | 3139 // Register a debug event listener which steps and counts. |
| 3118 v8::Debug::SetDebugEventListener(DebugEventStep); | 3140 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3119 | 3141 |
| 3120 v8::Local<v8::Context> context = env.context(); | 3142 v8::Local<v8::Context> context = env.context(); |
| 3121 // Create a function for testing stepping. Run it to allow it to get | 3143 // Create a function for testing stepping. Run it to allow it to get |
| 3122 // optimized. | 3144 // optimized. |
| 3123 const int argc = 1; | 3145 const int argc = 1; |
| 3124 const char* src = "function foo(x) { " | 3146 const char* src = "function foo(x) { " |
| 3125 " a = 1;" | 3147 " a = 1;" |
| 3126 " switch (x) {" | 3148 " switch (x) {" |
| 3127 " case 1:" | 3149 " case 1:" |
| 3128 " b = 1;" | 3150 " b = 1;" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 3155 CHECK_EQ(5, break_point_hit_count); | 3177 CHECK_EQ(5, break_point_hit_count); |
| 3156 | 3178 |
| 3157 // Last case. | 3179 // Last case. |
| 3158 step_action = StepIn; | 3180 step_action = StepIn; |
| 3159 break_point_hit_count = 0; | 3181 break_point_hit_count = 0; |
| 3160 v8::Local<v8::Value> argv_3[argc] = {v8::Number::New(isolate, 3)}; | 3182 v8::Local<v8::Value> argv_3[argc] = {v8::Number::New(isolate, 3)}; |
| 3161 foo->Call(context, env->Global(), argc, argv_3).ToLocalChecked(); | 3183 foo->Call(context, env->Global(), argc, argv_3).ToLocalChecked(); |
| 3162 CHECK_EQ(7, break_point_hit_count); | 3184 CHECK_EQ(7, break_point_hit_count); |
| 3163 | 3185 |
| 3164 // Get rid of the debug event listener. | 3186 // Get rid of the debug event listener. |
| 3165 v8::Debug::SetDebugEventListener(NULL); | 3187 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3166 CheckDebuggerUnloaded(); | 3188 CheckDebuggerUnloaded(isolate); |
| 3167 } | 3189 } |
| 3168 | 3190 |
| 3169 | 3191 |
| 3170 TEST(DebugStepWhile) { | 3192 TEST(DebugStepWhile) { |
| 3171 DebugLocalContext env; | 3193 DebugLocalContext env; |
| 3172 v8::Isolate* isolate = env->GetIsolate(); | 3194 v8::Isolate* isolate = env->GetIsolate(); |
| 3173 v8::HandleScope scope(isolate); | 3195 v8::HandleScope scope(isolate); |
| 3174 | 3196 |
| 3175 // Register a debug event listener which steps and counts. | 3197 // Register a debug event listener which steps and counts. |
| 3176 v8::Debug::SetDebugEventListener(DebugEventStep); | 3198 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3177 | 3199 |
| 3178 v8::Local<v8::Context> context = env.context(); | 3200 v8::Local<v8::Context> context = env.context(); |
| 3179 // Create a function for testing stepping. Run it to allow it to get | 3201 // Create a function for testing stepping. Run it to allow it to get |
| 3180 // optimized. | 3202 // optimized. |
| 3181 const int argc = 1; | 3203 const int argc = 1; |
| 3182 const char* src = "function foo(x) { " | 3204 const char* src = "function foo(x) { " |
| 3183 " var a = 0;" | 3205 " var a = 0;" |
| 3184 " while (a < x) {" | 3206 " while (a < x) {" |
| 3185 " a++;" | 3207 " a++;" |
| 3186 " }" | 3208 " }" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3204 CHECK_EQ(23, break_point_hit_count); | 3226 CHECK_EQ(23, break_point_hit_count); |
| 3205 | 3227 |
| 3206 // Looping 100 times. | 3228 // Looping 100 times. |
| 3207 step_action = StepIn; | 3229 step_action = StepIn; |
| 3208 break_point_hit_count = 0; | 3230 break_point_hit_count = 0; |
| 3209 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3231 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
| 3210 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3232 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
| 3211 CHECK_EQ(203, break_point_hit_count); | 3233 CHECK_EQ(203, break_point_hit_count); |
| 3212 | 3234 |
| 3213 // Get rid of the debug event listener. | 3235 // Get rid of the debug event listener. |
| 3214 v8::Debug::SetDebugEventListener(NULL); | 3236 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3215 CheckDebuggerUnloaded(); | 3237 CheckDebuggerUnloaded(isolate); |
| 3216 } | 3238 } |
| 3217 | 3239 |
| 3218 | 3240 |
| 3219 TEST(DebugStepDoWhile) { | 3241 TEST(DebugStepDoWhile) { |
| 3220 DebugLocalContext env; | 3242 DebugLocalContext env; |
| 3221 v8::Isolate* isolate = env->GetIsolate(); | 3243 v8::Isolate* isolate = env->GetIsolate(); |
| 3222 v8::HandleScope scope(isolate); | 3244 v8::HandleScope scope(isolate); |
| 3223 | 3245 |
| 3224 // Register a debug event listener which steps and counts. | 3246 // Register a debug event listener which steps and counts. |
| 3225 v8::Debug::SetDebugEventListener(DebugEventStep); | 3247 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3226 | 3248 |
| 3227 v8::Local<v8::Context> context = env.context(); | 3249 v8::Local<v8::Context> context = env.context(); |
| 3228 // Create a function for testing stepping. Run it to allow it to get | 3250 // Create a function for testing stepping. Run it to allow it to get |
| 3229 // optimized. | 3251 // optimized. |
| 3230 const int argc = 1; | 3252 const int argc = 1; |
| 3231 const char* src = "function foo(x) { " | 3253 const char* src = "function foo(x) { " |
| 3232 " var a = 0;" | 3254 " var a = 0;" |
| 3233 " do {" | 3255 " do {" |
| 3234 " a++;" | 3256 " a++;" |
| 3235 " } while (a < x)" | 3257 " } while (a < x)" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3253 CHECK_EQ(22, break_point_hit_count); | 3275 CHECK_EQ(22, break_point_hit_count); |
| 3254 | 3276 |
| 3255 // Looping 100 times. | 3277 // Looping 100 times. |
| 3256 step_action = StepIn; | 3278 step_action = StepIn; |
| 3257 break_point_hit_count = 0; | 3279 break_point_hit_count = 0; |
| 3258 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3280 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
| 3259 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3281 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
| 3260 CHECK_EQ(202, break_point_hit_count); | 3282 CHECK_EQ(202, break_point_hit_count); |
| 3261 | 3283 |
| 3262 // Get rid of the debug event listener. | 3284 // Get rid of the debug event listener. |
| 3263 v8::Debug::SetDebugEventListener(NULL); | 3285 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3264 CheckDebuggerUnloaded(); | 3286 CheckDebuggerUnloaded(isolate); |
| 3265 } | 3287 } |
| 3266 | 3288 |
| 3267 | 3289 |
| 3268 TEST(DebugStepFor) { | 3290 TEST(DebugStepFor) { |
| 3269 DebugLocalContext env; | 3291 DebugLocalContext env; |
| 3270 v8::Isolate* isolate = env->GetIsolate(); | 3292 v8::Isolate* isolate = env->GetIsolate(); |
| 3271 v8::HandleScope scope(isolate); | 3293 v8::HandleScope scope(isolate); |
| 3272 | 3294 |
| 3273 // Register a debug event listener which steps and counts. | 3295 // Register a debug event listener which steps and counts. |
| 3274 v8::Debug::SetDebugEventListener(DebugEventStep); | 3296 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3275 | 3297 |
| 3276 v8::Local<v8::Context> context = env.context(); | 3298 v8::Local<v8::Context> context = env.context(); |
| 3277 // Create a function for testing stepping. Run it to allow it to get | 3299 // Create a function for testing stepping. Run it to allow it to get |
| 3278 // optimized. | 3300 // optimized. |
| 3279 const int argc = 1; | 3301 const int argc = 1; |
| 3280 const char* src = "function foo(x) { " | 3302 const char* src = "function foo(x) { " |
| 3281 " a = 1;" | 3303 " a = 1;" |
| 3282 " for (i = 0; i < x; i++) {" | 3304 " for (i = 0; i < x; i++) {" |
| 3283 " b = 1;" | 3305 " b = 1;" |
| 3284 " }" | 3306 " }" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3303 CHECK_EQ(34, break_point_hit_count); | 3325 CHECK_EQ(34, break_point_hit_count); |
| 3304 | 3326 |
| 3305 // Looping 100 times. | 3327 // Looping 100 times. |
| 3306 step_action = StepIn; | 3328 step_action = StepIn; |
| 3307 break_point_hit_count = 0; | 3329 break_point_hit_count = 0; |
| 3308 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3330 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
| 3309 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3331 foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
| 3310 CHECK_EQ(304, break_point_hit_count); | 3332 CHECK_EQ(304, break_point_hit_count); |
| 3311 | 3333 |
| 3312 // Get rid of the debug event listener. | 3334 // Get rid of the debug event listener. |
| 3313 v8::Debug::SetDebugEventListener(NULL); | 3335 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3314 CheckDebuggerUnloaded(); | 3336 CheckDebuggerUnloaded(isolate); |
| 3315 } | 3337 } |
| 3316 | 3338 |
| 3317 | 3339 |
| 3318 TEST(DebugStepForContinue) { | 3340 TEST(DebugStepForContinue) { |
| 3319 DebugLocalContext env; | 3341 DebugLocalContext env; |
| 3320 v8::Isolate* isolate = env->GetIsolate(); | 3342 v8::Isolate* isolate = env->GetIsolate(); |
| 3321 v8::HandleScope scope(isolate); | 3343 v8::HandleScope scope(isolate); |
| 3322 | 3344 |
| 3323 // Register a debug event listener which steps and counts. | 3345 // Register a debug event listener which steps and counts. |
| 3324 v8::Debug::SetDebugEventListener(DebugEventStep); | 3346 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3325 | 3347 |
| 3326 v8::Local<v8::Context> context = env.context(); | 3348 v8::Local<v8::Context> context = env.context(); |
| 3327 // Create a function for testing stepping. Run it to allow it to get | 3349 // Create a function for testing stepping. Run it to allow it to get |
| 3328 // optimized. | 3350 // optimized. |
| 3329 const int argc = 1; | 3351 const int argc = 1; |
| 3330 const char* src = "function foo(x) { " | 3352 const char* src = "function foo(x) { " |
| 3331 " var a = 0;" | 3353 " var a = 0;" |
| 3332 " var b = 0;" | 3354 " var b = 0;" |
| 3333 " var c = 0;" | 3355 " var c = 0;" |
| 3334 " for (var i = 0; i < x; i++) {" | 3356 " for (var i = 0; i < x; i++) {" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3356 | 3378 |
| 3357 // Looping 100 times. | 3379 // Looping 100 times. |
| 3358 step_action = StepIn; | 3380 step_action = StepIn; |
| 3359 break_point_hit_count = 0; | 3381 break_point_hit_count = 0; |
| 3360 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3382 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
| 3361 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3383 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
| 3362 CHECK_EQ(50, result->Int32Value(context).FromJust()); | 3384 CHECK_EQ(50, result->Int32Value(context).FromJust()); |
| 3363 CHECK_EQ(557, break_point_hit_count); | 3385 CHECK_EQ(557, break_point_hit_count); |
| 3364 | 3386 |
| 3365 // Get rid of the debug event listener. | 3387 // Get rid of the debug event listener. |
| 3366 v8::Debug::SetDebugEventListener(NULL); | 3388 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3367 CheckDebuggerUnloaded(); | 3389 CheckDebuggerUnloaded(isolate); |
| 3368 } | 3390 } |
| 3369 | 3391 |
| 3370 | 3392 |
| 3371 TEST(DebugStepForBreak) { | 3393 TEST(DebugStepForBreak) { |
| 3372 DebugLocalContext env; | 3394 DebugLocalContext env; |
| 3373 v8::Isolate* isolate = env->GetIsolate(); | 3395 v8::Isolate* isolate = env->GetIsolate(); |
| 3374 v8::HandleScope scope(isolate); | 3396 v8::HandleScope scope(isolate); |
| 3375 | 3397 |
| 3376 // Register a debug event listener which steps and counts. | 3398 // Register a debug event listener which steps and counts. |
| 3377 v8::Debug::SetDebugEventListener(DebugEventStep); | 3399 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3378 | 3400 |
| 3379 v8::Local<v8::Context> context = env.context(); | 3401 v8::Local<v8::Context> context = env.context(); |
| 3380 // Create a function for testing stepping. Run it to allow it to get | 3402 // Create a function for testing stepping. Run it to allow it to get |
| 3381 // optimized. | 3403 // optimized. |
| 3382 const int argc = 1; | 3404 const int argc = 1; |
| 3383 const char* src = "function foo(x) { " | 3405 const char* src = "function foo(x) { " |
| 3384 " var a = 0;" | 3406 " var a = 0;" |
| 3385 " var b = 0;" | 3407 " var b = 0;" |
| 3386 " var c = 0;" | 3408 " var c = 0;" |
| 3387 " for (var i = 0; i < 1000; i++) {" | 3409 " for (var i = 0; i < 1000; i++) {" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3410 | 3432 |
| 3411 // Looping 100 times. | 3433 // Looping 100 times. |
| 3412 step_action = StepIn; | 3434 step_action = StepIn; |
| 3413 break_point_hit_count = 0; | 3435 break_point_hit_count = 0; |
| 3414 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; | 3436 v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)}; |
| 3415 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); | 3437 result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked(); |
| 3416 CHECK_EQ(99, result->Int32Value(context).FromJust()); | 3438 CHECK_EQ(99, result->Int32Value(context).FromJust()); |
| 3417 CHECK_EQ(604, break_point_hit_count); | 3439 CHECK_EQ(604, break_point_hit_count); |
| 3418 | 3440 |
| 3419 // Get rid of the debug event listener. | 3441 // Get rid of the debug event listener. |
| 3420 v8::Debug::SetDebugEventListener(NULL); | 3442 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3421 CheckDebuggerUnloaded(); | 3443 CheckDebuggerUnloaded(isolate); |
| 3422 } | 3444 } |
| 3423 | 3445 |
| 3424 | 3446 |
| 3425 TEST(DebugStepForIn) { | 3447 TEST(DebugStepForIn) { |
| 3426 DebugLocalContext env; | 3448 DebugLocalContext env; |
| 3427 v8::HandleScope scope(env->GetIsolate()); | 3449 v8::HandleScope scope(env->GetIsolate()); |
| 3428 | 3450 |
| 3429 // Register a debug event listener which steps and counts. | 3451 // Register a debug event listener which steps and counts. |
| 3430 v8::Debug::SetDebugEventListener(DebugEventStep); | 3452 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3431 | 3453 |
| 3432 v8::Local<v8::Context> context = env.context(); | 3454 v8::Local<v8::Context> context = env.context(); |
| 3433 // Create a function for testing stepping. Run it to allow it to get | 3455 // Create a function for testing stepping. Run it to allow it to get |
| 3434 // optimized. | 3456 // optimized. |
| 3435 v8::Local<v8::Function> foo; | 3457 v8::Local<v8::Function> foo; |
| 3436 const char* src_1 = "function foo() { " | 3458 const char* src_1 = "function foo() { " |
| 3437 " var a = [1, 2];" | 3459 " var a = [1, 2];" |
| 3438 " for (x in a) {" | 3460 " for (x in a) {" |
| 3439 " b = 0;" | 3461 " b = 0;" |
| 3440 " }" | 3462 " }" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3459 "foo()"; | 3481 "foo()"; |
| 3460 foo = CompileFunction(&env, src_2, "foo"); | 3482 foo = CompileFunction(&env, src_2, "foo"); |
| 3461 SetBreakPoint(foo, 0); // "var a = ..." | 3483 SetBreakPoint(foo, 0); // "var a = ..." |
| 3462 | 3484 |
| 3463 step_action = StepIn; | 3485 step_action = StepIn; |
| 3464 break_point_hit_count = 0; | 3486 break_point_hit_count = 0; |
| 3465 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3487 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3466 CHECK_EQ(10, break_point_hit_count); | 3488 CHECK_EQ(10, break_point_hit_count); |
| 3467 | 3489 |
| 3468 // Get rid of the debug event listener. | 3490 // Get rid of the debug event listener. |
| 3469 v8::Debug::SetDebugEventListener(NULL); | 3491 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3470 CheckDebuggerUnloaded(); | 3492 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3471 } | 3493 } |
| 3472 | 3494 |
| 3473 | 3495 |
| 3474 TEST(DebugStepWith) { | 3496 TEST(DebugStepWith) { |
| 3475 DebugLocalContext env; | 3497 DebugLocalContext env; |
| 3476 v8::HandleScope scope(env->GetIsolate()); | 3498 v8::HandleScope scope(env->GetIsolate()); |
| 3477 | 3499 |
| 3478 // Register a debug event listener which steps and counts. | 3500 // Register a debug event listener which steps and counts. |
| 3479 v8::Debug::SetDebugEventListener(DebugEventStep); | 3501 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3480 | 3502 |
| 3481 v8::Local<v8::Context> context = env.context(); | 3503 v8::Local<v8::Context> context = env.context(); |
| 3482 // Create a function for testing stepping. Run it to allow it to get | 3504 // Create a function for testing stepping. Run it to allow it to get |
| 3483 // optimized. | 3505 // optimized. |
| 3484 const char* src = "function foo(x) { " | 3506 const char* src = "function foo(x) { " |
| 3485 " var a = {};" | 3507 " var a = {};" |
| 3486 " with (a) {}" | 3508 " with (a) {}" |
| 3487 " with (b) {}" | 3509 " with (b) {}" |
| 3488 "}" | 3510 "}" |
| 3489 "foo()"; | 3511 "foo()"; |
| 3490 CHECK(env->Global() | 3512 CHECK(env->Global() |
| 3491 ->Set(context, v8_str(env->GetIsolate(), "b"), | 3513 ->Set(context, v8_str(env->GetIsolate(), "b"), |
| 3492 v8::Object::New(env->GetIsolate())) | 3514 v8::Object::New(env->GetIsolate())) |
| 3493 .FromJust()); | 3515 .FromJust()); |
| 3494 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3516 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3495 v8::Local<v8::Value> result; | 3517 v8::Local<v8::Value> result; |
| 3496 SetBreakPoint(foo, 8); // "var a = {};" | 3518 SetBreakPoint(foo, 8); // "var a = {};" |
| 3497 | 3519 |
| 3498 step_action = StepIn; | 3520 step_action = StepIn; |
| 3499 break_point_hit_count = 0; | 3521 break_point_hit_count = 0; |
| 3500 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3522 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3501 CHECK_EQ(4, break_point_hit_count); | 3523 CHECK_EQ(4, break_point_hit_count); |
| 3502 | 3524 |
| 3503 // Get rid of the debug event listener. | 3525 // Get rid of the debug event listener. |
| 3504 v8::Debug::SetDebugEventListener(NULL); | 3526 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3505 CheckDebuggerUnloaded(); | 3527 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3506 } | 3528 } |
| 3507 | 3529 |
| 3508 | 3530 |
| 3509 TEST(DebugConditional) { | 3531 TEST(DebugConditional) { |
| 3510 DebugLocalContext env; | 3532 DebugLocalContext env; |
| 3511 v8::Isolate* isolate = env->GetIsolate(); | 3533 v8::Isolate* isolate = env->GetIsolate(); |
| 3512 v8::HandleScope scope(isolate); | 3534 v8::HandleScope scope(isolate); |
| 3513 | 3535 |
| 3514 // Register a debug event listener which steps and counts. | 3536 // Register a debug event listener which steps and counts. |
| 3515 v8::Debug::SetDebugEventListener(DebugEventStep); | 3537 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3516 | 3538 |
| 3517 v8::Local<v8::Context> context = env.context(); | 3539 v8::Local<v8::Context> context = env.context(); |
| 3518 // Create a function for testing stepping. Run it to allow it to get | 3540 // Create a function for testing stepping. Run it to allow it to get |
| 3519 // optimized. | 3541 // optimized. |
| 3520 const char* src = "function foo(x) { " | 3542 const char* src = "function foo(x) { " |
| 3521 " var a;" | 3543 " var a;" |
| 3522 " a = x ? 1 : 2;" | 3544 " a = x ? 1 : 2;" |
| 3523 " return a;" | 3545 " return a;" |
| 3524 "}" | 3546 "}" |
| 3525 "foo()"; | 3547 "foo()"; |
| 3526 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); | 3548 v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); |
| 3527 SetBreakPoint(foo, 0); // "var a;" | 3549 SetBreakPoint(foo, 0); // "var a;" |
| 3528 | 3550 |
| 3529 step_action = StepIn; | 3551 step_action = StepIn; |
| 3530 break_point_hit_count = 0; | 3552 break_point_hit_count = 0; |
| 3531 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3553 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3532 CHECK_EQ(4, break_point_hit_count); | 3554 CHECK_EQ(4, break_point_hit_count); |
| 3533 | 3555 |
| 3534 step_action = StepIn; | 3556 step_action = StepIn; |
| 3535 break_point_hit_count = 0; | 3557 break_point_hit_count = 0; |
| 3536 const int argc = 1; | 3558 const int argc = 1; |
| 3537 v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)}; | 3559 v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)}; |
| 3538 foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked(); | 3560 foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked(); |
| 3539 CHECK_EQ(4, break_point_hit_count); | 3561 CHECK_EQ(4, break_point_hit_count); |
| 3540 | 3562 |
| 3541 // Get rid of the debug event listener. | 3563 // Get rid of the debug event listener. |
| 3542 v8::Debug::SetDebugEventListener(NULL); | 3564 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3543 CheckDebuggerUnloaded(); | 3565 CheckDebuggerUnloaded(isolate); |
| 3544 } | 3566 } |
| 3545 | 3567 |
| 3546 | 3568 |
| 3547 TEST(StepInOutSimple) { | 3569 TEST(StepInOutSimple) { |
| 3548 DebugLocalContext env; | 3570 DebugLocalContext env; |
| 3549 v8::HandleScope scope(env->GetIsolate()); | 3571 v8::HandleScope scope(env->GetIsolate()); |
| 3550 | 3572 |
| 3551 // Create a function for checking the function when hitting a break point. | 3573 // Create a function for checking the function when hitting a break point. |
| 3552 frame_function_name = CompileFunction(&env, | 3574 frame_function_name = CompileFunction(&env, |
| 3553 frame_function_name_source, | 3575 frame_function_name_source, |
| 3554 "frame_function_name"); | 3576 "frame_function_name"); |
| 3555 | 3577 |
| 3556 // Register a debug event listener which steps and counts. | 3578 // Register a debug event listener which steps and counts. |
| 3557 v8::Debug::SetDebugEventListener(DebugEventStepSequence); | 3579 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
| 3558 | 3580 |
| 3559 v8::Local<v8::Context> context = env.context(); | 3581 v8::Local<v8::Context> context = env.context(); |
| 3560 // Create a function for testing stepping. Run it to allow it to get | 3582 // Create a function for testing stepping. Run it to allow it to get |
| 3561 // optimized. | 3583 // optimized. |
| 3562 const char* src = "function a() {b();c();}; " | 3584 const char* src = "function a() {b();c();}; " |
| 3563 "function b() {c();}; " | 3585 "function b() {c();}; " |
| 3564 "function c() {}; " | 3586 "function c() {}; " |
| 3565 "a(); b(); c()"; | 3587 "a(); b(); c()"; |
| 3566 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3588 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
| 3567 SetBreakPoint(a, 0); | 3589 SetBreakPoint(a, 0); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3584 | 3606 |
| 3585 // Step through invocation of a with step out. | 3607 // Step through invocation of a with step out. |
| 3586 step_action = StepOut; | 3608 step_action = StepOut; |
| 3587 break_point_hit_count = 0; | 3609 break_point_hit_count = 0; |
| 3588 expected_step_sequence = "a"; | 3610 expected_step_sequence = "a"; |
| 3589 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3611 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3590 CHECK_EQ(StrLength(expected_step_sequence), | 3612 CHECK_EQ(StrLength(expected_step_sequence), |
| 3591 break_point_hit_count); | 3613 break_point_hit_count); |
| 3592 | 3614 |
| 3593 // Get rid of the debug event listener. | 3615 // Get rid of the debug event listener. |
| 3594 v8::Debug::SetDebugEventListener(NULL); | 3616 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3595 CheckDebuggerUnloaded(); | 3617 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3596 } | 3618 } |
| 3597 | 3619 |
| 3598 | 3620 |
| 3599 TEST(StepInOutTree) { | 3621 TEST(StepInOutTree) { |
| 3600 DebugLocalContext env; | 3622 DebugLocalContext env; |
| 3601 v8::HandleScope scope(env->GetIsolate()); | 3623 v8::HandleScope scope(env->GetIsolate()); |
| 3602 | 3624 |
| 3603 // Create a function for checking the function when hitting a break point. | 3625 // Create a function for checking the function when hitting a break point. |
| 3604 frame_function_name = CompileFunction(&env, | 3626 frame_function_name = CompileFunction(&env, |
| 3605 frame_function_name_source, | 3627 frame_function_name_source, |
| 3606 "frame_function_name"); | 3628 "frame_function_name"); |
| 3607 | 3629 |
| 3608 // Register a debug event listener which steps and counts. | 3630 // Register a debug event listener which steps and counts. |
| 3609 v8::Debug::SetDebugEventListener(DebugEventStepSequence); | 3631 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
| 3610 | 3632 |
| 3611 v8::Local<v8::Context> context = env.context(); | 3633 v8::Local<v8::Context> context = env.context(); |
| 3612 // Create a function for testing stepping. Run it to allow it to get | 3634 // Create a function for testing stepping. Run it to allow it to get |
| 3613 // optimized. | 3635 // optimized. |
| 3614 const char* src = "function a() {b(c(d()),d());c(d());d()}; " | 3636 const char* src = "function a() {b(c(d()),d());c(d());d()}; " |
| 3615 "function b(x,y) {c();}; " | 3637 "function b(x,y) {c();}; " |
| 3616 "function c(x) {}; " | 3638 "function c(x) {}; " |
| 3617 "function d() {}; " | 3639 "function d() {}; " |
| 3618 "a(); b(); c(); d()"; | 3640 "a(); b(); c(); d()"; |
| 3619 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3641 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3637 | 3659 |
| 3638 // Step through invocation of a with step out. | 3660 // Step through invocation of a with step out. |
| 3639 step_action = StepOut; | 3661 step_action = StepOut; |
| 3640 break_point_hit_count = 0; | 3662 break_point_hit_count = 0; |
| 3641 expected_step_sequence = "a"; | 3663 expected_step_sequence = "a"; |
| 3642 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3664 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3643 CHECK_EQ(StrLength(expected_step_sequence), | 3665 CHECK_EQ(StrLength(expected_step_sequence), |
| 3644 break_point_hit_count); | 3666 break_point_hit_count); |
| 3645 | 3667 |
| 3646 // Get rid of the debug event listener. | 3668 // Get rid of the debug event listener. |
| 3647 v8::Debug::SetDebugEventListener(NULL); | 3669 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3648 CheckDebuggerUnloaded(true); | 3670 CheckDebuggerUnloaded(env->GetIsolate(), true); |
| 3649 } | 3671 } |
| 3650 | 3672 |
| 3651 | 3673 |
| 3652 TEST(StepInOutBranch) { | 3674 TEST(StepInOutBranch) { |
| 3653 DebugLocalContext env; | 3675 DebugLocalContext env; |
| 3654 v8::HandleScope scope(env->GetIsolate()); | 3676 v8::HandleScope scope(env->GetIsolate()); |
| 3655 | 3677 |
| 3656 // Create a function for checking the function when hitting a break point. | 3678 // Create a function for checking the function when hitting a break point. |
| 3657 frame_function_name = CompileFunction(&env, | 3679 frame_function_name = CompileFunction(&env, |
| 3658 frame_function_name_source, | 3680 frame_function_name_source, |
| 3659 "frame_function_name"); | 3681 "frame_function_name"); |
| 3660 | 3682 |
| 3661 // Register a debug event listener which steps and counts. | 3683 // Register a debug event listener which steps and counts. |
| 3662 v8::Debug::SetDebugEventListener(DebugEventStepSequence); | 3684 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
| 3663 | 3685 |
| 3664 v8::Local<v8::Context> context = env.context(); | 3686 v8::Local<v8::Context> context = env.context(); |
| 3665 // Create a function for testing stepping. Run it to allow it to get | 3687 // Create a function for testing stepping. Run it to allow it to get |
| 3666 // optimized. | 3688 // optimized. |
| 3667 const char* src = "function a() {b(false);c();}; " | 3689 const char* src = "function a() {b(false);c();}; " |
| 3668 "function b(x) {if(x){c();};}; " | 3690 "function b(x) {if(x){c();};}; " |
| 3669 "function c() {}; " | 3691 "function c() {}; " |
| 3670 "a(); b(); c()"; | 3692 "a(); b(); c()"; |
| 3671 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); | 3693 v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); |
| 3672 SetBreakPoint(a, 0); | 3694 SetBreakPoint(a, 0); |
| 3673 | 3695 |
| 3674 // Step through invocation of a. | 3696 // Step through invocation of a. |
| 3675 step_action = StepIn; | 3697 step_action = StepIn; |
| 3676 break_point_hit_count = 0; | 3698 break_point_hit_count = 0; |
| 3677 expected_step_sequence = "abbaca"; | 3699 expected_step_sequence = "abbaca"; |
| 3678 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3700 a->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3679 CHECK_EQ(StrLength(expected_step_sequence), | 3701 CHECK_EQ(StrLength(expected_step_sequence), |
| 3680 break_point_hit_count); | 3702 break_point_hit_count); |
| 3681 | 3703 |
| 3682 // Get rid of the debug event listener. | 3704 // Get rid of the debug event listener. |
| 3683 v8::Debug::SetDebugEventListener(NULL); | 3705 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3684 CheckDebuggerUnloaded(); | 3706 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3685 } | 3707 } |
| 3686 | 3708 |
| 3687 | 3709 |
| 3688 // Test that step in does not step into native functions. | 3710 // Test that step in does not step into native functions. |
| 3689 TEST(DebugStepNatives) { | 3711 TEST(DebugStepNatives) { |
| 3690 DebugLocalContext env; | 3712 DebugLocalContext env; |
| 3691 v8::HandleScope scope(env->GetIsolate()); | 3713 v8::HandleScope scope(env->GetIsolate()); |
| 3692 | 3714 |
| 3693 // Create a function for testing stepping. | 3715 // Create a function for testing stepping. |
| 3694 v8::Local<v8::Function> foo = CompileFunction( | 3716 v8::Local<v8::Function> foo = CompileFunction( |
| 3695 &env, | 3717 &env, |
| 3696 "function foo(){debugger;Math.sin(1);}", | 3718 "function foo(){debugger;Math.sin(1);}", |
| 3697 "foo"); | 3719 "foo"); |
| 3698 | 3720 |
| 3699 // Register a debug event listener which steps and counts. | 3721 // Register a debug event listener which steps and counts. |
| 3700 v8::Debug::SetDebugEventListener(DebugEventStep); | 3722 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3701 | 3723 |
| 3702 v8::Local<v8::Context> context = env.context(); | 3724 v8::Local<v8::Context> context = env.context(); |
| 3703 step_action = StepIn; | 3725 step_action = StepIn; |
| 3704 break_point_hit_count = 0; | 3726 break_point_hit_count = 0; |
| 3705 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3727 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3706 | 3728 |
| 3707 // With stepping all break locations are hit. | 3729 // With stepping all break locations are hit. |
| 3708 CHECK_EQ(3, break_point_hit_count); | 3730 CHECK_EQ(3, break_point_hit_count); |
| 3709 | 3731 |
| 3710 v8::Debug::SetDebugEventListener(NULL); | 3732 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3711 CheckDebuggerUnloaded(); | 3733 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3712 | 3734 |
| 3713 // Register a debug event listener which just counts. | 3735 // Register a debug event listener which just counts. |
| 3714 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 3736 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 3737 DebugEventBreakPointHitCount); |
| 3715 | 3738 |
| 3716 break_point_hit_count = 0; | 3739 break_point_hit_count = 0; |
| 3717 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3740 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3718 | 3741 |
| 3719 // Without stepping only active break points are hit. | 3742 // Without stepping only active break points are hit. |
| 3720 CHECK_EQ(1, break_point_hit_count); | 3743 CHECK_EQ(1, break_point_hit_count); |
| 3721 | 3744 |
| 3722 v8::Debug::SetDebugEventListener(NULL); | 3745 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3723 CheckDebuggerUnloaded(); | 3746 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3724 } | 3747 } |
| 3725 | 3748 |
| 3726 | 3749 |
| 3727 // Test that step in works with function.apply. | 3750 // Test that step in works with function.apply. |
| 3728 TEST(DebugStepFunctionApply) { | 3751 TEST(DebugStepFunctionApply) { |
| 3729 DebugLocalContext env; | 3752 DebugLocalContext env; |
| 3730 v8::HandleScope scope(env->GetIsolate()); | 3753 v8::HandleScope scope(env->GetIsolate()); |
| 3731 | 3754 |
| 3732 // Create a function for testing stepping. | 3755 // Create a function for testing stepping. |
| 3733 v8::Local<v8::Function> foo = CompileFunction( | 3756 v8::Local<v8::Function> foo = CompileFunction( |
| 3734 &env, | 3757 &env, |
| 3735 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" | 3758 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" |
| 3736 "function foo(){ debugger; bar.apply(this, [1,2,3]); }", | 3759 "function foo(){ debugger; bar.apply(this, [1,2,3]); }", |
| 3737 "foo"); | 3760 "foo"); |
| 3738 | 3761 |
| 3739 // Register a debug event listener which steps and counts. | 3762 // Register a debug event listener which steps and counts. |
| 3740 v8::Debug::SetDebugEventListener(DebugEventStep); | 3763 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep); |
| 3741 | 3764 |
| 3742 v8::Local<v8::Context> context = env.context(); | 3765 v8::Local<v8::Context> context = env.context(); |
| 3743 step_action = StepIn; | 3766 step_action = StepIn; |
| 3744 break_point_hit_count = 0; | 3767 break_point_hit_count = 0; |
| 3745 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3768 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3746 | 3769 |
| 3747 // With stepping all break locations are hit. | 3770 // With stepping all break locations are hit. |
| 3748 CHECK_EQ(7, break_point_hit_count); | 3771 CHECK_EQ(7, break_point_hit_count); |
| 3749 | 3772 |
| 3750 v8::Debug::SetDebugEventListener(NULL); | 3773 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3751 CheckDebuggerUnloaded(); | 3774 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3752 | 3775 |
| 3753 // Register a debug event listener which just counts. | 3776 // Register a debug event listener which just counts. |
| 3754 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 3777 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 3778 DebugEventBreakPointHitCount); |
| 3755 | 3779 |
| 3756 break_point_hit_count = 0; | 3780 break_point_hit_count = 0; |
| 3757 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3781 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3758 | 3782 |
| 3759 // Without stepping only the debugger statement is hit. | 3783 // Without stepping only the debugger statement is hit. |
| 3760 CHECK_EQ(1, break_point_hit_count); | 3784 CHECK_EQ(1, break_point_hit_count); |
| 3761 | 3785 |
| 3762 v8::Debug::SetDebugEventListener(NULL); | 3786 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3763 CheckDebuggerUnloaded(); | 3787 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3764 } | 3788 } |
| 3765 | 3789 |
| 3766 | 3790 |
| 3767 // Test that step in works with function.call. | 3791 // Test that step in works with function.call. |
| 3768 TEST(DebugStepFunctionCall) { | 3792 TEST(DebugStepFunctionCall) { |
| 3769 DebugLocalContext env; | 3793 DebugLocalContext env; |
| 3770 v8::Isolate* isolate = env->GetIsolate(); | 3794 v8::Isolate* isolate = env->GetIsolate(); |
| 3771 v8::HandleScope scope(isolate); | 3795 v8::HandleScope scope(isolate); |
| 3772 | 3796 |
| 3773 v8::Local<v8::Context> context = env.context(); | 3797 v8::Local<v8::Context> context = env.context(); |
| 3774 // Create a function for testing stepping. | 3798 // Create a function for testing stepping. |
| 3775 v8::Local<v8::Function> foo = CompileFunction( | 3799 v8::Local<v8::Function> foo = CompileFunction( |
| 3776 &env, | 3800 &env, |
| 3777 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" | 3801 "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" |
| 3778 "function foo(a){ debugger;" | 3802 "function foo(a){ debugger;" |
| 3779 " if (a) {" | 3803 " if (a) {" |
| 3780 " bar.call(this, 1, 2, 3);" | 3804 " bar.call(this, 1, 2, 3);" |
| 3781 " } else {" | 3805 " } else {" |
| 3782 " bar.call(this, 0);" | 3806 " bar.call(this, 0);" |
| 3783 " }" | 3807 " }" |
| 3784 "}", | 3808 "}", |
| 3785 "foo"); | 3809 "foo"); |
| 3786 | 3810 |
| 3787 // Register a debug event listener which steps and counts. | 3811 // Register a debug event listener which steps and counts. |
| 3788 v8::Debug::SetDebugEventListener(DebugEventStep); | 3812 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3789 step_action = StepIn; | 3813 step_action = StepIn; |
| 3790 | 3814 |
| 3791 // Check stepping where the if condition in bar is false. | 3815 // Check stepping where the if condition in bar is false. |
| 3792 break_point_hit_count = 0; | 3816 break_point_hit_count = 0; |
| 3793 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3817 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3794 CHECK_EQ(6, break_point_hit_count); | 3818 CHECK_EQ(6, break_point_hit_count); |
| 3795 | 3819 |
| 3796 // Check stepping where the if condition in bar is true. | 3820 // Check stepping where the if condition in bar is true. |
| 3797 break_point_hit_count = 0; | 3821 break_point_hit_count = 0; |
| 3798 const int argc = 1; | 3822 const int argc = 1; |
| 3799 v8::Local<v8::Value> argv[argc] = {v8::True(isolate)}; | 3823 v8::Local<v8::Value> argv[argc] = {v8::True(isolate)}; |
| 3800 foo->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 3824 foo->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
| 3801 CHECK_EQ(8, break_point_hit_count); | 3825 CHECK_EQ(8, break_point_hit_count); |
| 3802 | 3826 |
| 3803 v8::Debug::SetDebugEventListener(NULL); | 3827 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3804 CheckDebuggerUnloaded(); | 3828 CheckDebuggerUnloaded(isolate); |
| 3805 | 3829 |
| 3806 // Register a debug event listener which just counts. | 3830 // Register a debug event listener which just counts. |
| 3807 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 3831 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 3808 | 3832 |
| 3809 break_point_hit_count = 0; | 3833 break_point_hit_count = 0; |
| 3810 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3834 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3811 | 3835 |
| 3812 // Without stepping only the debugger statement is hit. | 3836 // Without stepping only the debugger statement is hit. |
| 3813 CHECK_EQ(1, break_point_hit_count); | 3837 CHECK_EQ(1, break_point_hit_count); |
| 3814 | 3838 |
| 3815 v8::Debug::SetDebugEventListener(NULL); | 3839 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3816 CheckDebuggerUnloaded(); | 3840 CheckDebuggerUnloaded(isolate); |
| 3817 } | 3841 } |
| 3818 | 3842 |
| 3819 | 3843 |
| 3820 // Test that step in works with Function.call.apply. | 3844 // Test that step in works with Function.call.apply. |
| 3821 TEST(DebugStepFunctionCallApply) { | 3845 TEST(DebugStepFunctionCallApply) { |
| 3822 DebugLocalContext env; | 3846 DebugLocalContext env; |
| 3823 v8::Isolate* isolate = env->GetIsolate(); | 3847 v8::Isolate* isolate = env->GetIsolate(); |
| 3824 v8::HandleScope scope(isolate); | 3848 v8::HandleScope scope(isolate); |
| 3825 | 3849 |
| 3826 v8::Local<v8::Context> context = env.context(); | 3850 v8::Local<v8::Context> context = env.context(); |
| 3827 // Create a function for testing stepping. | 3851 // Create a function for testing stepping. |
| 3828 v8::Local<v8::Function> foo = | 3852 v8::Local<v8::Function> foo = |
| 3829 CompileFunction(&env, | 3853 CompileFunction(&env, |
| 3830 "function bar() { }" | 3854 "function bar() { }" |
| 3831 "function foo(){ debugger;" | 3855 "function foo(){ debugger;" |
| 3832 " Function.call.apply(bar);" | 3856 " Function.call.apply(bar);" |
| 3833 " Function.call.apply(Function.call, " | 3857 " Function.call.apply(Function.call, " |
| 3834 "[Function.call, bar]);" | 3858 "[Function.call, bar]);" |
| 3835 "}", | 3859 "}", |
| 3836 "foo"); | 3860 "foo"); |
| 3837 | 3861 |
| 3838 // Register a debug event listener which steps and counts. | 3862 // Register a debug event listener which steps and counts. |
| 3839 v8::Debug::SetDebugEventListener(DebugEventStep); | 3863 v8::Debug::SetDebugEventListener(isolate, DebugEventStep); |
| 3840 step_action = StepIn; | 3864 step_action = StepIn; |
| 3841 | 3865 |
| 3842 break_point_hit_count = 0; | 3866 break_point_hit_count = 0; |
| 3843 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3867 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3844 CHECK_EQ(6, break_point_hit_count); | 3868 CHECK_EQ(6, break_point_hit_count); |
| 3845 | 3869 |
| 3846 v8::Debug::SetDebugEventListener(NULL); | 3870 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3847 CheckDebuggerUnloaded(); | 3871 CheckDebuggerUnloaded(isolate); |
| 3848 | 3872 |
| 3849 // Register a debug event listener which just counts. | 3873 // Register a debug event listener which just counts. |
| 3850 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 3874 v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount); |
| 3851 | 3875 |
| 3852 break_point_hit_count = 0; | 3876 break_point_hit_count = 0; |
| 3853 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3877 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3854 | 3878 |
| 3855 // Without stepping only the debugger statement is hit. | 3879 // Without stepping only the debugger statement is hit. |
| 3856 CHECK_EQ(1, break_point_hit_count); | 3880 CHECK_EQ(1, break_point_hit_count); |
| 3857 | 3881 |
| 3858 v8::Debug::SetDebugEventListener(NULL); | 3882 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 3859 CheckDebuggerUnloaded(); | 3883 CheckDebuggerUnloaded(isolate); |
| 3860 } | 3884 } |
| 3861 | 3885 |
| 3862 | 3886 |
| 3863 // Tests that breakpoint will be hit if it's set in script. | 3887 // Tests that breakpoint will be hit if it's set in script. |
| 3864 TEST(PauseInScript) { | 3888 TEST(PauseInScript) { |
| 3865 DebugLocalContext env; | 3889 DebugLocalContext env; |
| 3866 v8::HandleScope scope(env->GetIsolate()); | 3890 v8::HandleScope scope(env->GetIsolate()); |
| 3867 env.ExposeDebug(); | 3891 env.ExposeDebug(); |
| 3868 | 3892 |
| 3869 // Register a debug event listener which counts. | 3893 // Register a debug event listener which counts. |
| 3870 v8::Debug::SetDebugEventListener(DebugEventCounter); | 3894 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
| 3871 | 3895 |
| 3872 v8::Local<v8::Context> context = env.context(); | 3896 v8::Local<v8::Context> context = env.context(); |
| 3873 // Create a script that returns a function. | 3897 // Create a script that returns a function. |
| 3874 const char* src = "(function (evt) {})"; | 3898 const char* src = "(function (evt) {})"; |
| 3875 const char* script_name = "StepInHandlerTest"; | 3899 const char* script_name = "StepInHandlerTest"; |
| 3876 | 3900 |
| 3877 // Set breakpoint in the script. | 3901 // Set breakpoint in the script. |
| 3878 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); | 3902 SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); |
| 3879 break_point_hit_count = 0; | 3903 break_point_hit_count = 0; |
| 3880 | 3904 |
| 3881 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name), | 3905 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name), |
| 3882 v8::Integer::New(env->GetIsolate(), 0)); | 3906 v8::Integer::New(env->GetIsolate(), 0)); |
| 3883 v8::Local<v8::Script> script = | 3907 v8::Local<v8::Script> script = |
| 3884 v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin) | 3908 v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin) |
| 3885 .ToLocalChecked(); | 3909 .ToLocalChecked(); |
| 3886 v8::Local<v8::Value> r = script->Run(context).ToLocalChecked(); | 3910 v8::Local<v8::Value> r = script->Run(context).ToLocalChecked(); |
| 3887 | 3911 |
| 3888 CHECK(r->IsFunction()); | 3912 CHECK(r->IsFunction()); |
| 3889 CHECK_EQ(1, break_point_hit_count); | 3913 CHECK_EQ(1, break_point_hit_count); |
| 3890 | 3914 |
| 3891 // Get rid of the debug event listener. | 3915 // Get rid of the debug event listener. |
| 3892 v8::Debug::SetDebugEventListener(NULL); | 3916 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 3893 CheckDebuggerUnloaded(); | 3917 CheckDebuggerUnloaded(env->GetIsolate()); |
| 3894 } | 3918 } |
| 3895 | 3919 |
| 3896 | 3920 |
| 3897 static void DebugEventCounterCheck(int caught, int uncaught, int message) { | 3921 static void DebugEventCounterCheck(int caught, int uncaught, int message) { |
| 3898 CHECK_EQ(caught, exception_hit_count); | 3922 CHECK_EQ(caught, exception_hit_count); |
| 3899 CHECK_EQ(uncaught, uncaught_exception_hit_count); | 3923 CHECK_EQ(uncaught, uncaught_exception_hit_count); |
| 3900 CHECK_EQ(message, message_callback_count); | 3924 CHECK_EQ(message, message_callback_count); |
| 3901 } | 3925 } |
| 3902 | 3926 |
| 3903 | 3927 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3925 &env, "function notCaughtFinally(){try{throws();}finally{}}", | 3949 &env, "function notCaughtFinally(){try{throws();}finally{}}", |
| 3926 "notCaughtFinally"); | 3950 "notCaughtFinally"); |
| 3927 // In this edge case, even though this finally does not propagate the | 3951 // In this edge case, even though this finally does not propagate the |
| 3928 // exception, the debugger considers this uncaught, since we want to break | 3952 // exception, the debugger considers this uncaught, since we want to break |
| 3929 // at the first throw for the general case where finally implicitly rethrows. | 3953 // at the first throw for the general case where finally implicitly rethrows. |
| 3930 v8::Local<v8::Function> edgeCaseFinally = CompileFunction( | 3954 v8::Local<v8::Function> edgeCaseFinally = CompileFunction( |
| 3931 &env, "function caughtFinally(){L:try{throws();}finally{break L;}}", | 3955 &env, "function caughtFinally(){L:try{throws();}finally{break L;}}", |
| 3932 "caughtFinally"); | 3956 "caughtFinally"); |
| 3933 | 3957 |
| 3934 env->GetIsolate()->AddMessageListener(MessageCallbackCount); | 3958 env->GetIsolate()->AddMessageListener(MessageCallbackCount); |
| 3935 v8::Debug::SetDebugEventListener(DebugEventCounter); | 3959 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
| 3936 | 3960 |
| 3937 // Initial state should be no break on exceptions. | 3961 // Initial state should be no break on exceptions. |
| 3938 DebugEventCounterClear(); | 3962 DebugEventCounterClear(); |
| 3939 MessageCallbackCountClear(); | 3963 MessageCallbackCountClear(); |
| 3940 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 3964 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 3941 DebugEventCounterCheck(0, 0, 0); | 3965 DebugEventCounterCheck(0, 0, 0); |
| 3942 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3966 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); |
| 3943 DebugEventCounterCheck(0, 0, 1); | 3967 DebugEventCounterCheck(0, 0, 1); |
| 3944 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); | 3968 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); |
| 3945 DebugEventCounterCheck(0, 0, 2); | 3969 DebugEventCounterCheck(0, 0, 2); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4043 ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, false); | 4067 ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, false); |
| 4044 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4068 caught->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 4045 DebugEventCounterCheck(1, 0, 0); | 4069 DebugEventCounterCheck(1, 0, 0); |
| 4046 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); | 4070 CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty()); |
| 4047 DebugEventCounterCheck(2, 1, 1); | 4071 DebugEventCounterCheck(2, 1, 1); |
| 4048 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); | 4072 CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty()); |
| 4049 DebugEventCounterCheck(3, 2, 2); | 4073 DebugEventCounterCheck(3, 2, 2); |
| 4050 edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4074 edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 4051 DebugEventCounterCheck(4, 3, 2); | 4075 DebugEventCounterCheck(4, 3, 2); |
| 4052 | 4076 |
| 4053 v8::Debug::SetDebugEventListener(NULL); | 4077 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 4054 CheckDebuggerUnloaded(); | 4078 CheckDebuggerUnloaded(env->GetIsolate()); |
| 4055 env->GetIsolate()->RemoveMessageListeners(MessageCallbackCount); | 4079 env->GetIsolate()->RemoveMessageListeners(MessageCallbackCount); |
| 4056 } | 4080 } |
| 4057 | 4081 |
| 4058 | 4082 |
| 4059 static void try_finally_original_message(v8::Local<v8::Message> message, | 4083 static void try_finally_original_message(v8::Local<v8::Message> message, |
| 4060 v8::Local<v8::Value> data) { | 4084 v8::Local<v8::Value> data) { |
| 4061 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); | 4085 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); |
| 4062 CHECK_EQ(2, message->GetLineNumber(context).FromJust()); | 4086 CHECK_EQ(2, message->GetLineNumber(context).FromJust()); |
| 4063 CHECK_EQ(2, message->GetStartColumn(context).FromJust()); | 4087 CHECK_EQ(2, message->GetStartColumn(context).FromJust()); |
| 4064 message_callback_count++; | 4088 message_callback_count++; |
| 4065 } | 4089 } |
| 4066 | 4090 |
| 4067 | 4091 |
| 4068 TEST(TryFinallyOriginalMessage) { | 4092 TEST(TryFinallyOriginalMessage) { |
| 4069 // Test that the debugger plays nicely with the pending message. | 4093 // Test that the debugger plays nicely with the pending message. |
| 4070 message_callback_count = 0; | 4094 message_callback_count = 0; |
| 4071 DebugEventCounterClear(); | 4095 DebugEventCounterClear(); |
| 4072 DebugLocalContext env; | 4096 DebugLocalContext env; |
| 4073 v8::Isolate* isolate = CcTest::isolate(); | 4097 v8::Isolate* isolate = CcTest::isolate(); |
| 4074 isolate->AddMessageListener(try_finally_original_message); | 4098 isolate->AddMessageListener(try_finally_original_message); |
| 4075 v8::Debug::SetDebugEventListener(DebugEventCounter); | 4099 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter); |
| 4076 ChangeBreakOnException(true, true); | 4100 ChangeBreakOnException(true, true); |
| 4077 v8::HandleScope scope(isolate); | 4101 v8::HandleScope scope(isolate); |
| 4078 CompileRun( | 4102 CompileRun( |
| 4079 "try {\n" | 4103 "try {\n" |
| 4080 " throw 1;\n" | 4104 " throw 1;\n" |
| 4081 "} finally {\n" | 4105 "} finally {\n" |
| 4082 "}\n"); | 4106 "}\n"); |
| 4083 DebugEventCounterCheck(1, 1, 1); | 4107 DebugEventCounterCheck(1, 1, 1); |
| 4084 v8::Debug::SetDebugEventListener(NULL); | 4108 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 4085 isolate->RemoveMessageListeners(try_finally_original_message); | 4109 isolate->RemoveMessageListeners(try_finally_original_message); |
| 4086 } | 4110 } |
| 4087 | 4111 |
| 4088 | 4112 |
| 4089 TEST(EvalJSInDebugEventListenerOnNativeReThrownException) { | 4113 TEST(EvalJSInDebugEventListenerOnNativeReThrownException) { |
| 4090 DebugLocalContext env; | 4114 DebugLocalContext env; |
| 4091 v8::HandleScope scope(env->GetIsolate()); | 4115 v8::HandleScope scope(env->GetIsolate()); |
| 4092 env.ExposeDebug(); | 4116 env.ExposeDebug(); |
| 4093 | 4117 |
| 4094 // Create functions for testing break on exception. | 4118 // Create functions for testing break on exception. |
| 4095 v8::Local<v8::Function> noThrowJS = CompileFunction( | 4119 v8::Local<v8::Function> noThrowJS = CompileFunction( |
| 4096 &env, "function noThrowJS(){var a=[1]; a.push(2); return a.length;}", | 4120 &env, "function noThrowJS(){var a=[1]; a.push(2); return a.length;}", |
| 4097 "noThrowJS"); | 4121 "noThrowJS"); |
| 4098 | 4122 |
| 4099 debug_event_listener_callback = noThrowJS; | 4123 debug_event_listener_callback = noThrowJS; |
| 4100 debug_event_listener_callback_result = 2; | 4124 debug_event_listener_callback_result = 2; |
| 4101 | 4125 |
| 4102 env->GetIsolate()->AddMessageListener(MessageCallbackCount); | 4126 env->GetIsolate()->AddMessageListener(MessageCallbackCount); |
| 4103 v8::Debug::SetDebugEventListener(DebugEventCounter); | 4127 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
| 4104 // Break on uncaught exception | 4128 // Break on uncaught exception |
| 4105 ChangeBreakOnException(false, true); | 4129 ChangeBreakOnException(false, true); |
| 4106 DebugEventCounterClear(); | 4130 DebugEventCounterClear(); |
| 4107 MessageCallbackCountClear(); | 4131 MessageCallbackCountClear(); |
| 4108 | 4132 |
| 4109 // ReThrow native error | 4133 // ReThrow native error |
| 4110 { | 4134 { |
| 4111 v8::TryCatch tryCatch(env->GetIsolate()); | 4135 v8::TryCatch tryCatch(env->GetIsolate()); |
| 4112 env->GetIsolate()->ThrowException( | 4136 env->GetIsolate()->ThrowException( |
| 4113 v8::Exception::TypeError(v8_str(env->GetIsolate(), "Type error"))); | 4137 v8::Exception::TypeError(v8_str(env->GetIsolate(), "Type error"))); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4131 v8::HandleScope scope(env->GetIsolate()); | 4155 v8::HandleScope scope(env->GetIsolate()); |
| 4132 | 4156 |
| 4133 v8::Local<v8::Context> context = env.context(); | 4157 v8::Local<v8::Context> context = env.context(); |
| 4134 // For this test, we want to break on uncaught exceptions: | 4158 // For this test, we want to break on uncaught exceptions: |
| 4135 ChangeBreakOnException(false, true); | 4159 ChangeBreakOnException(false, true); |
| 4136 | 4160 |
| 4137 // Create a function for checking the function when hitting a break point. | 4161 // Create a function for checking the function when hitting a break point. |
| 4138 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); | 4162 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); |
| 4139 | 4163 |
| 4140 env->GetIsolate()->AddMessageListener(MessageCallbackCount); | 4164 env->GetIsolate()->AddMessageListener(MessageCallbackCount); |
| 4141 v8::Debug::SetDebugEventListener(DebugEventCounter); | 4165 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
| 4142 | 4166 |
| 4143 DebugEventCounterClear(); | 4167 DebugEventCounterClear(); |
| 4144 MessageCallbackCountClear(); | 4168 MessageCallbackCountClear(); |
| 4145 | 4169 |
| 4146 // Check initial state. | 4170 // Check initial state. |
| 4147 CHECK_EQ(0, exception_hit_count); | 4171 CHECK_EQ(0, exception_hit_count); |
| 4148 CHECK_EQ(0, uncaught_exception_hit_count); | 4172 CHECK_EQ(0, uncaught_exception_hit_count); |
| 4149 CHECK_EQ(0, message_callback_count); | 4173 CHECK_EQ(0, message_callback_count); |
| 4150 CHECK_EQ(-1, last_js_stack_height); | 4174 CHECK_EQ(-1, last_js_stack_height); |
| 4151 | 4175 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4193 | 4217 |
| 4194 // For this test, we want to break on uncaught exceptions: | 4218 // For this test, we want to break on uncaught exceptions: |
| 4195 ChangeBreakOnException(false, true); | 4219 ChangeBreakOnException(false, true); |
| 4196 | 4220 |
| 4197 // Create a function for checking the function when hitting a break point. | 4221 // Create a function for checking the function when hitting a break point. |
| 4198 frame_function_name = CompileFunction(&env, | 4222 frame_function_name = CompileFunction(&env, |
| 4199 frame_function_name_source, | 4223 frame_function_name_source, |
| 4200 "frame_function_name"); | 4224 "frame_function_name"); |
| 4201 | 4225 |
| 4202 // Register a debug event listener which steps and counts. | 4226 // Register a debug event listener which steps and counts. |
| 4203 v8::Debug::SetDebugEventListener(DebugEventStepSequence); | 4227 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence); |
| 4204 | 4228 |
| 4205 v8::Local<v8::Context> context = env.context(); | 4229 v8::Local<v8::Context> context = env.context(); |
| 4206 // Create functions for testing stepping. | 4230 // Create functions for testing stepping. |
| 4207 const char* src = "function a() { n(); }; " | 4231 const char* src = "function a() { n(); }; " |
| 4208 "function b() { c(); }; " | 4232 "function b() { c(); }; " |
| 4209 "function c() { n(); }; " | 4233 "function c() { n(); }; " |
| 4210 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " | 4234 "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " |
| 4211 "function e() { n(); }; " | 4235 "function e() { n(); }; " |
| 4212 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " | 4236 "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " |
| 4213 "function g() { h(); }; " | 4237 "function g() { h(); }; " |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4271 // Step through invocation of f + g + h now with break on caught exceptions. | 4295 // Step through invocation of f + g + h now with break on caught exceptions. |
| 4272 ChangeBreakOnException(true, true); | 4296 ChangeBreakOnException(true, true); |
| 4273 step_action = StepIn; | 4297 step_action = StepIn; |
| 4274 break_point_hit_count = 0; | 4298 break_point_hit_count = 0; |
| 4275 expected_step_sequence = "ffghhhff"; | 4299 expected_step_sequence = "ffghhhff"; |
| 4276 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4300 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 4277 CHECK_EQ(StrLength(expected_step_sequence), | 4301 CHECK_EQ(StrLength(expected_step_sequence), |
| 4278 break_point_hit_count); | 4302 break_point_hit_count); |
| 4279 | 4303 |
| 4280 // Get rid of the debug event listener. | 4304 // Get rid of the debug event listener. |
| 4281 v8::Debug::SetDebugEventListener(NULL); | 4305 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 4282 CheckDebuggerUnloaded(); | 4306 CheckDebuggerUnloaded(env->GetIsolate()); |
| 4283 } | 4307 } |
| 4284 | 4308 |
| 4285 | 4309 |
| 4286 TEST(DebugBreak) { | 4310 TEST(DebugBreak) { |
| 4287 i::FLAG_stress_compaction = false; | 4311 i::FLAG_stress_compaction = false; |
| 4288 #ifdef VERIFY_HEAP | 4312 #ifdef VERIFY_HEAP |
| 4289 i::FLAG_verify_heap = true; | 4313 i::FLAG_verify_heap = true; |
| 4290 #endif | 4314 #endif |
| 4291 DebugLocalContext env; | 4315 DebugLocalContext env; |
| 4292 v8::Isolate* isolate = env->GetIsolate(); | 4316 v8::Isolate* isolate = env->GetIsolate(); |
| 4293 v8::HandleScope scope(isolate); | 4317 v8::HandleScope scope(isolate); |
| 4294 | 4318 |
| 4295 // Register a debug event listener which sets the break flag and counts. | 4319 // Register a debug event listener which sets the break flag and counts. |
| 4296 v8::Debug::SetDebugEventListener(DebugEventBreak); | 4320 v8::Debug::SetDebugEventListener(isolate, DebugEventBreak); |
| 4297 | 4321 |
| 4298 v8::Local<v8::Context> context = env.context(); | 4322 v8::Local<v8::Context> context = env.context(); |
| 4299 // Create a function for testing stepping. | 4323 // Create a function for testing stepping. |
| 4300 const char* src = "function f0() {}" | 4324 const char* src = "function f0() {}" |
| 4301 "function f1(x1) {}" | 4325 "function f1(x1) {}" |
| 4302 "function f2(x1,x2) {}" | 4326 "function f2(x1,x2) {}" |
| 4303 "function f3(x1,x2,x3) {}"; | 4327 "function f3(x1,x2,x3) {}"; |
| 4304 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); | 4328 v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); |
| 4305 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); | 4329 v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); |
| 4306 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); | 4330 v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4327 f0->Call(context, env->Global(), i, argv).ToLocalChecked(); | 4351 f0->Call(context, env->Global(), i, argv).ToLocalChecked(); |
| 4328 f1->Call(context, env->Global(), i, argv).ToLocalChecked(); | 4352 f1->Call(context, env->Global(), i, argv).ToLocalChecked(); |
| 4329 f2->Call(context, env->Global(), i, argv).ToLocalChecked(); | 4353 f2->Call(context, env->Global(), i, argv).ToLocalChecked(); |
| 4330 f3->Call(context, env->Global(), i, argv).ToLocalChecked(); | 4354 f3->Call(context, env->Global(), i, argv).ToLocalChecked(); |
| 4331 } | 4355 } |
| 4332 | 4356 |
| 4333 // One break for each function called. | 4357 // One break for each function called. |
| 4334 CHECK(4 * arraysize(argv) == break_point_hit_count); | 4358 CHECK(4 * arraysize(argv) == break_point_hit_count); |
| 4335 | 4359 |
| 4336 // Get rid of the debug event listener. | 4360 // Get rid of the debug event listener. |
| 4337 v8::Debug::SetDebugEventListener(NULL); | 4361 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 4338 CheckDebuggerUnloaded(); | 4362 CheckDebuggerUnloaded(isolate); |
| 4339 } | 4363 } |
| 4340 | 4364 |
| 4341 | 4365 |
| 4342 // Test to ensure that JavaScript code keeps running while the debug break | 4366 // Test to ensure that JavaScript code keeps running while the debug break |
| 4343 // through the stack limit flag is set but breaks are disabled. | 4367 // through the stack limit flag is set but breaks are disabled. |
| 4344 TEST(DisableBreak) { | 4368 TEST(DisableBreak) { |
| 4345 DebugLocalContext env; | 4369 DebugLocalContext env; |
| 4346 v8::HandleScope scope(env->GetIsolate()); | 4370 v8::HandleScope scope(env->GetIsolate()); |
| 4347 | 4371 |
| 4348 // Register a debug event listener which sets the break flag and counts. | 4372 // Register a debug event listener which sets the break flag and counts. |
| 4349 v8::Debug::SetDebugEventListener(DebugEventCounter); | 4373 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter); |
| 4350 | 4374 |
| 4351 v8::Local<v8::Context> context = env.context(); | 4375 v8::Local<v8::Context> context = env.context(); |
| 4352 // Create a function for testing stepping. | 4376 // Create a function for testing stepping. |
| 4353 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; | 4377 const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; |
| 4354 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 4378 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
| 4355 | 4379 |
| 4356 // Set, test and cancel debug break. | 4380 // Set, test and cancel debug break. |
| 4357 v8::Debug::DebugBreak(env->GetIsolate()); | 4381 v8::Debug::DebugBreak(env->GetIsolate()); |
| 4358 CHECK(v8::Debug::CheckDebugBreak(env->GetIsolate())); | 4382 CHECK(v8::Debug::CheckDebugBreak(env->GetIsolate())); |
| 4359 v8::Debug::CancelDebugBreak(env->GetIsolate()); | 4383 v8::Debug::CancelDebugBreak(env->GetIsolate()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4372 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); | 4396 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); |
| 4373 v8::internal::DisableBreak disable_break(isolate->debug(), true); | 4397 v8::internal::DisableBreak disable_break(isolate->debug(), true); |
| 4374 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4398 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 4375 CHECK_EQ(1, break_point_hit_count); | 4399 CHECK_EQ(1, break_point_hit_count); |
| 4376 } | 4400 } |
| 4377 | 4401 |
| 4378 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 4402 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 4379 CHECK_EQ(2, break_point_hit_count); | 4403 CHECK_EQ(2, break_point_hit_count); |
| 4380 | 4404 |
| 4381 // Get rid of the debug event listener. | 4405 // Get rid of the debug event listener. |
| 4382 v8::Debug::SetDebugEventListener(NULL); | 4406 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 4383 CheckDebuggerUnloaded(); | 4407 CheckDebuggerUnloaded(env->GetIsolate()); |
| 4384 } | 4408 } |
| 4385 | 4409 |
| 4386 static const char* kSimpleExtensionSource = | 4410 static const char* kSimpleExtensionSource = |
| 4387 "(function Foo() {" | 4411 "(function Foo() {" |
| 4388 " return 4;" | 4412 " return 4;" |
| 4389 "})() "; | 4413 "})() "; |
| 4390 | 4414 |
| 4391 // http://crbug.com/28933 | 4415 // http://crbug.com/28933 |
| 4392 // Test that debug break is disabled when bootstrapper is active. | 4416 // Test that debug break is disabled when bootstrapper is active. |
| 4393 TEST(NoBreakWhenBootstrapping) { | 4417 TEST(NoBreakWhenBootstrapping) { |
| 4394 v8::Isolate* isolate = CcTest::isolate(); | 4418 v8::Isolate* isolate = CcTest::isolate(); |
| 4395 v8::HandleScope scope(isolate); | 4419 v8::HandleScope scope(isolate); |
| 4396 | 4420 |
| 4397 // Register a debug event listener which sets the break flag and counts. | 4421 // Register a debug event listener which sets the break flag and counts. |
| 4398 v8::Debug::SetDebugEventListener(DebugEventCounter); | 4422 v8::Debug::SetDebugEventListener(isolate, DebugEventCounter); |
| 4399 | 4423 |
| 4400 // Set the debug break flag. | 4424 // Set the debug break flag. |
| 4401 v8::Debug::DebugBreak(isolate); | 4425 v8::Debug::DebugBreak(isolate); |
| 4402 break_point_hit_count = 0; | 4426 break_point_hit_count = 0; |
| 4403 { | 4427 { |
| 4404 // Create a context with an extension to make sure that some JavaScript | 4428 // Create a context with an extension to make sure that some JavaScript |
| 4405 // code is executed during bootstrapping. | 4429 // code is executed during bootstrapping. |
| 4406 v8::RegisterExtension(new v8::Extension("simpletest", | 4430 v8::RegisterExtension(new v8::Extension("simpletest", |
| 4407 kSimpleExtensionSource)); | 4431 kSimpleExtensionSource)); |
| 4408 const char* extension_names[] = { "simpletest" }; | 4432 const char* extension_names[] = { "simpletest" }; |
| 4409 v8::ExtensionConfiguration extensions(1, extension_names); | 4433 v8::ExtensionConfiguration extensions(1, extension_names); |
| 4410 v8::HandleScope handle_scope(isolate); | 4434 v8::HandleScope handle_scope(isolate); |
| 4411 v8::Context::New(isolate, &extensions); | 4435 v8::Context::New(isolate, &extensions); |
| 4412 } | 4436 } |
| 4413 // Check that no DebugBreak events occured during the context creation. | 4437 // Check that no DebugBreak events occured during the context creation. |
| 4414 CHECK_EQ(0, break_point_hit_count); | 4438 CHECK_EQ(0, break_point_hit_count); |
| 4415 | 4439 |
| 4416 // Get rid of the debug event listener. | 4440 // Get rid of the debug event listener. |
| 4417 v8::Debug::SetDebugEventListener(NULL); | 4441 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 4418 CheckDebuggerUnloaded(); | 4442 CheckDebuggerUnloaded(isolate); |
| 4419 } | 4443 } |
| 4420 | 4444 |
| 4421 | 4445 |
| 4422 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { | 4446 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 4423 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); | 4447 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); |
| 4424 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); | 4448 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
| 4425 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 0), | 4449 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 0), |
| 4426 v8_str(info.GetIsolate(), "a")) | 4450 v8_str(info.GetIsolate(), "a")) |
| 4427 .FromJust()); | 4451 .FromJust()); |
| 4428 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 1), | 4452 CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 1), |
| (...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5220 } | 5244 } |
| 5221 | 5245 |
| 5222 | 5246 |
| 5223 // This thread runs the v8 engine. | 5247 // This thread runs the v8 engine. |
| 5224 TEST(MessageQueues) { | 5248 TEST(MessageQueues) { |
| 5225 MessageQueueDebuggerThread message_queue_debugger_thread; | 5249 MessageQueueDebuggerThread message_queue_debugger_thread; |
| 5226 | 5250 |
| 5227 // Create a V8 environment | 5251 // Create a V8 environment |
| 5228 DebugLocalContext env; | 5252 DebugLocalContext env; |
| 5229 v8::HandleScope scope(env->GetIsolate()); | 5253 v8::HandleScope scope(env->GetIsolate()); |
| 5230 v8::Debug::SetMessageHandler(MessageHandler); | 5254 v8::Debug::SetMessageHandler(env->GetIsolate(), MessageHandler); |
| 5231 message_queue_debugger_thread.Start(); | 5255 message_queue_debugger_thread.Start(); |
| 5232 | 5256 |
| 5233 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; | 5257 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; |
| 5234 const char* source_2 = "e = 17;"; | 5258 const char* source_2 = "e = 17;"; |
| 5235 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; | 5259 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; |
| 5236 | 5260 |
| 5237 // See MessageQueueDebuggerThread::Run for interleaved sequence of | 5261 // See MessageQueueDebuggerThread::Run for interleaved sequence of |
| 5238 // API calls and events in the two threads. | 5262 // API calls and events in the two threads. |
| 5239 CompileRun(source_1); | 5263 CompileRun(source_1); |
| 5240 message_queue_barriers.barrier_1.Wait(); | 5264 message_queue_barriers.barrier_1.Wait(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5314 | 5338 |
| 5315 | 5339 |
| 5316 // Tests that all client data passed to the debugger are sent to the handler. | 5340 // Tests that all client data passed to the debugger are sent to the handler. |
| 5317 TEST(SendClientDataToHandler) { | 5341 TEST(SendClientDataToHandler) { |
| 5318 // Create a V8 environment | 5342 // Create a V8 environment |
| 5319 DebugLocalContext env; | 5343 DebugLocalContext env; |
| 5320 v8::Isolate* isolate = env->GetIsolate(); | 5344 v8::Isolate* isolate = env->GetIsolate(); |
| 5321 v8::HandleScope scope(isolate); | 5345 v8::HandleScope scope(isolate); |
| 5322 TestClientData::ResetCounters(); | 5346 TestClientData::ResetCounters(); |
| 5323 handled_client_data_instances_count = 0; | 5347 handled_client_data_instances_count = 0; |
| 5324 v8::Debug::SetMessageHandler(MessageHandlerCountingClientData); | 5348 v8::Debug::SetMessageHandler(isolate, MessageHandlerCountingClientData); |
| 5325 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; | 5349 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; |
| 5326 const int kBufferSize = 1000; | 5350 const int kBufferSize = 1000; |
| 5327 uint16_t buffer[kBufferSize]; | 5351 uint16_t buffer[kBufferSize]; |
| 5328 const char* command_1 = | 5352 const char* command_1 = |
| 5329 "{\"seq\":117," | 5353 "{\"seq\":117," |
| 5330 "\"type\":\"request\"," | 5354 "\"type\":\"request\"," |
| 5331 "\"command\":\"evaluate\"," | 5355 "\"command\":\"evaluate\"," |
| 5332 "\"arguments\":{\"expression\":\"1+2\"}}"; | 5356 "\"arguments\":{\"expression\":\"1+2\"}}"; |
| 5333 const char* command_2 = | 5357 const char* command_2 = |
| 5334 "{\"seq\":118," | 5358 "{\"seq\":118," |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5430 "foo();\n"; | 5454 "foo();\n"; |
| 5431 | 5455 |
| 5432 v8::Isolate::CreateParams create_params; | 5456 v8::Isolate::CreateParams create_params; |
| 5433 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 5457 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| 5434 isolate_ = v8::Isolate::New(create_params); | 5458 isolate_ = v8::Isolate::New(create_params); |
| 5435 threaded_debugging_barriers.barrier_3.Wait(); | 5459 threaded_debugging_barriers.barrier_3.Wait(); |
| 5436 { | 5460 { |
| 5437 v8::Isolate::Scope isolate_scope(isolate_); | 5461 v8::Isolate::Scope isolate_scope(isolate_); |
| 5438 DebugLocalContext env(isolate_); | 5462 DebugLocalContext env(isolate_); |
| 5439 v8::HandleScope scope(isolate_); | 5463 v8::HandleScope scope(isolate_); |
| 5440 v8::Debug::SetMessageHandler(&ThreadedMessageHandler); | 5464 v8::Debug::SetMessageHandler(isolate_, &ThreadedMessageHandler); |
| 5441 v8::Local<v8::ObjectTemplate> global_template = | 5465 v8::Local<v8::ObjectTemplate> global_template = |
| 5442 v8::ObjectTemplate::New(env->GetIsolate()); | 5466 v8::ObjectTemplate::New(env->GetIsolate()); |
| 5443 global_template->Set( | 5467 global_template->Set( |
| 5444 v8_str(env->GetIsolate(), "ThreadedAtBarrier1"), | 5468 v8_str(env->GetIsolate(), "ThreadedAtBarrier1"), |
| 5445 v8::FunctionTemplate::New(isolate_, ThreadedAtBarrier1)); | 5469 v8::FunctionTemplate::New(isolate_, ThreadedAtBarrier1)); |
| 5446 v8::Local<v8::Context> context = | 5470 v8::Local<v8::Context> context = |
| 5447 v8::Context::New(isolate_, NULL, global_template); | 5471 v8::Context::New(isolate_, NULL, global_template); |
| 5448 v8::Context::Scope context_scope(context); | 5472 v8::Context::Scope context_scope(context); |
| 5449 | 5473 |
| 5450 CompileRun(source); | 5474 CompileRun(source); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5563 "cat(19);\n"; | 5587 "cat(19);\n"; |
| 5564 | 5588 |
| 5565 v8::Isolate::CreateParams create_params; | 5589 v8::Isolate::CreateParams create_params; |
| 5566 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 5590 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| 5567 isolate_ = v8::Isolate::New(create_params); | 5591 isolate_ = v8::Isolate::New(create_params); |
| 5568 breakpoints_barriers->barrier_3.Wait(); | 5592 breakpoints_barriers->barrier_3.Wait(); |
| 5569 { | 5593 { |
| 5570 v8::Isolate::Scope isolate_scope(isolate_); | 5594 v8::Isolate::Scope isolate_scope(isolate_); |
| 5571 DebugLocalContext env(isolate_); | 5595 DebugLocalContext env(isolate_); |
| 5572 v8::HandleScope scope(isolate_); | 5596 v8::HandleScope scope(isolate_); |
| 5573 v8::Debug::SetMessageHandler(&BreakpointsMessageHandler); | 5597 v8::Debug::SetMessageHandler(isolate_, &BreakpointsMessageHandler); |
| 5574 | 5598 |
| 5575 CompileRun(source_1); | 5599 CompileRun(source_1); |
| 5576 breakpoints_barriers->barrier_1.Wait(); | 5600 breakpoints_barriers->barrier_1.Wait(); |
| 5577 breakpoints_barriers->barrier_2.Wait(); | 5601 breakpoints_barriers->barrier_2.Wait(); |
| 5578 CompileRun(source_2); | 5602 CompileRun(source_2); |
| 5579 } | 5603 } |
| 5580 breakpoints_barriers->barrier_4.Wait(); | 5604 breakpoints_barriers->barrier_4.Wait(); |
| 5581 isolate_->Dispose(); | 5605 isolate_->Dispose(); |
| 5582 } | 5606 } |
| 5583 | 5607 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5719 TestRecursiveBreakpointsGeneric(false); | 5743 TestRecursiveBreakpointsGeneric(false); |
| 5720 } | 5744 } |
| 5721 | 5745 |
| 5722 | 5746 |
| 5723 TEST(RecursiveBreakpointsGlobal) { | 5747 TEST(RecursiveBreakpointsGlobal) { |
| 5724 TestRecursiveBreakpointsGeneric(true); | 5748 TestRecursiveBreakpointsGeneric(true); |
| 5725 } | 5749 } |
| 5726 | 5750 |
| 5727 | 5751 |
| 5728 TEST(SetDebugEventListenerOnUninitializedVM) { | 5752 TEST(SetDebugEventListenerOnUninitializedVM) { |
| 5729 v8::Debug::SetDebugEventListener(DummyDebugEventListener); | 5753 v8::Debug::SetDebugEventListener(CcTest::isolate(), DummyDebugEventListener); |
| 5730 } | 5754 } |
| 5731 | 5755 |
| 5732 | 5756 |
| 5733 static void DummyMessageHandler(const v8::Debug::Message& message) { | 5757 static void DummyMessageHandler(const v8::Debug::Message& message) { |
| 5734 } | 5758 } |
| 5735 | 5759 |
| 5736 | 5760 |
| 5737 TEST(SetMessageHandlerOnUninitializedVM) { | 5761 TEST(SetMessageHandlerOnUninitializedVM) { |
| 5738 v8::Debug::SetMessageHandler(DummyMessageHandler); | 5762 v8::Debug::SetMessageHandler(CcTest::isolate(), DummyMessageHandler); |
| 5739 } | 5763 } |
| 5740 | 5764 |
| 5741 | 5765 |
| 5742 // Source for a JavaScript function which returns the data parameter of a | 5766 // Source for a JavaScript function which returns the data parameter of a |
| 5743 // function called in the context of the debugger. If no data parameter is | 5767 // function called in the context of the debugger. If no data parameter is |
| 5744 // passed it throws an exception. | 5768 // passed it throws an exception. |
| 5745 static const char* debugger_call_with_data_source = | 5769 static const char* debugger_call_with_data_source = |
| 5746 "function debugger_call_with_data(exec_state, data) {" | 5770 "function debugger_call_with_data(exec_state, data) {" |
| 5747 " if (data) return data;" | 5771 " if (data) return data;" |
| 5748 " throw 'No data!'" | 5772 " throw 'No data!'" |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5959 } | 5983 } |
| 5960 } | 5984 } |
| 5961 | 5985 |
| 5962 | 5986 |
| 5963 // Test that clearing the debug event listener actually clears all break points | 5987 // Test that clearing the debug event listener actually clears all break points |
| 5964 // and related information. | 5988 // and related information. |
| 5965 TEST(DebuggerUnload) { | 5989 TEST(DebuggerUnload) { |
| 5966 DebugLocalContext env; | 5990 DebugLocalContext env; |
| 5967 | 5991 |
| 5968 // Check debugger is unloaded before it is used. | 5992 // Check debugger is unloaded before it is used. |
| 5969 CheckDebuggerUnloaded(); | 5993 CheckDebuggerUnloaded(env->GetIsolate()); |
| 5970 | 5994 |
| 5971 // Set a debug event listener. | 5995 // Set a debug event listener. |
| 5972 break_point_hit_count = 0; | 5996 break_point_hit_count = 0; |
| 5973 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 5997 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 5998 DebugEventBreakPointHitCount); |
| 5974 v8::Local<v8::Context> context = env.context(); | 5999 v8::Local<v8::Context> context = env.context(); |
| 5975 { | 6000 { |
| 5976 v8::HandleScope scope(env->GetIsolate()); | 6001 v8::HandleScope scope(env->GetIsolate()); |
| 5977 // Create a couple of functions for the test. | 6002 // Create a couple of functions for the test. |
| 5978 v8::Local<v8::Function> foo = | 6003 v8::Local<v8::Function> foo = |
| 5979 CompileFunction(&env, "function foo(){x=1}", "foo"); | 6004 CompileFunction(&env, "function foo(){x=1}", "foo"); |
| 5980 v8::Local<v8::Function> bar = | 6005 v8::Local<v8::Function> bar = |
| 5981 CompileFunction(&env, "function bar(){y=2}", "bar"); | 6006 CompileFunction(&env, "function bar(){y=2}", "bar"); |
| 5982 | 6007 |
| 5983 // Set some break points. | 6008 // Set some break points. |
| 5984 SetBreakPoint(foo, 0); | 6009 SetBreakPoint(foo, 0); |
| 5985 SetBreakPoint(foo, 4); | 6010 SetBreakPoint(foo, 4); |
| 5986 SetBreakPoint(bar, 0); | 6011 SetBreakPoint(bar, 0); |
| 5987 SetBreakPoint(bar, 4); | 6012 SetBreakPoint(bar, 4); |
| 5988 | 6013 |
| 5989 // Make sure that the break points are there. | 6014 // Make sure that the break points are there. |
| 5990 break_point_hit_count = 0; | 6015 break_point_hit_count = 0; |
| 5991 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6016 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 5992 CHECK_EQ(2, break_point_hit_count); | 6017 CHECK_EQ(2, break_point_hit_count); |
| 5993 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6018 bar->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 5994 CHECK_EQ(4, break_point_hit_count); | 6019 CHECK_EQ(4, break_point_hit_count); |
| 5995 } | 6020 } |
| 5996 | 6021 |
| 5997 // Remove the debug event listener without clearing breakpoints. Do this | 6022 // Remove the debug event listener without clearing breakpoints. Do this |
| 5998 // outside a handle scope. | 6023 // outside a handle scope. |
| 5999 v8::Debug::SetDebugEventListener(NULL); | 6024 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 6000 CheckDebuggerUnloaded(true); | 6025 CheckDebuggerUnloaded(env->GetIsolate(), true); |
| 6001 | 6026 |
| 6002 // Now set a debug message handler. | 6027 // Now set a debug message handler. |
| 6003 break_point_hit_count = 0; | 6028 break_point_hit_count = 0; |
| 6004 v8::Debug::SetMessageHandler(MessageHandlerBreakPointHitCount); | 6029 v8::Debug::SetMessageHandler(env->GetIsolate(), |
| 6030 MessageHandlerBreakPointHitCount); |
| 6005 { | 6031 { |
| 6006 v8::HandleScope scope(env->GetIsolate()); | 6032 v8::HandleScope scope(env->GetIsolate()); |
| 6007 | 6033 |
| 6008 // Get the test functions again. | 6034 // Get the test functions again. |
| 6009 v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast( | 6035 v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast( |
| 6010 env->Global() | 6036 env->Global() |
| 6011 ->Get(context, v8_str(env->GetIsolate(), "foo")) | 6037 ->Get(context, v8_str(env->GetIsolate(), "foo")) |
| 6012 .ToLocalChecked())); | 6038 .ToLocalChecked())); |
| 6013 | 6039 |
| 6014 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6040 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 6015 CHECK_EQ(0, break_point_hit_count); | 6041 CHECK_EQ(0, break_point_hit_count); |
| 6016 | 6042 |
| 6017 // Set break points and run again. | 6043 // Set break points and run again. |
| 6018 SetBreakPoint(foo, 0); | 6044 SetBreakPoint(foo, 0); |
| 6019 SetBreakPoint(foo, 4); | 6045 SetBreakPoint(foo, 4); |
| 6020 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6046 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 6021 CHECK_EQ(2, break_point_hit_count); | 6047 CHECK_EQ(2, break_point_hit_count); |
| 6022 } | 6048 } |
| 6023 | 6049 |
| 6024 // Remove the debug message handler without clearing breakpoints. Do this | 6050 // Remove the debug message handler without clearing breakpoints. Do this |
| 6025 // outside a handle scope. | 6051 // outside a handle scope. |
| 6026 v8::Debug::SetMessageHandler(NULL); | 6052 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6027 CheckDebuggerUnloaded(true); | 6053 CheckDebuggerUnloaded(env->GetIsolate(), true); |
| 6028 } | 6054 } |
| 6029 | 6055 |
| 6030 | 6056 |
| 6031 // Sends continue command to the debugger. | 6057 // Sends continue command to the debugger. |
| 6032 static void SendContinueCommand() { | 6058 static void SendContinueCommand() { |
| 6033 const int kBufferSize = 1000; | 6059 const int kBufferSize = 1000; |
| 6034 uint16_t buffer[kBufferSize]; | 6060 uint16_t buffer[kBufferSize]; |
| 6035 const char* command_continue = | 6061 const char* command_continue = |
| 6036 "{\"seq\":0," | 6062 "{\"seq\":0," |
| 6037 "\"type\":\"request\"," | 6063 "\"type\":\"request\"," |
| (...skipping 18 matching lines...) Expand all Loading... |
| 6056 } | 6082 } |
| 6057 } | 6083 } |
| 6058 | 6084 |
| 6059 | 6085 |
| 6060 // Test clearing the debug message handler. | 6086 // Test clearing the debug message handler. |
| 6061 TEST(DebuggerClearMessageHandler) { | 6087 TEST(DebuggerClearMessageHandler) { |
| 6062 DebugLocalContext env; | 6088 DebugLocalContext env; |
| 6063 v8::HandleScope scope(env->GetIsolate()); | 6089 v8::HandleScope scope(env->GetIsolate()); |
| 6064 | 6090 |
| 6065 // Check debugger is unloaded before it is used. | 6091 // Check debugger is unloaded before it is used. |
| 6066 CheckDebuggerUnloaded(); | 6092 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6067 | 6093 |
| 6068 // Set a debug message handler. | 6094 // Set a debug message handler. |
| 6069 v8::Debug::SetMessageHandler(MessageHandlerHitCount); | 6095 v8::Debug::SetMessageHandler(env->GetIsolate(), MessageHandlerHitCount); |
| 6070 | 6096 |
| 6071 // Run code to throw a unhandled exception. This should end up in the message | 6097 // Run code to throw a unhandled exception. This should end up in the message |
| 6072 // handler. | 6098 // handler. |
| 6073 CompileRun("throw 1"); | 6099 CompileRun("throw 1"); |
| 6074 | 6100 |
| 6075 // The message handler should be called. | 6101 // The message handler should be called. |
| 6076 CHECK_GT(message_handler_hit_count, 0); | 6102 CHECK_GT(message_handler_hit_count, 0); |
| 6077 | 6103 |
| 6078 // Clear debug message handler. | 6104 // Clear debug message handler. |
| 6079 message_handler_hit_count = 0; | 6105 message_handler_hit_count = 0; |
| 6080 v8::Debug::SetMessageHandler(NULL); | 6106 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6081 | 6107 |
| 6082 // Run code to throw a unhandled exception. This should end up in the message | 6108 // Run code to throw a unhandled exception. This should end up in the message |
| 6083 // handler. | 6109 // handler. |
| 6084 CompileRun("throw 1"); | 6110 CompileRun("throw 1"); |
| 6085 | 6111 |
| 6086 // The message handler should not be called more. | 6112 // The message handler should not be called more. |
| 6087 CHECK_EQ(0, message_handler_hit_count); | 6113 CHECK_EQ(0, message_handler_hit_count); |
| 6088 | 6114 |
| 6089 CheckDebuggerUnloaded(true); | 6115 CheckDebuggerUnloaded(env->GetIsolate(), true); |
| 6090 } | 6116 } |
| 6091 | 6117 |
| 6092 | 6118 |
| 6093 // Debugger message handler which clears the message handler while active. | 6119 // Debugger message handler which clears the message handler while active. |
| 6094 static void MessageHandlerClearingMessageHandler( | 6120 static void MessageHandlerClearingMessageHandler( |
| 6095 const v8::Debug::Message& message) { | 6121 const v8::Debug::Message& message) { |
| 6096 message_handler_hit_count++; | 6122 message_handler_hit_count++; |
| 6097 | 6123 |
| 6098 // Clear debug message handler. | 6124 // Clear debug message handler. |
| 6099 v8::Debug::SetMessageHandler(NULL); | 6125 v8::Debug::SetMessageHandler(message.GetIsolate(), nullptr); |
| 6100 } | 6126 } |
| 6101 | 6127 |
| 6102 | 6128 |
| 6103 // Test clearing the debug message handler while processing a debug event. | 6129 // Test clearing the debug message handler while processing a debug event. |
| 6104 TEST(DebuggerClearMessageHandlerWhileActive) { | 6130 TEST(DebuggerClearMessageHandlerWhileActive) { |
| 6105 DebugLocalContext env; | 6131 DebugLocalContext env; |
| 6106 v8::HandleScope scope(env->GetIsolate()); | 6132 v8::HandleScope scope(env->GetIsolate()); |
| 6107 | 6133 |
| 6108 // Check debugger is unloaded before it is used. | 6134 // Check debugger is unloaded before it is used. |
| 6109 CheckDebuggerUnloaded(); | 6135 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6110 | 6136 |
| 6111 // Set a debug message handler. | 6137 // Set a debug message handler. |
| 6112 v8::Debug::SetMessageHandler(MessageHandlerClearingMessageHandler); | 6138 v8::Debug::SetMessageHandler(env->GetIsolate(), |
| 6139 MessageHandlerClearingMessageHandler); |
| 6113 | 6140 |
| 6114 // Run code to throw a unhandled exception. This should end up in the message | 6141 // Run code to throw a unhandled exception. This should end up in the message |
| 6115 // handler. | 6142 // handler. |
| 6116 CompileRun("throw 1"); | 6143 CompileRun("throw 1"); |
| 6117 | 6144 |
| 6118 // The message handler should be called. | 6145 // The message handler should be called. |
| 6119 CHECK_EQ(1, message_handler_hit_count); | 6146 CHECK_EQ(1, message_handler_hit_count); |
| 6120 | 6147 |
| 6121 CheckDebuggerUnloaded(true); | 6148 CheckDebuggerUnloaded(env->GetIsolate(), true); |
| 6122 } | 6149 } |
| 6123 | 6150 |
| 6124 | 6151 |
| 6125 // Test for issue http://code.google.com/p/v8/issues/detail?id=289. | 6152 // Test for issue http://code.google.com/p/v8/issues/detail?id=289. |
| 6126 // Make sure that DebugGetLoadedScripts doesn't return scripts | 6153 // Make sure that DebugGetLoadedScripts doesn't return scripts |
| 6127 // with disposed external source. | 6154 // with disposed external source. |
| 6128 class EmptyExternalStringResource : public v8::String::ExternalStringResource { | 6155 class EmptyExternalStringResource : public v8::String::ExternalStringResource { |
| 6129 public: | 6156 public: |
| 6130 EmptyExternalStringResource() { empty_[0] = 0; } | 6157 EmptyExternalStringResource() { empty_[0] = 0; } |
| 6131 virtual ~EmptyExternalStringResource() {} | 6158 virtual ~EmptyExternalStringResource() {} |
| (...skipping 16 matching lines...) Expand all Loading... |
| 6148 .ToLocalChecked(); | 6175 .ToLocalChecked(); |
| 6149 CHECK(v8::Script::Compile(context, source).IsEmpty()); | 6176 CHECK(v8::Script::Compile(context, source).IsEmpty()); |
| 6150 Handle<i::ExternalTwoByteString> i_source( | 6177 Handle<i::ExternalTwoByteString> i_source( |
| 6151 i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source))); | 6178 i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source))); |
| 6152 // This situation can happen if source was an external string disposed | 6179 // This situation can happen if source was an external string disposed |
| 6153 // by its owner. | 6180 // by its owner. |
| 6154 i_source->set_resource(0); | 6181 i_source->set_resource(0); |
| 6155 | 6182 |
| 6156 bool allow_natives_syntax = i::FLAG_allow_natives_syntax; | 6183 bool allow_natives_syntax = i::FLAG_allow_natives_syntax; |
| 6157 i::FLAG_allow_natives_syntax = true; | 6184 i::FLAG_allow_natives_syntax = true; |
| 6158 EnableDebugger(); | 6185 EnableDebugger(env->GetIsolate()); |
| 6159 v8::MaybeLocal<v8::Value> result = | 6186 v8::MaybeLocal<v8::Value> result = |
| 6160 CompileRun(env.context(), | 6187 CompileRun(env.context(), |
| 6161 "var scripts = %DebugGetLoadedScripts();" | 6188 "var scripts = %DebugGetLoadedScripts();" |
| 6162 "var count = scripts.length;" | 6189 "var count = scripts.length;" |
| 6163 "for (var i = 0; i < count; ++i) {" | 6190 "for (var i = 0; i < count; ++i) {" |
| 6164 " var lines = scripts[i].lineCount();" | 6191 " var lines = scripts[i].lineCount();" |
| 6165 " if (lines < 1) throw 'lineCount';" | 6192 " if (lines < 1) throw 'lineCount';" |
| 6166 " var last = -1;" | 6193 " var last = -1;" |
| 6167 " for (var j = 0; j < lines; ++j) {" | 6194 " for (var j = 0; j < lines; ++j) {" |
| 6168 " var end = scripts[i].lineEnd(j);" | 6195 " var end = scripts[i].lineEnd(j);" |
| 6169 " if (last >= end) throw 'lineEnd';" | 6196 " if (last >= end) throw 'lineEnd';" |
| 6170 " last = end;" | 6197 " last = end;" |
| 6171 " }" | 6198 " }" |
| 6172 "}"); | 6199 "}"); |
| 6173 CHECK(!result.IsEmpty()); | 6200 CHECK(!result.IsEmpty()); |
| 6174 DisableDebugger(); | 6201 DisableDebugger(env->GetIsolate()); |
| 6175 // Must not crash while accessing line_ends. | 6202 // Must not crash while accessing line_ends. |
| 6176 i::FLAG_allow_natives_syntax = allow_natives_syntax; | 6203 i::FLAG_allow_natives_syntax = allow_natives_syntax; |
| 6177 | 6204 |
| 6178 // Some scripts are retrieved - at least the number of native scripts. | 6205 // Some scripts are retrieved - at least the number of native scripts. |
| 6179 CHECK_GT(env->Global() | 6206 CHECK_GT(env->Global() |
| 6180 ->Get(context, v8_str(env->GetIsolate(), "count")) | 6207 ->Get(context, v8_str(env->GetIsolate(), "count")) |
| 6181 .ToLocalChecked() | 6208 .ToLocalChecked() |
| 6182 ->Int32Value(context) | 6209 ->Int32Value(context) |
| 6183 .FromJust(), | 6210 .FromJust(), |
| 6184 8); | 6211 8); |
| 6185 } | 6212 } |
| 6186 | 6213 |
| 6187 | 6214 |
| 6188 // Test script break points set on lines. | 6215 // Test script break points set on lines. |
| 6189 TEST(ScriptNameAndData) { | 6216 TEST(ScriptNameAndData) { |
| 6190 DebugLocalContext env; | 6217 DebugLocalContext env; |
| 6191 v8::HandleScope scope(env->GetIsolate()); | 6218 v8::HandleScope scope(env->GetIsolate()); |
| 6192 env.ExposeDebug(); | 6219 env.ExposeDebug(); |
| 6193 | 6220 |
| 6194 // Create functions for retrieving script name and data for the function on | 6221 // Create functions for retrieving script name and data for the function on |
| 6195 // the top frame when hitting a break point. | 6222 // the top frame when hitting a break point. |
| 6196 frame_script_name = CompileFunction(&env, | 6223 frame_script_name = CompileFunction(&env, |
| 6197 frame_script_name_source, | 6224 frame_script_name_source, |
| 6198 "frame_script_name"); | 6225 "frame_script_name"); |
| 6199 | 6226 |
| 6200 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 6227 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 6228 DebugEventBreakPointHitCount); |
| 6201 | 6229 |
| 6202 v8::Local<v8::Context> context = env.context(); | 6230 v8::Local<v8::Context> context = env.context(); |
| 6203 // Test function source. | 6231 // Test function source. |
| 6204 v8::Local<v8::String> script = v8_str(env->GetIsolate(), | 6232 v8::Local<v8::String> script = v8_str(env->GetIsolate(), |
| 6205 "function f() {\n" | 6233 "function f() {\n" |
| 6206 " debugger;\n" | 6234 " debugger;\n" |
| 6207 "}\n"); | 6235 "}\n"); |
| 6208 | 6236 |
| 6209 v8::ScriptOrigin origin1 = | 6237 v8::ScriptOrigin origin1 = |
| 6210 v8::ScriptOrigin(v8_str(env->GetIsolate(), "name")); | 6238 v8::ScriptOrigin(v8_str(env->GetIsolate(), "name")); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6301 | 6329 |
| 6302 // Create two contexts. | 6330 // Create two contexts. |
| 6303 v8::Local<v8::Context> context_1; | 6331 v8::Local<v8::Context> context_1; |
| 6304 v8::Local<v8::Context> context_2; | 6332 v8::Local<v8::Context> context_2; |
| 6305 v8::Local<v8::ObjectTemplate> global_template = | 6333 v8::Local<v8::ObjectTemplate> global_template = |
| 6306 v8::Local<v8::ObjectTemplate>(); | 6334 v8::Local<v8::ObjectTemplate>(); |
| 6307 v8::Local<v8::Value> global_object = v8::Local<v8::Value>(); | 6335 v8::Local<v8::Value> global_object = v8::Local<v8::Value>(); |
| 6308 context_1 = v8::Context::New(isolate, NULL, global_template, global_object); | 6336 context_1 = v8::Context::New(isolate, NULL, global_template, global_object); |
| 6309 context_2 = v8::Context::New(isolate, NULL, global_template, global_object); | 6337 context_2 = v8::Context::New(isolate, NULL, global_template, global_object); |
| 6310 | 6338 |
| 6311 v8::Debug::SetMessageHandler(ContextCheckMessageHandler); | 6339 v8::Debug::SetMessageHandler(isolate, ContextCheckMessageHandler); |
| 6312 | 6340 |
| 6313 // Default data value is undefined. | 6341 // Default data value is undefined. |
| 6314 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); | 6342 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); |
| 6315 CHECK(context_2->GetEmbedderData(0)->IsUndefined()); | 6343 CHECK(context_2->GetEmbedderData(0)->IsUndefined()); |
| 6316 | 6344 |
| 6317 // Set and check different data values. | 6345 // Set and check different data values. |
| 6318 v8::Local<v8::String> data_1 = v8_str(isolate, "1"); | 6346 v8::Local<v8::String> data_1 = v8_str(isolate, "1"); |
| 6319 v8::Local<v8::String> data_2 = v8_str(isolate, "2"); | 6347 v8::Local<v8::String> data_2 = v8_str(isolate, "2"); |
| 6320 context_1->SetEmbedderData(0, data_1); | 6348 context_1->SetEmbedderData(0, data_1); |
| 6321 context_2->SetEmbedderData(0, data_2); | 6349 context_2->SetEmbedderData(0, data_2); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 6340 v8::Context::Scope context_scope(context_2); | 6368 v8::Context::Scope context_scope(context_2); |
| 6341 expected_context = context_2; | 6369 expected_context = context_2; |
| 6342 expected_context_data = data_2; | 6370 expected_context_data = data_2; |
| 6343 v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); | 6371 v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); |
| 6344 f->Call(context_2, context_2->Global(), 0, NULL).ToLocalChecked(); | 6372 f->Call(context_2, context_2->Global(), 0, NULL).ToLocalChecked(); |
| 6345 } | 6373 } |
| 6346 | 6374 |
| 6347 // Two times compile event and two times break event. | 6375 // Two times compile event and two times break event. |
| 6348 CHECK_GT(message_handler_hit_count, 4); | 6376 CHECK_GT(message_handler_hit_count, 4); |
| 6349 | 6377 |
| 6350 v8::Debug::SetMessageHandler(NULL); | 6378 v8::Debug::SetMessageHandler(isolate, nullptr); |
| 6351 CheckDebuggerUnloaded(); | 6379 CheckDebuggerUnloaded(isolate); |
| 6352 } | 6380 } |
| 6353 | 6381 |
| 6354 | 6382 |
| 6355 // Debug message handler which issues a debug break when it hits a break event. | 6383 // Debug message handler which issues a debug break when it hits a break event. |
| 6356 static int message_handler_break_hit_count = 0; | 6384 static int message_handler_break_hit_count = 0; |
| 6357 static void DebugBreakMessageHandler(const v8::Debug::Message& message) { | 6385 static void DebugBreakMessageHandler(const v8::Debug::Message& message) { |
| 6358 // Schedule a debug break for break events. | 6386 // Schedule a debug break for break events. |
| 6359 if (message.IsEvent() && message.GetEvent() == v8::Break) { | 6387 if (message.IsEvent() && message.GetEvent() == v8::Break) { |
| 6360 message_handler_break_hit_count++; | 6388 message_handler_break_hit_count++; |
| 6361 if (message_handler_break_hit_count == 1) { | 6389 if (message_handler_break_hit_count == 1) { |
| 6362 v8::Debug::DebugBreak(message.GetIsolate()); | 6390 v8::Debug::DebugBreak(message.GetIsolate()); |
| 6363 } | 6391 } |
| 6364 } | 6392 } |
| 6365 | 6393 |
| 6366 // Issue a continue command if this event will not cause the VM to start | 6394 // Issue a continue command if this event will not cause the VM to start |
| 6367 // running. | 6395 // running. |
| 6368 if (!message.WillStartRunning()) { | 6396 if (!message.WillStartRunning()) { |
| 6369 SendContinueCommand(); | 6397 SendContinueCommand(); |
| 6370 } | 6398 } |
| 6371 } | 6399 } |
| 6372 | 6400 |
| 6373 | 6401 |
| 6374 // Test that a debug break can be scheduled while in a message handler. | 6402 // Test that a debug break can be scheduled while in a message handler. |
| 6375 TEST(DebugBreakInMessageHandler) { | 6403 TEST(DebugBreakInMessageHandler) { |
| 6376 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f. | 6404 i::FLAG_turbo_inlining = false; // Make sure g is not inlined into f. |
| 6377 DebugLocalContext env; | 6405 DebugLocalContext env; |
| 6378 v8::HandleScope scope(env->GetIsolate()); | 6406 v8::HandleScope scope(env->GetIsolate()); |
| 6379 | 6407 |
| 6380 v8::Debug::SetMessageHandler(DebugBreakMessageHandler); | 6408 v8::Debug::SetMessageHandler(env->GetIsolate(), DebugBreakMessageHandler); |
| 6381 | 6409 |
| 6382 v8::Local<v8::Context> context = env.context(); | 6410 v8::Local<v8::Context> context = env.context(); |
| 6383 // Test functions. | 6411 // Test functions. |
| 6384 const char* script = "function f() { debugger; g(); } function g() { }"; | 6412 const char* script = "function f() { debugger; g(); } function g() { }"; |
| 6385 CompileRun(script); | 6413 CompileRun(script); |
| 6386 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 6414 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
| 6387 env->Global() | 6415 env->Global() |
| 6388 ->Get(context, v8_str(env->GetIsolate(), "f")) | 6416 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 6389 .ToLocalChecked()); | 6417 .ToLocalChecked()); |
| 6390 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 6418 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6457 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; | 6485 "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; |
| 6458 | 6486 |
| 6459 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); | 6487 v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); |
| 6460 const int argc = 1; | 6488 const int argc = 1; |
| 6461 v8::Local<v8::Value> argv[argc] = { | 6489 v8::Local<v8::Value> argv[argc] = { |
| 6462 v8_str(env->GetIsolate(), " /* xxx */ a=0;")}; | 6490 v8_str(env->GetIsolate(), " /* xxx */ a=0;")}; |
| 6463 v8::Local<v8::Value> result = | 6491 v8::Local<v8::Value> result = |
| 6464 f->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 6492 f->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
| 6465 CHECK_EQ(12, result->Int32Value(context).FromJust()); | 6493 CHECK_EQ(12, result->Int32Value(context).FromJust()); |
| 6466 | 6494 |
| 6467 v8::Debug::SetDebugEventListener(DebugEventDebugBreak); | 6495 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak); |
| 6468 v8::Debug::DebugBreak(env->GetIsolate()); | 6496 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6469 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked(); | 6497 result = f->Call(context, env->Global(), argc, argv).ToLocalChecked(); |
| 6470 | 6498 |
| 6471 // Check that there was only one break event. Matching RegExp should not | 6499 // Check that there was only one break event. Matching RegExp should not |
| 6472 // cause Break events. | 6500 // cause Break events. |
| 6473 CHECK_EQ(1, break_point_hit_count); | 6501 CHECK_EQ(1, break_point_hit_count); |
| 6474 CHECK_EQ(0, strcmp("f", last_function_hit)); | 6502 CHECK_EQ(0, strcmp("f", last_function_hit)); |
| 6475 } | 6503 } |
| 6476 #endif // V8_INTERPRETED_REGEXP | 6504 #endif // V8_INTERPRETED_REGEXP |
| 6477 | 6505 |
| 6478 | 6506 |
| 6479 // Common part of EvalContextData and NestedBreakEventContextData tests. | 6507 // Common part of EvalContextData and NestedBreakEventContextData tests. |
| 6480 static void ExecuteScriptForContextCheck( | 6508 static void ExecuteScriptForContextCheck( |
| 6481 v8::Debug::MessageHandler message_handler) { | 6509 v8::Debug::MessageHandler message_handler) { |
| 6482 // Create a context. | 6510 // Create a context. |
| 6483 v8::Local<v8::Context> context_1; | 6511 v8::Local<v8::Context> context_1; |
| 6484 v8::Local<v8::ObjectTemplate> global_template = | 6512 v8::Local<v8::ObjectTemplate> global_template = |
| 6485 v8::Local<v8::ObjectTemplate>(); | 6513 v8::Local<v8::ObjectTemplate>(); |
| 6486 context_1 = | 6514 context_1 = |
| 6487 v8::Context::New(CcTest::isolate(), NULL, global_template); | 6515 v8::Context::New(CcTest::isolate(), NULL, global_template); |
| 6488 | 6516 |
| 6489 v8::Debug::SetMessageHandler(message_handler); | 6517 v8::Debug::SetMessageHandler(CcTest::isolate(), message_handler); |
| 6490 | 6518 |
| 6491 // Default data value is undefined. | 6519 // Default data value is undefined. |
| 6492 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); | 6520 CHECK(context_1->GetEmbedderData(0)->IsUndefined()); |
| 6493 | 6521 |
| 6494 // Set and check a data value. | 6522 // Set and check a data value. |
| 6495 v8::Local<v8::String> data_1 = v8_str(CcTest::isolate(), "1"); | 6523 v8::Local<v8::String> data_1 = v8_str(CcTest::isolate(), "1"); |
| 6496 context_1->SetEmbedderData(0, data_1); | 6524 context_1->SetEmbedderData(0, data_1); |
| 6497 CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); | 6525 CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); |
| 6498 | 6526 |
| 6499 // Simple test function with eval that causes a break. | 6527 // Simple test function with eval that causes a break. |
| 6500 const char* source = "function f() { eval('debugger;'); }"; | 6528 const char* source = "function f() { eval('debugger;'); }"; |
| 6501 | 6529 |
| 6502 // Enter and run function in the context. | 6530 // Enter and run function in the context. |
| 6503 { | 6531 { |
| 6504 v8::Context::Scope context_scope(context_1); | 6532 v8::Context::Scope context_scope(context_1); |
| 6505 expected_context = context_1; | 6533 expected_context = context_1; |
| 6506 expected_context_data = data_1; | 6534 expected_context_data = data_1; |
| 6507 v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f"); | 6535 v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f"); |
| 6508 f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked(); | 6536 f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked(); |
| 6509 } | 6537 } |
| 6510 | 6538 |
| 6511 v8::Debug::SetMessageHandler(NULL); | 6539 v8::Debug::SetMessageHandler(CcTest::isolate(), nullptr); |
| 6512 } | 6540 } |
| 6513 | 6541 |
| 6514 | 6542 |
| 6515 // Test which creates a context and sets embedder data on it. Checks that this | 6543 // Test which creates a context and sets embedder data on it. Checks that this |
| 6516 // data is set correctly and that when the debug message handler is called for | 6544 // data is set correctly and that when the debug message handler is called for |
| 6517 // break event in an eval statement the expected context is the one returned by | 6545 // break event in an eval statement the expected context is the one returned by |
| 6518 // Message.GetEventContext. | 6546 // Message.GetEventContext. |
| 6519 TEST(EvalContextData) { | 6547 TEST(EvalContextData) { |
| 6520 v8::HandleScope scope(CcTest::isolate()); | 6548 v8::HandleScope scope(CcTest::isolate()); |
| 6521 | 6549 |
| 6522 ExecuteScriptForContextCheck(ContextCheckMessageHandler); | 6550 ExecuteScriptForContextCheck(ContextCheckMessageHandler); |
| 6523 | 6551 |
| 6524 // One time compile event and one time break event. | 6552 // One time compile event and one time break event. |
| 6525 CHECK_GT(message_handler_hit_count, 2); | 6553 CHECK_GT(message_handler_hit_count, 2); |
| 6526 CheckDebuggerUnloaded(); | 6554 CheckDebuggerUnloaded(CcTest::isolate()); |
| 6527 } | 6555 } |
| 6528 | 6556 |
| 6529 | 6557 |
| 6530 static bool sent_eval = false; | 6558 static bool sent_eval = false; |
| 6531 static int break_count = 0; | 6559 static int break_count = 0; |
| 6532 static int continue_command_send_count = 0; | 6560 static int continue_command_send_count = 0; |
| 6533 // Check that the expected context is the one generating the debug event | 6561 // Check that the expected context is the one generating the debug event |
| 6534 // including the case of nested break event. | 6562 // including the case of nested break event. |
| 6535 static void DebugEvalContextCheckMessageHandler( | 6563 static void DebugEvalContextCheckMessageHandler( |
| 6536 const v8::Debug::Message& message) { | 6564 const v8::Debug::Message& message) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6584 break_count = 0; | 6612 break_count = 0; |
| 6585 message_handler_hit_count = 0; | 6613 message_handler_hit_count = 0; |
| 6586 | 6614 |
| 6587 ExecuteScriptForContextCheck(DebugEvalContextCheckMessageHandler); | 6615 ExecuteScriptForContextCheck(DebugEvalContextCheckMessageHandler); |
| 6588 | 6616 |
| 6589 // One time compile event and two times break event. | 6617 // One time compile event and two times break event. |
| 6590 CHECK_GT(message_handler_hit_count, 3); | 6618 CHECK_GT(message_handler_hit_count, 3); |
| 6591 | 6619 |
| 6592 // One break from the source and another from the evaluate request. | 6620 // One break from the source and another from the evaluate request. |
| 6593 CHECK_EQ(break_count, 2); | 6621 CHECK_EQ(break_count, 2); |
| 6594 CheckDebuggerUnloaded(); | 6622 CheckDebuggerUnloaded(CcTest::isolate()); |
| 6595 } | 6623 } |
| 6596 | 6624 |
| 6597 | 6625 |
| 6598 // Debug event listener which counts the after compile events. | 6626 // Debug event listener which counts the after compile events. |
| 6599 int after_compile_message_count = 0; | 6627 int after_compile_message_count = 0; |
| 6600 static void AfterCompileMessageHandler(const v8::Debug::Message& message) { | 6628 static void AfterCompileMessageHandler(const v8::Debug::Message& message) { |
| 6601 // Count the number of scripts collected. | 6629 // Count the number of scripts collected. |
| 6602 if (message.IsEvent()) { | 6630 if (message.IsEvent()) { |
| 6603 if (message.GetEvent() == v8::AfterCompile) { | 6631 if (message.GetEvent() == v8::AfterCompile) { |
| 6604 after_compile_message_count++; | 6632 after_compile_message_count++; |
| 6605 } else if (message.GetEvent() == v8::Break) { | 6633 } else if (message.GetEvent() == v8::Break) { |
| 6606 SendContinueCommand(); | 6634 SendContinueCommand(); |
| 6607 } | 6635 } |
| 6608 } | 6636 } |
| 6609 } | 6637 } |
| 6610 | 6638 |
| 6611 | 6639 |
| 6612 // Tests that after compile event is sent as many times as there are scripts | 6640 // Tests that after compile event is sent as many times as there are scripts |
| 6613 // compiled. | 6641 // compiled. |
| 6614 TEST(AfterCompileMessageWhenMessageHandlerIsReset) { | 6642 TEST(AfterCompileMessageWhenMessageHandlerIsReset) { |
| 6615 DebugLocalContext env; | 6643 DebugLocalContext env; |
| 6616 v8::HandleScope scope(env->GetIsolate()); | 6644 v8::HandleScope scope(env->GetIsolate()); |
| 6617 v8::Local<v8::Context> context = env.context(); | 6645 v8::Local<v8::Context> context = env.context(); |
| 6618 after_compile_message_count = 0; | 6646 after_compile_message_count = 0; |
| 6619 const char* script = "var a=1"; | 6647 const char* script = "var a=1"; |
| 6620 | 6648 |
| 6621 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6649 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6622 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 6650 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
| 6623 .ToLocalChecked() | 6651 .ToLocalChecked() |
| 6624 ->Run(context) | 6652 ->Run(context) |
| 6625 .ToLocalChecked(); | 6653 .ToLocalChecked(); |
| 6626 v8::Debug::SetMessageHandler(NULL); | 6654 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6627 | 6655 |
| 6628 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6656 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6629 v8::Debug::DebugBreak(env->GetIsolate()); | 6657 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6630 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 6658 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
| 6631 .ToLocalChecked() | 6659 .ToLocalChecked() |
| 6632 ->Run(context) | 6660 ->Run(context) |
| 6633 .ToLocalChecked(); | 6661 .ToLocalChecked(); |
| 6634 | 6662 |
| 6635 // Setting listener to NULL should cause debugger unload. | 6663 // Setting listener to NULL should cause debugger unload. |
| 6636 v8::Debug::SetMessageHandler(NULL); | 6664 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6637 CheckDebuggerUnloaded(); | 6665 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6638 | 6666 |
| 6639 // Compilation cache should be disabled when debugger is active. | 6667 // Compilation cache should be disabled when debugger is active. |
| 6640 CHECK_EQ(2, after_compile_message_count); | 6668 CHECK_EQ(2, after_compile_message_count); |
| 6641 } | 6669 } |
| 6642 | 6670 |
| 6643 | 6671 |
| 6644 // Syntax error event handler which counts a number of events. | 6672 // Syntax error event handler which counts a number of events. |
| 6645 int compile_error_event_count = 0; | 6673 int compile_error_event_count = 0; |
| 6646 | 6674 |
| 6647 static void CompileErrorEventCounterClear() { | 6675 static void CompileErrorEventCounterClear() { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 6660 | 6688 |
| 6661 // Tests that syntax error event is sent as many times as there are scripts | 6689 // Tests that syntax error event is sent as many times as there are scripts |
| 6662 // with syntax error compiled. | 6690 // with syntax error compiled. |
| 6663 TEST(SyntaxErrorMessageOnSyntaxException) { | 6691 TEST(SyntaxErrorMessageOnSyntaxException) { |
| 6664 DebugLocalContext env; | 6692 DebugLocalContext env; |
| 6665 v8::HandleScope scope(env->GetIsolate()); | 6693 v8::HandleScope scope(env->GetIsolate()); |
| 6666 | 6694 |
| 6667 // For this test, we want to break on uncaught exceptions: | 6695 // For this test, we want to break on uncaught exceptions: |
| 6668 ChangeBreakOnException(false, true); | 6696 ChangeBreakOnException(false, true); |
| 6669 | 6697 |
| 6670 v8::Debug::SetDebugEventListener(CompileErrorEventCounter); | 6698 v8::Debug::SetDebugEventListener(env->GetIsolate(), CompileErrorEventCounter); |
| 6671 v8::Local<v8::Context> context = env.context(); | 6699 v8::Local<v8::Context> context = env.context(); |
| 6672 | 6700 |
| 6673 CompileErrorEventCounterClear(); | 6701 CompileErrorEventCounterClear(); |
| 6674 | 6702 |
| 6675 // Check initial state. | 6703 // Check initial state. |
| 6676 CHECK_EQ(0, compile_error_event_count); | 6704 CHECK_EQ(0, compile_error_event_count); |
| 6677 | 6705 |
| 6678 // Throws SyntaxError: Unexpected end of input | 6706 // Throws SyntaxError: Unexpected end of input |
| 6679 CHECK( | 6707 CHECK( |
| 6680 v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty()); | 6708 v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 6704 | 6732 |
| 6705 | 6733 |
| 6706 // Tests that break event is sent when message handler is reset. | 6734 // Tests that break event is sent when message handler is reset. |
| 6707 TEST(BreakMessageWhenMessageHandlerIsReset) { | 6735 TEST(BreakMessageWhenMessageHandlerIsReset) { |
| 6708 DebugLocalContext env; | 6736 DebugLocalContext env; |
| 6709 v8::HandleScope scope(env->GetIsolate()); | 6737 v8::HandleScope scope(env->GetIsolate()); |
| 6710 v8::Local<v8::Context> context = env.context(); | 6738 v8::Local<v8::Context> context = env.context(); |
| 6711 after_compile_message_count = 0; | 6739 after_compile_message_count = 0; |
| 6712 const char* script = "function f() {};"; | 6740 const char* script = "function f() {};"; |
| 6713 | 6741 |
| 6714 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6742 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6715 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 6743 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
| 6716 .ToLocalChecked() | 6744 .ToLocalChecked() |
| 6717 ->Run(context) | 6745 ->Run(context) |
| 6718 .ToLocalChecked(); | 6746 .ToLocalChecked(); |
| 6719 v8::Debug::SetMessageHandler(NULL); | 6747 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6720 | 6748 |
| 6721 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6749 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6722 v8::Debug::DebugBreak(env->GetIsolate()); | 6750 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6723 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 6751 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
| 6724 env->Global() | 6752 env->Global() |
| 6725 ->Get(context, v8_str(env->GetIsolate(), "f")) | 6753 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 6726 .ToLocalChecked()); | 6754 .ToLocalChecked()); |
| 6727 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6755 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 6728 | 6756 |
| 6729 // Setting message handler to NULL should cause debugger unload. | 6757 // Setting message handler to NULL should cause debugger unload. |
| 6730 v8::Debug::SetMessageHandler(NULL); | 6758 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6731 CheckDebuggerUnloaded(); | 6759 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6732 | 6760 |
| 6733 // Compilation cache should be disabled when debugger is active. | 6761 // Compilation cache should be disabled when debugger is active. |
| 6734 CHECK_EQ(1, after_compile_message_count); | 6762 CHECK_EQ(1, after_compile_message_count); |
| 6735 } | 6763 } |
| 6736 | 6764 |
| 6737 | 6765 |
| 6738 static int exception_event_count = 0; | 6766 static int exception_event_count = 0; |
| 6739 static void ExceptionMessageHandler(const v8::Debug::Message& message) { | 6767 static void ExceptionMessageHandler(const v8::Debug::Message& message) { |
| 6740 if (message.IsEvent() && message.GetEvent() == v8::Exception) { | 6768 if (message.IsEvent() && message.GetEvent() == v8::Exception) { |
| 6741 exception_event_count++; | 6769 exception_event_count++; |
| 6742 SendContinueCommand(); | 6770 SendContinueCommand(); |
| 6743 } | 6771 } |
| 6744 } | 6772 } |
| 6745 | 6773 |
| 6746 | 6774 |
| 6747 // Tests that exception event is sent when message handler is reset. | 6775 // Tests that exception event is sent when message handler is reset. |
| 6748 TEST(ExceptionMessageWhenMessageHandlerIsReset) { | 6776 TEST(ExceptionMessageWhenMessageHandlerIsReset) { |
| 6749 DebugLocalContext env; | 6777 DebugLocalContext env; |
| 6750 v8::HandleScope scope(env->GetIsolate()); | 6778 v8::HandleScope scope(env->GetIsolate()); |
| 6751 | 6779 |
| 6752 v8::Local<v8::Context> context = env.context(); | 6780 v8::Local<v8::Context> context = env.context(); |
| 6753 // For this test, we want to break on uncaught exceptions: | 6781 // For this test, we want to break on uncaught exceptions: |
| 6754 ChangeBreakOnException(false, true); | 6782 ChangeBreakOnException(false, true); |
| 6755 | 6783 |
| 6756 exception_event_count = 0; | 6784 exception_event_count = 0; |
| 6757 const char* script = "function f() {throw new Error()};"; | 6785 const char* script = "function f() {throw new Error()};"; |
| 6758 | 6786 |
| 6759 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6787 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6760 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) | 6788 v8::Script::Compile(context, v8_str(env->GetIsolate(), script)) |
| 6761 .ToLocalChecked() | 6789 .ToLocalChecked() |
| 6762 ->Run(context) | 6790 ->Run(context) |
| 6763 .ToLocalChecked(); | 6791 .ToLocalChecked(); |
| 6764 v8::Debug::SetMessageHandler(NULL); | 6792 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6765 | 6793 |
| 6766 v8::Debug::SetMessageHandler(ExceptionMessageHandler); | 6794 v8::Debug::SetMessageHandler(env->GetIsolate(), ExceptionMessageHandler); |
| 6767 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 6795 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( |
| 6768 env->Global() | 6796 env->Global() |
| 6769 ->Get(context, v8_str(env->GetIsolate(), "f")) | 6797 ->Get(context, v8_str(env->GetIsolate(), "f")) |
| 6770 .ToLocalChecked()); | 6798 .ToLocalChecked()); |
| 6771 CHECK(f->Call(context, env->Global(), 0, NULL).IsEmpty()); | 6799 CHECK(f->Call(context, env->Global(), 0, NULL).IsEmpty()); |
| 6772 | 6800 |
| 6773 // Setting message handler to NULL should cause debugger unload. | 6801 // Setting message handler to NULL should cause debugger unload. |
| 6774 v8::Debug::SetMessageHandler(NULL); | 6802 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6775 CheckDebuggerUnloaded(); | 6803 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6776 | 6804 |
| 6777 CHECK_EQ(1, exception_event_count); | 6805 CHECK_EQ(1, exception_event_count); |
| 6778 } | 6806 } |
| 6779 | 6807 |
| 6780 | 6808 |
| 6781 // Tests after compile event is sent when there are some provisional | 6809 // Tests after compile event is sent when there are some provisional |
| 6782 // breakpoints out of the scripts lines range. | 6810 // breakpoints out of the scripts lines range. |
| 6783 TEST(ProvisionalBreakpointOnLineOutOfRange) { | 6811 TEST(ProvisionalBreakpointOnLineOutOfRange) { |
| 6784 DebugLocalContext env; | 6812 DebugLocalContext env; |
| 6785 v8::HandleScope scope(env->GetIsolate()); | 6813 v8::HandleScope scope(env->GetIsolate()); |
| 6786 env.ExposeDebug(); | 6814 env.ExposeDebug(); |
| 6787 const char* script = "function f() {};"; | 6815 const char* script = "function f() {};"; |
| 6788 const char* resource_name = "test_resource"; | 6816 const char* resource_name = "test_resource"; |
| 6789 | 6817 |
| 6790 v8::Debug::SetMessageHandler(AfterCompileMessageHandler); | 6818 v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler); |
| 6791 v8::Local<v8::Context> context = env.context(); | 6819 v8::Local<v8::Context> context = env.context(); |
| 6792 | 6820 |
| 6793 // Set a couple of provisional breakpoint on lines out of the script lines | 6821 // Set a couple of provisional breakpoint on lines out of the script lines |
| 6794 // range. | 6822 // range. |
| 6795 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, | 6823 int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, |
| 6796 3, -1 /* no column */); | 6824 3, -1 /* no column */); |
| 6797 int sbp2 = | 6825 int sbp2 = |
| 6798 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); | 6826 SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); |
| 6799 | 6827 |
| 6800 after_compile_message_count = 0; | 6828 after_compile_message_count = 0; |
| 6801 | 6829 |
| 6802 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), resource_name), | 6830 v8::ScriptOrigin origin(v8_str(env->GetIsolate(), resource_name), |
| 6803 v8::Integer::New(env->GetIsolate(), 10), | 6831 v8::Integer::New(env->GetIsolate(), 10), |
| 6804 v8::Integer::New(env->GetIsolate(), 1)); | 6832 v8::Integer::New(env->GetIsolate(), 1)); |
| 6805 // Compile a script whose first line number is greater than the breakpoints' | 6833 // Compile a script whose first line number is greater than the breakpoints' |
| 6806 // lines. | 6834 // lines. |
| 6807 v8::Script::Compile(context, v8_str(env->GetIsolate(), script), &origin) | 6835 v8::Script::Compile(context, v8_str(env->GetIsolate(), script), &origin) |
| 6808 .ToLocalChecked() | 6836 .ToLocalChecked() |
| 6809 ->Run(context) | 6837 ->Run(context) |
| 6810 .ToLocalChecked(); | 6838 .ToLocalChecked(); |
| 6811 | 6839 |
| 6812 // If the script is compiled successfully there is exactly one after compile | 6840 // If the script is compiled successfully there is exactly one after compile |
| 6813 // event. In case of an exception in debugger code after compile event is not | 6841 // event. In case of an exception in debugger code after compile event is not |
| 6814 // sent. | 6842 // sent. |
| 6815 CHECK_EQ(1, after_compile_message_count); | 6843 CHECK_EQ(1, after_compile_message_count); |
| 6816 | 6844 |
| 6817 ClearBreakPointFromJS(env->GetIsolate(), sbp1); | 6845 ClearBreakPointFromJS(env->GetIsolate(), sbp1); |
| 6818 ClearBreakPointFromJS(env->GetIsolate(), sbp2); | 6846 ClearBreakPointFromJS(env->GetIsolate(), sbp2); |
| 6819 v8::Debug::SetMessageHandler(NULL); | 6847 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6820 } | 6848 } |
| 6821 | 6849 |
| 6822 | 6850 |
| 6823 static void BreakMessageHandler(const v8::Debug::Message& message) { | 6851 static void BreakMessageHandler(const v8::Debug::Message& message) { |
| 6824 i::Isolate* isolate = CcTest::i_isolate(); | 6852 i::Isolate* isolate = CcTest::i_isolate(); |
| 6825 if (message.IsEvent() && message.GetEvent() == v8::Break) { | 6853 if (message.IsEvent() && message.GetEvent() == v8::Break) { |
| 6826 // Count the number of breaks. | 6854 // Count the number of breaks. |
| 6827 break_point_hit_count++; | 6855 break_point_hit_count++; |
| 6828 | 6856 |
| 6829 i::HandleScope scope(isolate); | 6857 i::HandleScope scope(isolate); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 6844 | 6872 |
| 6845 | 6873 |
| 6846 // Test that if DebugBreak is forced it is ignored when code from | 6874 // Test that if DebugBreak is forced it is ignored when code from |
| 6847 // debug-delay.js is executed. | 6875 // debug-delay.js is executed. |
| 6848 TEST(NoDebugBreakInAfterCompileMessageHandler) { | 6876 TEST(NoDebugBreakInAfterCompileMessageHandler) { |
| 6849 DebugLocalContext env; | 6877 DebugLocalContext env; |
| 6850 v8::HandleScope scope(env->GetIsolate()); | 6878 v8::HandleScope scope(env->GetIsolate()); |
| 6851 v8::Local<v8::Context> context = env.context(); | 6879 v8::Local<v8::Context> context = env.context(); |
| 6852 | 6880 |
| 6853 // Register a debug event listener which sets the break flag and counts. | 6881 // Register a debug event listener which sets the break flag and counts. |
| 6854 v8::Debug::SetMessageHandler(BreakMessageHandler); | 6882 v8::Debug::SetMessageHandler(env->GetIsolate(), BreakMessageHandler); |
| 6855 | 6883 |
| 6856 // Set the debug break flag. | 6884 // Set the debug break flag. |
| 6857 v8::Debug::DebugBreak(env->GetIsolate()); | 6885 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6858 | 6886 |
| 6859 // Create a function for testing stepping. | 6887 // Create a function for testing stepping. |
| 6860 const char* src = "function f() { eval('var x = 10;'); } "; | 6888 const char* src = "function f() { eval('var x = 10;'); } "; |
| 6861 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); | 6889 v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); |
| 6862 | 6890 |
| 6863 // There should be only one break event. | 6891 // There should be only one break event. |
| 6864 CHECK_EQ(1, break_point_hit_count); | 6892 CHECK_EQ(1, break_point_hit_count); |
| 6865 | 6893 |
| 6866 // Set the debug break flag again. | 6894 // Set the debug break flag again. |
| 6867 v8::Debug::DebugBreak(env->GetIsolate()); | 6895 v8::Debug::DebugBreak(env->GetIsolate()); |
| 6868 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 6896 f->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 6869 // There should be one more break event when the script is evaluated in 'f'. | 6897 // There should be one more break event when the script is evaluated in 'f'. |
| 6870 CHECK_EQ(2, break_point_hit_count); | 6898 CHECK_EQ(2, break_point_hit_count); |
| 6871 | 6899 |
| 6872 // Get rid of the debug message handler. | 6900 // Get rid of the debug message handler. |
| 6873 v8::Debug::SetMessageHandler(NULL); | 6901 v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr); |
| 6874 CheckDebuggerUnloaded(); | 6902 CheckDebuggerUnloaded(env->GetIsolate()); |
| 6875 } | 6903 } |
| 6876 | 6904 |
| 6877 | 6905 |
| 6878 static int counting_message_handler_counter; | 6906 static int counting_message_handler_counter; |
| 6879 | 6907 |
| 6880 static void CountingMessageHandler(const v8::Debug::Message& message) { | 6908 static void CountingMessageHandler(const v8::Debug::Message& message) { |
| 6881 if (message.IsResponse()) counting_message_handler_counter++; | 6909 if (message.IsResponse()) counting_message_handler_counter++; |
| 6882 } | 6910 } |
| 6883 | 6911 |
| 6884 | 6912 |
| 6885 // Test that debug messages get processed when ProcessDebugMessages is called. | 6913 // Test that debug messages get processed when ProcessDebugMessages is called. |
| 6886 TEST(ProcessDebugMessages) { | 6914 TEST(ProcessDebugMessages) { |
| 6887 DebugLocalContext env; | 6915 DebugLocalContext env; |
| 6888 v8::Isolate* isolate = env->GetIsolate(); | 6916 v8::Isolate* isolate = env->GetIsolate(); |
| 6889 v8::HandleScope scope(isolate); | 6917 v8::HandleScope scope(isolate); |
| 6890 | 6918 |
| 6891 counting_message_handler_counter = 0; | 6919 counting_message_handler_counter = 0; |
| 6892 | 6920 |
| 6893 v8::Debug::SetMessageHandler(CountingMessageHandler); | 6921 v8::Debug::SetMessageHandler(isolate, CountingMessageHandler); |
| 6894 | 6922 |
| 6895 const int kBufferSize = 1000; | 6923 const int kBufferSize = 1000; |
| 6896 uint16_t buffer[kBufferSize]; | 6924 uint16_t buffer[kBufferSize]; |
| 6897 const char* scripts_command = | 6925 const char* scripts_command = |
| 6898 "{\"seq\":0," | 6926 "{\"seq\":0," |
| 6899 "\"type\":\"request\"," | 6927 "\"type\":\"request\"," |
| 6900 "\"command\":\"scripts\"}"; | 6928 "\"command\":\"scripts\"}"; |
| 6901 | 6929 |
| 6902 // Send scripts command. | 6930 // Send scripts command. |
| 6903 v8::Debug::SendCommand( | 6931 v8::Debug::SendCommand( |
| 6904 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); | 6932 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); |
| 6905 | 6933 |
| 6906 CHECK_EQ(0, counting_message_handler_counter); | 6934 CHECK_EQ(0, counting_message_handler_counter); |
| 6907 v8::Debug::ProcessDebugMessages(); | 6935 v8::Debug::ProcessDebugMessages(isolate); |
| 6908 // At least one message should come | 6936 // At least one message should come |
| 6909 CHECK_GE(counting_message_handler_counter, 1); | 6937 CHECK_GE(counting_message_handler_counter, 1); |
| 6910 | 6938 |
| 6911 counting_message_handler_counter = 0; | 6939 counting_message_handler_counter = 0; |
| 6912 | 6940 |
| 6913 v8::Debug::SendCommand( | 6941 v8::Debug::SendCommand( |
| 6914 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); | 6942 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); |
| 6915 v8::Debug::SendCommand( | 6943 v8::Debug::SendCommand( |
| 6916 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); | 6944 isolate, buffer, AsciiToUtf16(scripts_command, buffer)); |
| 6917 CHECK_EQ(0, counting_message_handler_counter); | 6945 CHECK_EQ(0, counting_message_handler_counter); |
| 6918 v8::Debug::ProcessDebugMessages(); | 6946 v8::Debug::ProcessDebugMessages(isolate); |
| 6919 // At least two messages should come | 6947 // At least two messages should come |
| 6920 CHECK_GE(counting_message_handler_counter, 2); | 6948 CHECK_GE(counting_message_handler_counter, 2); |
| 6921 | 6949 |
| 6922 // Get rid of the debug message handler. | 6950 // Get rid of the debug message handler. |
| 6923 v8::Debug::SetMessageHandler(NULL); | 6951 v8::Debug::SetMessageHandler(isolate, nullptr); |
| 6924 CheckDebuggerUnloaded(); | 6952 CheckDebuggerUnloaded(isolate); |
| 6925 } | 6953 } |
| 6926 | 6954 |
| 6927 | 6955 |
| 6928 class SendCommandThread; | 6956 class SendCommandThread; |
| 6929 static SendCommandThread* send_command_thread_ = NULL; | 6957 static SendCommandThread* send_command_thread_ = NULL; |
| 6930 | 6958 |
| 6931 | 6959 |
| 6932 class SendCommandThread : public v8::base::Thread { | 6960 class SendCommandThread : public v8::base::Thread { |
| 6933 public: | 6961 public: |
| 6934 explicit SendCommandThread(v8::Isolate* isolate) | 6962 explicit SendCommandThread(v8::Isolate* isolate) |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6986 | 7014 |
| 6987 TEST(ProcessDebugMessagesThreaded) { | 7015 TEST(ProcessDebugMessagesThreaded) { |
| 6988 DebugLocalContext env; | 7016 DebugLocalContext env; |
| 6989 v8::Isolate* isolate = env->GetIsolate(); | 7017 v8::Isolate* isolate = env->GetIsolate(); |
| 6990 v8::HandleScope scope(isolate); | 7018 v8::HandleScope scope(isolate); |
| 6991 v8::Local<v8::Context> context = env.context(); | 7019 v8::Local<v8::Context> context = env.context(); |
| 6992 | 7020 |
| 6993 counting_message_handler_counter = 0; | 7021 counting_message_handler_counter = 0; |
| 6994 | 7022 |
| 6995 v8::Debug::SetMessageHandler( | 7023 v8::Debug::SetMessageHandler( |
| 6996 SendCommandThread::CountingAndSignallingMessageHandler); | 7024 isolate, SendCommandThread::CountingAndSignallingMessageHandler); |
| 6997 send_command_thread_ = new SendCommandThread(isolate); | 7025 send_command_thread_ = new SendCommandThread(isolate); |
| 6998 send_command_thread_->Start(); | 7026 send_command_thread_->Start(); |
| 6999 | 7027 |
| 7000 v8::Local<v8::FunctionTemplate> start = | 7028 v8::Local<v8::FunctionTemplate> start = |
| 7001 v8::FunctionTemplate::New(isolate, StartSendingCommands); | 7029 v8::FunctionTemplate::New(isolate, StartSendingCommands); |
| 7002 CHECK(env->Global() | 7030 CHECK(env->Global() |
| 7003 ->Set(context, v8_str("start"), | 7031 ->Set(context, v8_str("start"), |
| 7004 start->GetFunction(context).ToLocalChecked()) | 7032 start->GetFunction(context).ToLocalChecked()) |
| 7005 .FromJust()); | 7033 .FromJust()); |
| 7006 | 7034 |
| 7007 CompileRun("start(); while (true) { }"); | 7035 CompileRun("start(); while (true) { }"); |
| 7008 | 7036 |
| 7009 CHECK_EQ(20, counting_message_handler_counter); | 7037 CHECK_EQ(20, counting_message_handler_counter); |
| 7010 | 7038 |
| 7011 v8::Debug::SetMessageHandler(NULL); | 7039 v8::Debug::SetMessageHandler(isolate, nullptr); |
| 7012 CheckDebuggerUnloaded(); | 7040 CheckDebuggerUnloaded(isolate); |
| 7013 } | 7041 } |
| 7014 | 7042 |
| 7015 | 7043 |
| 7016 struct BacktraceData { | 7044 struct BacktraceData { |
| 7017 static int frame_counter; | 7045 static int frame_counter; |
| 7018 static void MessageHandler(const v8::Debug::Message& message) { | 7046 static void MessageHandler(const v8::Debug::Message& message) { |
| 7019 char print_buffer[1000]; | 7047 char print_buffer[1000]; |
| 7020 v8::String::Value json(message.GetJSON()); | 7048 v8::String::Value json(message.GetJSON()); |
| 7021 Utf16ToAscii(*json, json.length(), print_buffer, 1000); | 7049 Utf16ToAscii(*json, json.length(), print_buffer, 1000); |
| 7022 | 7050 |
| 7023 if (strstr(print_buffer, "backtrace") == NULL) { | 7051 if (strstr(print_buffer, "backtrace") == NULL) { |
| 7024 return; | 7052 return; |
| 7025 } | 7053 } |
| 7026 frame_counter = GetTotalFramesInt(print_buffer); | 7054 frame_counter = GetTotalFramesInt(print_buffer); |
| 7027 } | 7055 } |
| 7028 }; | 7056 }; |
| 7029 | 7057 |
| 7030 int BacktraceData::frame_counter; | 7058 int BacktraceData::frame_counter; |
| 7031 | 7059 |
| 7032 | 7060 |
| 7033 // Test that debug messages get processed when ProcessDebugMessages is called. | 7061 // Test that debug messages get processed when ProcessDebugMessages is called. |
| 7034 TEST(Backtrace) { | 7062 TEST(Backtrace) { |
| 7035 DebugLocalContext env; | 7063 DebugLocalContext env; |
| 7036 v8::Isolate* isolate = env->GetIsolate(); | 7064 v8::Isolate* isolate = env->GetIsolate(); |
| 7037 v8::HandleScope scope(isolate); | 7065 v8::HandleScope scope(isolate); |
| 7038 v8::Local<v8::Context> context = env.context(); | 7066 v8::Local<v8::Context> context = env.context(); |
| 7039 | 7067 |
| 7040 v8::Debug::SetMessageHandler(BacktraceData::MessageHandler); | 7068 v8::Debug::SetMessageHandler(isolate, BacktraceData::MessageHandler); |
| 7041 | 7069 |
| 7042 const int kBufferSize = 1000; | 7070 const int kBufferSize = 1000; |
| 7043 uint16_t buffer[kBufferSize]; | 7071 uint16_t buffer[kBufferSize]; |
| 7044 const char* scripts_command = | 7072 const char* scripts_command = |
| 7045 "{\"seq\":0," | 7073 "{\"seq\":0," |
| 7046 "\"type\":\"request\"," | 7074 "\"type\":\"request\"," |
| 7047 "\"command\":\"backtrace\"}"; | 7075 "\"command\":\"backtrace\"}"; |
| 7048 | 7076 |
| 7049 // Check backtrace from ProcessDebugMessages. | 7077 // Check backtrace from ProcessDebugMessages. |
| 7050 BacktraceData::frame_counter = -10; | 7078 BacktraceData::frame_counter = -10; |
| 7051 v8::Debug::SendCommand( | 7079 v8::Debug::SendCommand( |
| 7052 isolate, | 7080 isolate, |
| 7053 buffer, | 7081 buffer, |
| 7054 AsciiToUtf16(scripts_command, buffer), | 7082 AsciiToUtf16(scripts_command, buffer), |
| 7055 NULL); | 7083 NULL); |
| 7056 v8::Debug::ProcessDebugMessages(); | 7084 v8::Debug::ProcessDebugMessages(isolate); |
| 7057 CHECK_EQ(BacktraceData::frame_counter, 0); | 7085 CHECK_EQ(BacktraceData::frame_counter, 0); |
| 7058 | 7086 |
| 7059 v8::Local<v8::String> void0 = v8_str(env->GetIsolate(), "void(0)"); | 7087 v8::Local<v8::String> void0 = v8_str(env->GetIsolate(), "void(0)"); |
| 7060 v8::Local<v8::Script> script = CompileWithOrigin(void0, void0); | 7088 v8::Local<v8::Script> script = CompileWithOrigin(void0, void0); |
| 7061 | 7089 |
| 7062 // Check backtrace from "void(0)" script. | 7090 // Check backtrace from "void(0)" script. |
| 7063 BacktraceData::frame_counter = -10; | 7091 BacktraceData::frame_counter = -10; |
| 7064 v8::Debug::SendCommand( | 7092 v8::Debug::SendCommand( |
| 7065 isolate, | 7093 isolate, |
| 7066 buffer, | 7094 buffer, |
| 7067 AsciiToUtf16(scripts_command, buffer), | 7095 AsciiToUtf16(scripts_command, buffer), |
| 7068 NULL); | 7096 NULL); |
| 7069 script->Run(context).ToLocalChecked(); | 7097 script->Run(context).ToLocalChecked(); |
| 7070 CHECK_EQ(BacktraceData::frame_counter, 1); | 7098 CHECK_EQ(BacktraceData::frame_counter, 1); |
| 7071 | 7099 |
| 7072 // Get rid of the debug message handler. | 7100 // Get rid of the debug message handler. |
| 7073 v8::Debug::SetMessageHandler(NULL); | 7101 v8::Debug::SetMessageHandler(isolate, nullptr); |
| 7074 CheckDebuggerUnloaded(); | 7102 CheckDebuggerUnloaded(isolate); |
| 7075 } | 7103 } |
| 7076 | 7104 |
| 7077 | 7105 |
| 7078 TEST(GetMirror) { | 7106 TEST(GetMirror) { |
| 7079 DebugLocalContext env; | 7107 DebugLocalContext env; |
| 7080 v8::Isolate* isolate = env->GetIsolate(); | 7108 v8::Isolate* isolate = env->GetIsolate(); |
| 7081 v8::HandleScope scope(isolate); | 7109 v8::HandleScope scope(isolate); |
| 7082 v8::Local<v8::Context> context = env.context(); | 7110 v8::Local<v8::Context> context = env.context(); |
| 7083 v8::Local<v8::Value> obj = | 7111 v8::Local<v8::Value> obj = |
| 7084 v8::Debug::GetMirror(context, v8_str(isolate, "hodja")).ToLocalChecked(); | 7112 v8::Debug::GetMirror(context, v8_str(isolate, "hodja")).ToLocalChecked(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 7108 | 7136 |
| 7109 // Create a function for testing breaking in apply. | 7137 // Create a function for testing breaking in apply. |
| 7110 v8::Local<v8::Function> foo = CompileFunction( | 7138 v8::Local<v8::Function> foo = CompileFunction( |
| 7111 &env, | 7139 &env, |
| 7112 "function baz(x) { }" | 7140 "function baz(x) { }" |
| 7113 "function bar(x) { baz(); }" | 7141 "function bar(x) { baz(); }" |
| 7114 "function foo(){ bar.apply(this, [1]); }", | 7142 "function foo(){ bar.apply(this, [1]); }", |
| 7115 "foo"); | 7143 "foo"); |
| 7116 | 7144 |
| 7117 // Register a debug event listener which steps and counts. | 7145 // Register a debug event listener which steps and counts. |
| 7118 v8::Debug::SetDebugEventListener(DebugEventBreakMax); | 7146 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); |
| 7119 | 7147 |
| 7120 // Set the debug break flag before calling the code using function.apply. | 7148 // Set the debug break flag before calling the code using function.apply. |
| 7121 v8::Debug::DebugBreak(env->GetIsolate()); | 7149 v8::Debug::DebugBreak(env->GetIsolate()); |
| 7122 | 7150 |
| 7123 // Limit the number of debug breaks. This is a regression test for issue 493 | 7151 // Limit the number of debug breaks. This is a regression test for issue 493 |
| 7124 // where this test would enter an infinite loop. | 7152 // where this test would enter an infinite loop. |
| 7125 break_point_hit_count = 0; | 7153 break_point_hit_count = 0; |
| 7126 max_break_point_hit_count = 10000; // 10000 => infinite loop. | 7154 max_break_point_hit_count = 10000; // 10000 => infinite loop. |
| 7127 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); | 7155 foo->Call(context, env->Global(), 0, NULL).ToLocalChecked(); |
| 7128 | 7156 |
| 7129 // When keeping the debug break several break will happen. | 7157 // When keeping the debug break several break will happen. |
| 7130 CHECK_GT(break_point_hit_count, 1); | 7158 CHECK_GT(break_point_hit_count, 1); |
| 7131 | 7159 |
| 7132 v8::Debug::SetDebugEventListener(NULL); | 7160 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7133 CheckDebuggerUnloaded(); | 7161 CheckDebuggerUnloaded(env->GetIsolate()); |
| 7134 } | 7162 } |
| 7135 | 7163 |
| 7136 | 7164 |
| 7137 v8::Local<v8::Context> debugee_context; | 7165 v8::Local<v8::Context> debugee_context; |
| 7138 v8::Local<v8::Context> debugger_context; | 7166 v8::Local<v8::Context> debugger_context; |
| 7139 | 7167 |
| 7140 | 7168 |
| 7141 // Property getter that checks that current and calling contexts | 7169 // Property getter that checks that current and calling contexts |
| 7142 // are both the debugee contexts. | 7170 // are both the debugee contexts. |
| 7143 static void NamedGetterWithCallingContextCheck( | 7171 static void NamedGetterWithCallingContextCheck( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7190 | 7218 |
| 7191 // Create object with 'a' property accessor. | 7219 // Create object with 'a' property accessor. |
| 7192 v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate); | 7220 v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate); |
| 7193 named->SetAccessor(v8_str(isolate, "a"), NamedGetterWithCallingContextCheck); | 7221 named->SetAccessor(v8_str(isolate, "a"), NamedGetterWithCallingContextCheck); |
| 7194 CHECK(env->Global() | 7222 CHECK(env->Global() |
| 7195 ->Set(debugee_context, v8_str(isolate, "obj"), | 7223 ->Set(debugee_context, v8_str(isolate, "obj"), |
| 7196 named->NewInstance(debugee_context).ToLocalChecked()) | 7224 named->NewInstance(debugee_context).ToLocalChecked()) |
| 7197 .FromJust()); | 7225 .FromJust()); |
| 7198 | 7226 |
| 7199 // Register the debug event listener | 7227 // Register the debug event listener |
| 7200 v8::Debug::SetDebugEventListener(DebugEventGetAtgumentPropertyValue); | 7228 v8::Debug::SetDebugEventListener(isolate, DebugEventGetAtgumentPropertyValue); |
| 7201 | 7229 |
| 7202 // Create a function that invokes debugger. | 7230 // Create a function that invokes debugger. |
| 7203 v8::Local<v8::Function> foo = CompileFunction( | 7231 v8::Local<v8::Function> foo = CompileFunction( |
| 7204 &env, | 7232 &env, |
| 7205 "function bar(x) { debugger; }" | 7233 "function bar(x) { debugger; }" |
| 7206 "function foo(){ bar(obj); }", | 7234 "function foo(){ bar(obj); }", |
| 7207 "foo"); | 7235 "foo"); |
| 7208 | 7236 |
| 7209 break_point_hit_count = 0; | 7237 break_point_hit_count = 0; |
| 7210 foo->Call(debugee_context, env->Global(), 0, NULL).ToLocalChecked(); | 7238 foo->Call(debugee_context, env->Global(), 0, NULL).ToLocalChecked(); |
| 7211 CHECK_EQ(1, break_point_hit_count); | 7239 CHECK_EQ(1, break_point_hit_count); |
| 7212 | 7240 |
| 7213 v8::Debug::SetDebugEventListener(NULL); | 7241 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 7214 debugee_context = v8::Local<v8::Context>(); | 7242 debugee_context = v8::Local<v8::Context>(); |
| 7215 debugger_context = v8::Local<v8::Context>(); | 7243 debugger_context = v8::Local<v8::Context>(); |
| 7216 CheckDebuggerUnloaded(); | 7244 CheckDebuggerUnloaded(isolate); |
| 7217 } | 7245 } |
| 7218 | 7246 |
| 7219 | 7247 |
| 7220 TEST(DebugContextIsPreservedBetweenAccesses) { | 7248 TEST(DebugContextIsPreservedBetweenAccesses) { |
| 7221 v8::HandleScope scope(CcTest::isolate()); | 7249 v8::HandleScope scope(CcTest::isolate()); |
| 7222 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount); | 7250 v8::Debug::SetDebugEventListener(CcTest::isolate(), |
| 7223 v8::Local<v8::Context> context1 = v8::Debug::GetDebugContext(); | 7251 DebugEventBreakPointHitCount); |
| 7224 v8::Local<v8::Context> context2 = v8::Debug::GetDebugContext(); | 7252 v8::Local<v8::Context> context1 = |
| 7253 v8::Debug::GetDebugContext(CcTest::isolate()); |
| 7254 v8::Local<v8::Context> context2 = |
| 7255 v8::Debug::GetDebugContext(CcTest::isolate()); |
| 7225 CHECK(v8::Utils::OpenHandle(*context1).is_identical_to( | 7256 CHECK(v8::Utils::OpenHandle(*context1).is_identical_to( |
| 7226 v8::Utils::OpenHandle(*context2))); | 7257 v8::Utils::OpenHandle(*context2))); |
| 7227 v8::Debug::SetDebugEventListener(NULL); | 7258 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); |
| 7228 } | 7259 } |
| 7229 | 7260 |
| 7230 | 7261 |
| 7231 TEST(NoDebugContextWhenDebuggerDisabled) { | 7262 TEST(NoDebugContextWhenDebuggerDisabled) { |
| 7232 v8::HandleScope scope(CcTest::isolate()); | 7263 v8::HandleScope scope(CcTest::isolate()); |
| 7233 v8::Local<v8::Context> context = v8::Debug::GetDebugContext(); | 7264 v8::Local<v8::Context> context = |
| 7265 v8::Debug::GetDebugContext(CcTest::isolate()); |
| 7234 CHECK(context.IsEmpty()); | 7266 CHECK(context.IsEmpty()); |
| 7235 } | 7267 } |
| 7236 | 7268 |
| 7237 | 7269 |
| 7238 static v8::Local<v8::Value> expected_callback_data; | 7270 static v8::Local<v8::Value> expected_callback_data; |
| 7239 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { | 7271 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) { |
| 7240 CHECK(details.GetEventContext() == expected_context); | 7272 CHECK(details.GetEventContext() == expected_context); |
| 7241 CHECK(expected_callback_data->Equals(details.GetEventContext(), | 7273 CHECK(expected_callback_data->Equals(details.GetEventContext(), |
| 7242 details.GetCallbackData()) | 7274 details.GetCallbackData()) |
| 7243 .FromJust()); | 7275 .FromJust()); |
| 7244 } | 7276 } |
| 7245 | 7277 |
| 7246 | 7278 |
| 7247 // Check that event details contain context where debug event occured. | 7279 // Check that event details contain context where debug event occured. |
| 7248 TEST(DebugEventContext) { | 7280 TEST(DebugEventContext) { |
| 7249 v8::Isolate* isolate = CcTest::isolate(); | 7281 v8::Isolate* isolate = CcTest::isolate(); |
| 7250 v8::HandleScope scope(isolate); | 7282 v8::HandleScope scope(isolate); |
| 7251 expected_context = v8::Context::New(isolate); | 7283 expected_context = v8::Context::New(isolate); |
| 7252 expected_callback_data = v8::Int32::New(isolate, 2010); | 7284 expected_callback_data = v8::Int32::New(isolate, 2010); |
| 7253 v8::Debug::SetDebugEventListener(DebugEventContextChecker, | 7285 v8::Debug::SetDebugEventListener(isolate, DebugEventContextChecker, |
| 7254 expected_callback_data); | 7286 expected_callback_data); |
| 7255 v8::Context::Scope context_scope(expected_context); | 7287 v8::Context::Scope context_scope(expected_context); |
| 7256 v8::Script::Compile(expected_context, | 7288 v8::Script::Compile(expected_context, |
| 7257 v8_str(isolate, "(function(){debugger;})();")) | 7289 v8_str(isolate, "(function(){debugger;})();")) |
| 7258 .ToLocalChecked() | 7290 .ToLocalChecked() |
| 7259 ->Run(expected_context) | 7291 ->Run(expected_context) |
| 7260 .ToLocalChecked(); | 7292 .ToLocalChecked(); |
| 7261 expected_context.Clear(); | 7293 expected_context.Clear(); |
| 7262 v8::Debug::SetDebugEventListener(NULL); | 7294 v8::Debug::SetDebugEventListener(isolate, nullptr); |
| 7263 expected_context_data = v8::Local<v8::Value>(); | 7295 expected_context_data = v8::Local<v8::Value>(); |
| 7264 CheckDebuggerUnloaded(); | 7296 CheckDebuggerUnloaded(isolate); |
| 7265 } | 7297 } |
| 7266 | 7298 |
| 7267 | 7299 |
| 7268 static bool debug_event_break_deoptimize_done = false; | 7300 static bool debug_event_break_deoptimize_done = false; |
| 7269 | 7301 |
| 7270 static void DebugEventBreakDeoptimize( | 7302 static void DebugEventBreakDeoptimize( |
| 7271 const v8::Debug::EventDetails& event_details) { | 7303 const v8::Debug::EventDetails& event_details) { |
| 7272 v8::DebugEvent event = event_details.GetEvent(); | 7304 v8::DebugEvent event = event_details.GetEvent(); |
| 7273 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); | 7305 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); |
| 7274 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); | 7306 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7310 // Create a function for checking the function when hitting a break point. | 7342 // Create a function for checking the function when hitting a break point. |
| 7311 frame_function_name = CompileFunction(&env, | 7343 frame_function_name = CompileFunction(&env, |
| 7312 frame_function_name_source, | 7344 frame_function_name_source, |
| 7313 "frame_function_name"); | 7345 "frame_function_name"); |
| 7314 | 7346 |
| 7315 // Set a debug event listener which will keep interrupting execution until | 7347 // Set a debug event listener which will keep interrupting execution until |
| 7316 // debug break. When inside function bar it will deoptimize all functions. | 7348 // debug break. When inside function bar it will deoptimize all functions. |
| 7317 // This tests lazy deoptimization bailout for the stack check, as the first | 7349 // This tests lazy deoptimization bailout for the stack check, as the first |
| 7318 // time in function bar when using debug break and no break points will be at | 7350 // time in function bar when using debug break and no break points will be at |
| 7319 // the initial stack check. | 7351 // the initial stack check. |
| 7320 v8::Debug::SetDebugEventListener(DebugEventBreakDeoptimize); | 7352 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 7353 DebugEventBreakDeoptimize); |
| 7321 | 7354 |
| 7322 // Compile and run function bar which will optimize it for some flag settings. | 7355 // Compile and run function bar which will optimize it for some flag settings. |
| 7323 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar"); | 7356 v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar"); |
| 7324 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); | 7357 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); |
| 7325 | 7358 |
| 7326 // Set debug break and call bar again. | 7359 // Set debug break and call bar again. |
| 7327 v8::Debug::DebugBreak(env->GetIsolate()); | 7360 v8::Debug::DebugBreak(env->GetIsolate()); |
| 7328 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); | 7361 f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked(); |
| 7329 | 7362 |
| 7330 CHECK(debug_event_break_deoptimize_done); | 7363 CHECK(debug_event_break_deoptimize_done); |
| 7331 | 7364 |
| 7332 v8::Debug::SetDebugEventListener(NULL); | 7365 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7333 } | 7366 } |
| 7334 | 7367 |
| 7335 | 7368 |
| 7336 static void DebugEventBreakWithOptimizedStack( | 7369 static void DebugEventBreakWithOptimizedStack( |
| 7337 const v8::Debug::EventDetails& event_details) { | 7370 const v8::Debug::EventDetails& event_details) { |
| 7338 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); | 7371 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); |
| 7339 v8::DebugEvent event = event_details.GetEvent(); | 7372 v8::DebugEvent event = event_details.GetEvent(); |
| 7340 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); | 7373 v8::Local<v8::Object> exec_state = event_details.GetExecutionState(); |
| 7341 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 7374 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 7342 if (event == v8::Break) { | 7375 if (event == v8::Break) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7389 .ToLocalChecked(); | 7422 .ToLocalChecked(); |
| 7390 CHECK(result->IsUndefined() || | 7423 CHECK(result->IsUndefined() || |
| 7391 (result->Int32Value(context).FromJust() == 42)); | 7424 (result->Int32Value(context).FromJust() == 42)); |
| 7392 } | 7425 } |
| 7393 } | 7426 } |
| 7394 } | 7427 } |
| 7395 } | 7428 } |
| 7396 | 7429 |
| 7397 | 7430 |
| 7398 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7431 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 7399 v8::Debug::SetDebugEventListener(DebugEventBreakWithOptimizedStack); | 7432 v8::Debug::SetDebugEventListener(args.GetIsolate(), |
| 7433 DebugEventBreakWithOptimizedStack); |
| 7400 v8::Debug::DebugBreak(args.GetIsolate()); | 7434 v8::Debug::DebugBreak(args.GetIsolate()); |
| 7401 } | 7435 } |
| 7402 | 7436 |
| 7403 | 7437 |
| 7404 TEST(DebugBreakStackInspection) { | 7438 TEST(DebugBreakStackInspection) { |
| 7405 DebugLocalContext env; | 7439 DebugLocalContext env; |
| 7406 v8::HandleScope scope(env->GetIsolate()); | 7440 v8::HandleScope scope(env->GetIsolate()); |
| 7407 v8::Local<v8::Context> context = env.context(); | 7441 v8::Local<v8::Context> context = env.context(); |
| 7408 | 7442 |
| 7409 frame_function_name = | 7443 frame_function_name = |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7499 "switch (a) { case 1: continue; break; default: h() }", | 7533 "switch (a) { case 1: continue; break; default: h() }", |
| 7500 NULL}; | 7534 NULL}; |
| 7501 | 7535 |
| 7502 | 7536 |
| 7503 void DebugBreakLoop(const char* loop_header, const char** loop_bodies, | 7537 void DebugBreakLoop(const char* loop_header, const char** loop_bodies, |
| 7504 const char* loop_footer) { | 7538 const char* loop_footer) { |
| 7505 DebugLocalContext env; | 7539 DebugLocalContext env; |
| 7506 v8::HandleScope scope(env->GetIsolate()); | 7540 v8::HandleScope scope(env->GetIsolate()); |
| 7507 | 7541 |
| 7508 // Register a debug event listener which sets the break flag and counts. | 7542 // Register a debug event listener which sets the break flag and counts. |
| 7509 v8::Debug::SetDebugEventListener(DebugEventBreakMax); | 7543 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax); |
| 7510 | 7544 |
| 7511 CompileRun( | 7545 CompileRun( |
| 7512 "var a = 1;\n" | 7546 "var a = 1;\n" |
| 7513 "function g() { }\n" | 7547 "function g() { }\n" |
| 7514 "function h() { }"); | 7548 "function h() { }"); |
| 7515 | 7549 |
| 7516 TestDebugBreakInLoop(loop_header, loop_bodies, loop_footer); | 7550 TestDebugBreakInLoop(loop_header, loop_bodies, loop_footer); |
| 7517 | 7551 |
| 7518 // Get rid of the debug event listener. | 7552 // Get rid of the debug event listener. |
| 7519 v8::Debug::SetDebugEventListener(NULL); | 7553 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7520 CheckDebuggerUnloaded(); | 7554 CheckDebuggerUnloaded(env->GetIsolate()); |
| 7521 } | 7555 } |
| 7522 | 7556 |
| 7523 | 7557 |
| 7524 TEST(DebugBreakInWhileTrue1) { | 7558 TEST(DebugBreakInWhileTrue1) { |
| 7525 DebugBreakLoop("while (true) {", loop_bodies_1, "}"); | 7559 DebugBreakLoop("while (true) {", loop_bodies_1, "}"); |
| 7526 } | 7560 } |
| 7527 | 7561 |
| 7528 | 7562 |
| 7529 TEST(DebugBreakInWhileTrue2) { | 7563 TEST(DebugBreakInWhileTrue2) { |
| 7530 DebugBreakLoop("while (true) {", loop_bodies_2, "}"); | 7564 DebugBreakLoop("while (true) {", loop_bodies_2, "}"); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7603 | 7637 |
| 7604 for (int i = 0; i < frame_count; i++) { | 7638 for (int i = 0; i < frame_count; i++) { |
| 7605 // The 5. element in the returned array of GetFrameDetails contains the | 7639 // The 5. element in the returned array of GetFrameDetails contains the |
| 7606 // source position of that frame. | 7640 // source position of that frame. |
| 7607 SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); | 7641 SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); |
| 7608 v8::Local<v8::Value> result = CompileRun(script); | 7642 v8::Local<v8::Value> result = CompileRun(script); |
| 7609 CHECK_EQ(expected_line_number[i], | 7643 CHECK_EQ(expected_line_number[i], |
| 7610 i::Script::GetLineNumber(source_script, | 7644 i::Script::GetLineNumber(source_script, |
| 7611 result->Int32Value(context).FromJust())); | 7645 result->Int32Value(context).FromJust())); |
| 7612 } | 7646 } |
| 7613 v8::Debug::SetDebugEventListener(NULL); | 7647 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); |
| 7614 CcTest::isolate()->TerminateExecution(); | 7648 CcTest::isolate()->TerminateExecution(); |
| 7615 } | 7649 } |
| 7616 | 7650 |
| 7617 | 7651 |
| 7618 TEST(DebugBreakInline) { | 7652 TEST(DebugBreakInline) { |
| 7619 i::FLAG_allow_natives_syntax = true; | 7653 i::FLAG_allow_natives_syntax = true; |
| 7620 DebugLocalContext env; | 7654 DebugLocalContext env; |
| 7621 v8::HandleScope scope(env->GetIsolate()); | 7655 v8::HandleScope scope(env->GetIsolate()); |
| 7622 v8::Local<v8::Context> context = env.context(); | 7656 v8::Local<v8::Context> context = env.context(); |
| 7623 const char* source = | 7657 const char* source = |
| 7624 "function debug(b) { \n" | 7658 "function debug(b) { \n" |
| 7625 " if (b) debugger; \n" | 7659 " if (b) debugger; \n" |
| 7626 "} \n" | 7660 "} \n" |
| 7627 "function f(b) { \n" | 7661 "function f(b) { \n" |
| 7628 " debug(b) \n" | 7662 " debug(b) \n" |
| 7629 "}; \n" | 7663 "}; \n" |
| 7630 "function g(b) { \n" | 7664 "function g(b) { \n" |
| 7631 " f(b); \n" | 7665 " f(b); \n" |
| 7632 "}; \n" | 7666 "}; \n" |
| 7633 "g(false); \n" | 7667 "g(false); \n" |
| 7634 "g(false); \n" | 7668 "g(false); \n" |
| 7635 "%OptimizeFunctionOnNextCall(g); \n" | 7669 "%OptimizeFunctionOnNextCall(g); \n" |
| 7636 "g(true);"; | 7670 "g(true);"; |
| 7637 v8::Debug::SetDebugEventListener(DebugBreakInlineListener); | 7671 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); |
| 7638 inline_script = | 7672 inline_script = |
| 7639 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) | 7673 v8::Script::Compile(context, v8_str(env->GetIsolate(), source)) |
| 7640 .ToLocalChecked(); | 7674 .ToLocalChecked(); |
| 7641 inline_script->Run(context).ToLocalChecked(); | 7675 inline_script->Run(context).ToLocalChecked(); |
| 7642 } | 7676 } |
| 7643 | 7677 |
| 7644 | 7678 |
| 7645 static void DebugEventStepNext( | 7679 static void DebugEventStepNext( |
| 7646 const v8::Debug::EventDetails& event_details) { | 7680 const v8::Debug::EventDetails& event_details) { |
| 7647 v8::DebugEvent event = event_details.GetEvent(); | 7681 v8::DebugEvent event = event_details.GetEvent(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7662 // Bug description: | 7696 // Bug description: |
| 7663 // When doing StepNext through the first script, the debugger is not reset | 7697 // When doing StepNext through the first script, the debugger is not reset |
| 7664 // after exiting through exception. A flawed implementation enabling the | 7698 // after exiting through exception. A flawed implementation enabling the |
| 7665 // debugger to step into Array.prototype.forEach breaks inside the callback | 7699 // debugger to step into Array.prototype.forEach breaks inside the callback |
| 7666 // for forEach in the second script under the assumption that we are in a | 7700 // for forEach in the second script under the assumption that we are in a |
| 7667 // recursive call. In an attempt to step out, we crawl the stack using the | 7701 // recursive call. In an attempt to step out, we crawl the stack using the |
| 7668 // recorded frame pointer from the first script and fail when not finding it | 7702 // recorded frame pointer from the first script and fail when not finding it |
| 7669 // on the stack. | 7703 // on the stack. |
| 7670 DebugLocalContext env; | 7704 DebugLocalContext env; |
| 7671 v8::HandleScope scope(env->GetIsolate()); | 7705 v8::HandleScope scope(env->GetIsolate()); |
| 7672 v8::Debug::SetDebugEventListener(DebugEventStepNext); | 7706 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepNext); |
| 7673 | 7707 |
| 7674 // We step through the first script. It exits through an exception. We run | 7708 // We step through the first script. It exits through an exception. We run |
| 7675 // this inside a new frame to record a different FP than the second script | 7709 // this inside a new frame to record a different FP than the second script |
| 7676 // would expect. | 7710 // would expect. |
| 7677 const char* script_1 = "debugger; throw new Error();"; | 7711 const char* script_1 = "debugger; throw new Error();"; |
| 7678 RunScriptInANewCFrame(script_1); | 7712 RunScriptInANewCFrame(script_1); |
| 7679 | 7713 |
| 7680 // The second script uses forEach. | 7714 // The second script uses forEach. |
| 7681 const char* script_2 = "[0].forEach(function() { });"; | 7715 const char* script_2 = "[0].forEach(function() { });"; |
| 7682 CompileRun(script_2); | 7716 CompileRun(script_2); |
| 7683 | 7717 |
| 7684 v8::Debug::SetDebugEventListener(NULL); | 7718 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7685 } | 7719 } |
| 7686 | 7720 |
| 7687 | 7721 |
| 7688 // Import from test-heap.cc | 7722 // Import from test-heap.cc |
| 7689 namespace v8 { | 7723 namespace v8 { |
| 7690 namespace internal { | 7724 namespace internal { |
| 7691 | 7725 |
| 7692 int CountNativeContexts(); | 7726 int CountNativeContexts(); |
| 7693 } | 7727 } |
| 7694 } | 7728 } |
| 7695 | 7729 |
| 7696 | 7730 |
| 7697 static void NopListener(const v8::Debug::EventDetails& event_details) { | 7731 static void NopListener(const v8::Debug::EventDetails& event_details) { |
| 7698 } | 7732 } |
| 7699 | 7733 |
| 7700 | 7734 |
| 7701 TEST(DebuggerCreatesContextIffActive) { | 7735 TEST(DebuggerCreatesContextIffActive) { |
| 7702 DebugLocalContext env; | 7736 DebugLocalContext env; |
| 7703 v8::HandleScope scope(env->GetIsolate()); | 7737 v8::HandleScope scope(env->GetIsolate()); |
| 7704 CHECK_EQ(1, v8::internal::CountNativeContexts()); | 7738 CHECK_EQ(1, v8::internal::CountNativeContexts()); |
| 7705 | 7739 |
| 7706 v8::Debug::SetDebugEventListener(NULL); | 7740 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7707 CompileRun("debugger;"); | 7741 CompileRun("debugger;"); |
| 7708 CHECK_EQ(1, v8::internal::CountNativeContexts()); | 7742 CHECK_EQ(1, v8::internal::CountNativeContexts()); |
| 7709 | 7743 |
| 7710 v8::Debug::SetDebugEventListener(NopListener); | 7744 v8::Debug::SetDebugEventListener(env->GetIsolate(), NopListener); |
| 7711 CompileRun("debugger;"); | 7745 CompileRun("debugger;"); |
| 7712 CHECK_EQ(2, v8::internal::CountNativeContexts()); | 7746 CHECK_EQ(2, v8::internal::CountNativeContexts()); |
| 7713 | 7747 |
| 7714 v8::Debug::SetDebugEventListener(NULL); | 7748 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7715 } | 7749 } |
| 7716 | 7750 |
| 7717 | 7751 |
| 7718 TEST(LiveEditEnabled) { | 7752 TEST(LiveEditEnabled) { |
| 7719 v8::internal::FLAG_allow_natives_syntax = true; | 7753 v8::internal::FLAG_allow_natives_syntax = true; |
| 7720 LocalContext env; | 7754 LocalContext env; |
| 7721 v8::HandleScope scope(env->GetIsolate()); | 7755 v8::HandleScope scope(env->GetIsolate()); |
| 7722 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), true); | 7756 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), true); |
| 7723 CompileRun("%LiveEditCompareStrings('', '')"); | 7757 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7724 } | 7758 } |
| 7725 | 7759 |
| 7726 | 7760 |
| 7727 TEST(LiveEditDisabled) { | 7761 TEST(LiveEditDisabled) { |
| 7728 v8::internal::FLAG_allow_natives_syntax = true; | 7762 v8::internal::FLAG_allow_natives_syntax = true; |
| 7729 LocalContext env; | 7763 LocalContext env; |
| 7730 v8::HandleScope scope(env->GetIsolate()); | 7764 v8::HandleScope scope(env->GetIsolate()); |
| 7731 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), false); | 7765 v8::Debug::SetLiveEditEnabled(env->GetIsolate(), false); |
| 7732 CompileRun("%LiveEditCompareStrings('', '')"); | 7766 CompileRun("%LiveEditCompareStrings('', '')"); |
| 7733 } | 7767 } |
| 7734 | 7768 |
| 7735 | 7769 |
| 7736 TEST(PrecompiledFunction) { | 7770 TEST(PrecompiledFunction) { |
| 7737 // Regression test for crbug.com/346207. If we have preparse data, parsing the | 7771 // Regression test for crbug.com/346207. If we have preparse data, parsing the |
| 7738 // function in the presence of the debugger (and breakpoints) should still | 7772 // function in the presence of the debugger (and breakpoints) should still |
| 7739 // succeed. The bug was that preparsing was done lazily and parsing was done | 7773 // succeed. The bug was that preparsing was done lazily and parsing was done |
| 7740 // eagerly, so, the symbol streams didn't match. | 7774 // eagerly, so, the symbol streams didn't match. |
| 7741 DebugLocalContext env; | 7775 DebugLocalContext env; |
| 7742 v8::HandleScope scope(env->GetIsolate()); | 7776 v8::HandleScope scope(env->GetIsolate()); |
| 7743 env.ExposeDebug(); | 7777 env.ExposeDebug(); |
| 7744 v8::Debug::SetDebugEventListener(DebugBreakInlineListener); | 7778 v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener); |
| 7745 | 7779 |
| 7746 v8::Local<v8::Function> break_here = | 7780 v8::Local<v8::Function> break_here = |
| 7747 CompileFunction(&env, "function break_here(){}", "break_here"); | 7781 CompileFunction(&env, "function break_here(){}", "break_here"); |
| 7748 SetBreakPoint(break_here, 0); | 7782 SetBreakPoint(break_here, 0); |
| 7749 | 7783 |
| 7750 const char* source = | 7784 const char* source = |
| 7751 "var a = b = c = 1; \n" | 7785 "var a = b = c = 1; \n" |
| 7752 "function this_is_lazy() { \n" | 7786 "function this_is_lazy() { \n" |
| 7753 // This symbol won't appear in the preparse data. | 7787 // This symbol won't appear in the preparse data. |
| 7754 " var a; \n" | 7788 " var a; \n" |
| 7755 "} \n" | 7789 "} \n" |
| 7756 "function bar() { \n" | 7790 "function bar() { \n" |
| 7757 " return \"bar\"; \n" | 7791 " return \"bar\"; \n" |
| 7758 "}; \n" | 7792 "}; \n" |
| 7759 "a = b = c = 2; \n" | 7793 "a = b = c = 2; \n" |
| 7760 "bar(); \n"; | 7794 "bar(); \n"; |
| 7761 v8::Local<v8::Value> result = ParserCacheCompileRun(source); | 7795 v8::Local<v8::Value> result = ParserCacheCompileRun(source); |
| 7762 CHECK(result->IsString()); | 7796 CHECK(result->IsString()); |
| 7763 v8::String::Utf8Value utf8(result); | 7797 v8::String::Utf8Value utf8(result); |
| 7764 CHECK_EQ(0, strcmp("bar", *utf8)); | 7798 CHECK_EQ(0, strcmp("bar", *utf8)); |
| 7765 | 7799 |
| 7766 v8::Debug::SetDebugEventListener(NULL); | 7800 v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr); |
| 7767 CheckDebuggerUnloaded(); | 7801 CheckDebuggerUnloaded(env->GetIsolate()); |
| 7768 } | 7802 } |
| 7769 | 7803 |
| 7770 | 7804 |
| 7771 static void DebugBreakStackTraceListener( | 7805 static void DebugBreakStackTraceListener( |
| 7772 const v8::Debug::EventDetails& event_details) { | 7806 const v8::Debug::EventDetails& event_details) { |
| 7773 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10); | 7807 v8::StackTrace::CurrentStackTrace(CcTest::isolate(), 10); |
| 7774 } | 7808 } |
| 7775 | 7809 |
| 7776 | 7810 |
| 7777 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7811 static void AddDebugBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 7778 v8::Debug::DebugBreak(args.GetIsolate()); | 7812 v8::Debug::DebugBreak(args.GetIsolate()); |
| 7779 } | 7813 } |
| 7780 | 7814 |
| 7781 | 7815 |
| 7782 TEST(DebugBreakStackTrace) { | 7816 TEST(DebugBreakStackTrace) { |
| 7783 DebugLocalContext env; | 7817 DebugLocalContext env; |
| 7784 v8::HandleScope scope(env->GetIsolate()); | 7818 v8::HandleScope scope(env->GetIsolate()); |
| 7785 v8::Debug::SetDebugEventListener(DebugBreakStackTraceListener); | 7819 v8::Debug::SetDebugEventListener(env->GetIsolate(), |
| 7820 DebugBreakStackTraceListener); |
| 7786 v8::Local<v8::Context> context = env.context(); | 7821 v8::Local<v8::Context> context = env.context(); |
| 7787 v8::Local<v8::FunctionTemplate> add_debug_break_template = | 7822 v8::Local<v8::FunctionTemplate> add_debug_break_template = |
| 7788 v8::FunctionTemplate::New(env->GetIsolate(), AddDebugBreak); | 7823 v8::FunctionTemplate::New(env->GetIsolate(), AddDebugBreak); |
| 7789 v8::Local<v8::Function> add_debug_break = | 7824 v8::Local<v8::Function> add_debug_break = |
| 7790 add_debug_break_template->GetFunction(context).ToLocalChecked(); | 7825 add_debug_break_template->GetFunction(context).ToLocalChecked(); |
| 7791 CHECK(env->Global() | 7826 CHECK(env->Global() |
| 7792 ->Set(context, v8_str("add_debug_break"), add_debug_break) | 7827 ->Set(context, v8_str("add_debug_break"), add_debug_break) |
| 7793 .FromJust()); | 7828 .FromJust()); |
| 7794 | 7829 |
| 7795 CompileRun("(function loop() {" | 7830 CompileRun("(function loop() {" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7830 | 7865 |
| 7831 private: | 7866 private: |
| 7832 v8::Isolate* isolate_; | 7867 v8::Isolate* isolate_; |
| 7833 }; | 7868 }; |
| 7834 | 7869 |
| 7835 | 7870 |
| 7836 TEST(DebugBreakOffThreadTerminate) { | 7871 TEST(DebugBreakOffThreadTerminate) { |
| 7837 DebugLocalContext env; | 7872 DebugLocalContext env; |
| 7838 v8::Isolate* isolate = env->GetIsolate(); | 7873 v8::Isolate* isolate = env->GetIsolate(); |
| 7839 v8::HandleScope scope(isolate); | 7874 v8::HandleScope scope(isolate); |
| 7840 v8::Debug::SetDebugEventListener(DebugBreakTriggerTerminate); | 7875 v8::Debug::SetDebugEventListener(isolate, DebugBreakTriggerTerminate); |
| 7841 TerminationThread terminator(isolate); | 7876 TerminationThread terminator(isolate); |
| 7842 terminator.Start(); | 7877 terminator.Start(); |
| 7843 v8::TryCatch try_catch(env->GetIsolate()); | 7878 v8::TryCatch try_catch(env->GetIsolate()); |
| 7844 v8::Debug::DebugBreak(isolate); | 7879 v8::Debug::DebugBreak(isolate); |
| 7845 CompileRun("while (true);"); | 7880 CompileRun("while (true);"); |
| 7846 CHECK(try_catch.HasTerminated()); | 7881 CHECK(try_catch.HasTerminated()); |
| 7847 } | 7882 } |
| 7848 | 7883 |
| 7849 | 7884 |
| 7850 static void DebugEventExpectNoException( | 7885 static void DebugEventExpectNoException( |
| 7851 const v8::Debug::EventDetails& event_details) { | 7886 const v8::Debug::EventDetails& event_details) { |
| 7852 v8::DebugEvent event = event_details.GetEvent(); | 7887 v8::DebugEvent event = event_details.GetEvent(); |
| 7853 CHECK_NE(v8::Exception, event); | 7888 CHECK_NE(v8::Exception, event); |
| 7854 } | 7889 } |
| 7855 | 7890 |
| 7856 | 7891 |
| 7857 static void TryCatchWrappedThrowCallback( | 7892 static void TryCatchWrappedThrowCallback( |
| 7858 const v8::FunctionCallbackInfo<v8::Value>& args) { | 7893 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 7859 v8::TryCatch try_catch(args.GetIsolate()); | 7894 v8::TryCatch try_catch(args.GetIsolate()); |
| 7860 CompileRun("throw 'rejection';"); | 7895 CompileRun("throw 'rejection';"); |
| 7861 CHECK(try_catch.HasCaught()); | 7896 CHECK(try_catch.HasCaught()); |
| 7862 } | 7897 } |
| 7863 | 7898 |
| 7864 | 7899 |
| 7865 TEST(DebugPromiseInterceptedByTryCatch) { | 7900 TEST(DebugPromiseInterceptedByTryCatch) { |
| 7866 DebugLocalContext env; | 7901 DebugLocalContext env; |
| 7867 v8::Isolate* isolate = env->GetIsolate(); | 7902 v8::Isolate* isolate = env->GetIsolate(); |
| 7868 v8::HandleScope scope(isolate); | 7903 v8::HandleScope scope(isolate); |
| 7869 v8::Debug::SetDebugEventListener(&DebugEventExpectNoException); | 7904 v8::Debug::SetDebugEventListener(isolate, &DebugEventExpectNoException); |
| 7870 v8::Local<v8::Context> context = env.context(); | 7905 v8::Local<v8::Context> context = env.context(); |
| 7871 ChangeBreakOnException(false, true); | 7906 ChangeBreakOnException(false, true); |
| 7872 | 7907 |
| 7873 v8::Local<v8::FunctionTemplate> fun = | 7908 v8::Local<v8::FunctionTemplate> fun = |
| 7874 v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback); | 7909 v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback); |
| 7875 CHECK(env->Global() | 7910 CHECK(env->Global() |
| 7876 ->Set(context, v8_str("fun"), | 7911 ->Set(context, v8_str("fun"), |
| 7877 fun->GetFunction(context).ToLocalChecked()) | 7912 fun->GetFunction(context).ToLocalChecked()) |
| 7878 .FromJust()); | 7913 .FromJust()); |
| 7879 | 7914 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 7898 | 7933 |
| 7899 static void ThrowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7934 static void ThrowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 7900 CompileRun("throw 'rejection';"); | 7935 CompileRun("throw 'rejection';"); |
| 7901 } | 7936 } |
| 7902 | 7937 |
| 7903 | 7938 |
| 7904 TEST(DebugPromiseRejectedByCallback) { | 7939 TEST(DebugPromiseRejectedByCallback) { |
| 7905 DebugLocalContext env; | 7940 DebugLocalContext env; |
| 7906 v8::Isolate* isolate = env->GetIsolate(); | 7941 v8::Isolate* isolate = env->GetIsolate(); |
| 7907 v8::HandleScope scope(isolate); | 7942 v8::HandleScope scope(isolate); |
| 7908 v8::Debug::SetDebugEventListener(&DebugEventCountException); | 7943 v8::Debug::SetDebugEventListener(isolate, &DebugEventCountException); |
| 7909 v8::Local<v8::Context> context = env.context(); | 7944 v8::Local<v8::Context> context = env.context(); |
| 7910 ChangeBreakOnException(false, true); | 7945 ChangeBreakOnException(false, true); |
| 7911 exception_event_counter = 0; | 7946 exception_event_counter = 0; |
| 7912 | 7947 |
| 7913 v8::Local<v8::FunctionTemplate> fun = | 7948 v8::Local<v8::FunctionTemplate> fun = |
| 7914 v8::FunctionTemplate::New(isolate, ThrowCallback); | 7949 v8::FunctionTemplate::New(isolate, ThrowCallback); |
| 7915 CHECK(env->Global() | 7950 CHECK(env->Global() |
| 7916 ->Set(context, v8_str("fun"), | 7951 ->Set(context, v8_str("fun"), |
| 7917 fun->GetFunction(context).ToLocalChecked()) | 7952 fun->GetFunction(context).ToLocalChecked()) |
| 7918 .FromJust()); | 7953 .FromJust()); |
| 7919 | 7954 |
| 7920 CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });"); | 7955 CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });"); |
| 7921 CompileRun( | 7956 CompileRun( |
| 7922 "var r;" | 7957 "var r;" |
| 7923 "p.chain(function() { r = 'resolved'; }," | 7958 "p.chain(function() { r = 'resolved'; }," |
| 7924 " function(e) { r = 'rejected' + e; });"); | 7959 " function(e) { r = 'rejected' + e; });"); |
| 7925 CHECK( | 7960 CHECK( |
| 7926 CompileRun("r")->Equals(context, v8_str("rejectedrejection")).FromJust()); | 7961 CompileRun("r")->Equals(context, v8_str("rejectedrejection")).FromJust()); |
| 7927 CHECK_EQ(1, exception_event_counter); | 7962 CHECK_EQ(1, exception_event_counter); |
| 7928 } | 7963 } |
| 7929 | 7964 |
| 7930 | 7965 |
| 7931 TEST(DebugBreakOnExceptionInObserveCallback) { | 7966 TEST(DebugBreakOnExceptionInObserveCallback) { |
| 7932 DebugLocalContext env; | 7967 DebugLocalContext env; |
| 7933 v8::Isolate* isolate = env->GetIsolate(); | 7968 v8::Isolate* isolate = env->GetIsolate(); |
| 7934 v8::HandleScope scope(isolate); | 7969 v8::HandleScope scope(isolate); |
| 7935 v8::Debug::SetDebugEventListener(&DebugEventCountException); | 7970 v8::Debug::SetDebugEventListener(isolate, &DebugEventCountException); |
| 7936 v8::Local<v8::Context> context = env.context(); | 7971 v8::Local<v8::Context> context = env.context(); |
| 7937 // Break on uncaught exception | 7972 // Break on uncaught exception |
| 7938 ChangeBreakOnException(false, true); | 7973 ChangeBreakOnException(false, true); |
| 7939 exception_event_counter = 0; | 7974 exception_event_counter = 0; |
| 7940 | 7975 |
| 7941 v8::Local<v8::FunctionTemplate> fun = | 7976 v8::Local<v8::FunctionTemplate> fun = |
| 7942 v8::FunctionTemplate::New(isolate, ThrowCallback); | 7977 v8::FunctionTemplate::New(isolate, ThrowCallback); |
| 7943 CHECK(env->Global() | 7978 CHECK(env->Global() |
| 7944 ->Set(context, v8_str("fun"), | 7979 ->Set(context, v8_str("fun"), |
| 7945 fun->GetFunction(context).ToLocalChecked()) | 7980 fun->GetFunction(context).ToLocalChecked()) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7989 ExpectInt32("frame.evaluate('x + y').value_", 11); | 8024 ExpectInt32("frame.evaluate('x + y').value_", 11); |
| 7990 } | 8025 } |
| 7991 | 8026 |
| 7992 | 8027 |
| 7993 TEST(DebugBreakInLexicalScopes) { | 8028 TEST(DebugBreakInLexicalScopes) { |
| 7994 i::FLAG_allow_natives_syntax = true; | 8029 i::FLAG_allow_natives_syntax = true; |
| 7995 | 8030 |
| 7996 DebugLocalContext env; | 8031 DebugLocalContext env; |
| 7997 v8::Isolate* isolate = env->GetIsolate(); | 8032 v8::Isolate* isolate = env->GetIsolate(); |
| 7998 v8::HandleScope scope(isolate); | 8033 v8::HandleScope scope(isolate); |
| 7999 v8::Debug::SetDebugEventListener(DebugHarmonyScopingListener); | 8034 v8::Debug::SetDebugEventListener(isolate, DebugHarmonyScopingListener); |
| 8000 | 8035 |
| 8001 CompileRun( | 8036 CompileRun( |
| 8002 "'use strict'; \n" | 8037 "'use strict'; \n" |
| 8003 "let x = 1; \n"); | 8038 "let x = 1; \n"); |
| 8004 ExpectInt32( | 8039 ExpectInt32( |
| 8005 "'use strict'; \n" | 8040 "'use strict'; \n" |
| 8006 "let y = 2; \n" | 8041 "let y = 2; \n" |
| 8007 "debugger; \n" | 8042 "debugger; \n" |
| 8008 "x * y", | 8043 "x * y", |
| 8009 30); | 8044 30); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 8027 CHECK(after_compile_handler_depth <= 1); | 8062 CHECK(after_compile_handler_depth <= 1); |
| 8028 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); | 8063 v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); |
| 8029 isolate->RequestInterrupt(&HandleInterrupt, nullptr); | 8064 isolate->RequestInterrupt(&HandleInterrupt, nullptr); |
| 8030 CompileRun("function foo() {}; foo();"); | 8065 CompileRun("function foo() {}; foo();"); |
| 8031 --after_compile_handler_depth; | 8066 --after_compile_handler_depth; |
| 8032 } | 8067 } |
| 8033 | 8068 |
| 8034 | 8069 |
| 8035 TEST(NoInterruptsInDebugListener) { | 8070 TEST(NoInterruptsInDebugListener) { |
| 8036 DebugLocalContext env; | 8071 DebugLocalContext env; |
| 8037 v8::Debug::SetDebugEventListener(NoInterruptsOnDebugEvent); | 8072 v8::Debug::SetDebugEventListener(env->GetIsolate(), NoInterruptsOnDebugEvent); |
| 8038 CompileRun("void(0);"); | 8073 CompileRun("void(0);"); |
| 8039 } | 8074 } |
| OLD | NEW |